MSP430 USI Initialisierung

Ein kleines Test-Programm in dem die USI-Schnittstelle vom MSP430 initialisiert und genutzt wird. Ein Zähler wird in einer Schleife durchgehend inkrementiert und der aktuelle Zähler-Wert an das Schieberegister gesendet (und per LEDs angezeigt (Binär Format, 8bit -> 0 bis 255)). Somit lassen sich Daten mit sehr wenig Aufwand seriell verschicken.

Das 8bit-Schieberegister braucht insgesamt 3 Ports -> Strobe, Clock, Data (und Output-Enable, bleibt hier durchgehend auf high). Das Strobe-Register übernimmt die Daten von dem Schieberegister und setzt entsprechend die Ausgänge (wenn Output-Enable=H). Somit lässt sich der Schiebeprozess bei einer langsamen Taktrate verschleiern (Flackern der LEDs z.B.). “Data” ist der Dateneingang und “Clock” der Clock-Eingang. Immer wenn Clock auf “H” steht, wird das Bit vom Data-Port übernommen (0 oder 1) bzw. in das Schieberegister “geschoben”.

Verwendetes Schieberegister: CD4094BCN (besser HC(T)-Technologie benutzen)

Video

Schaltplan

usi_shift

C-Programm

FILE: main.c

  1. /*************************************************
  2.  *     ___       _             _    
  3.  *    |   |_ _ _| |___ ___   _| |___
  4.  *    | | |_'_| . | -_|  _|_| . | -_|
  5.  *    |___|_,_|___|___|___|_|___|___|
  6.  *
  7.  * FILE:     main.c
  8.  * Author:   declis (xdec.de)
  9.  ************************************************/
  10.  
  11. #include <msp430g2231.h>
  12. #define strobe BIT7
  13. #define sec 100
  14.  
  15. void main(void)
  16. {
  17.     volatile unsigned char counter=0;
  18.     volatile short m_sec=sec;
  19.  
  20.     WDTCTL=WDTPW+WDTHOLD;
  21.     BCSCTL1=CALBC1_1MHZ;
  22.     DCOCTL=CALDCO_1MHZ;
  23.  
  24.     P1DIR|=strobe;              //P1.7=Strobe (output)
  25.     P1OUT&=~strobe;             //clean P1.7
  26.     // SPI Master Mode
  27.     // USI SDO enabled, USI SCLK enabled, LSB first, Data output enabled
  28.     // USI held in reset state
  29.     USICTL0|=USIPE6+USIPE5+USIMST+USILSB+USIOE+USISWRST;
  30.     // Data is captured on first SCLK edge, changed on the following edge
  31.     // USI counter interrupt enabled
  32.     USICTL1|=USICKPH+USIIE;
  33.     // clock source = SMCLK = 1MHz
  34.     USICKCTL|=USISSEL_2;
  35.     // USI released for operation
  36.     USICTL0&=~USISWRST;
  37.     // clean counter IFG
  38.     USICTL1&=~USIIFG;
  39.     _EINT();
  40.  
  41.     while(1)
  42.     {
  43.         USISRL=counter++;       // 8bit shift register (low byte)=counter (0x00-0xFF)
  44.         while(USICTL1&USIIFG);  // wait for active transmission
  45.         USICNT=8;               // start transmission (8bit)
  46.  
  47.         while(m_sec--)
  48.             __delay_cycles(1000);
  49.  
  50.         m_sec=sec;
  51.     }
  52. }
  53.  
  54. #pragma INTERRUPT (USI)
  55. #pragma vector=USI_VECTOR
  56. void USI(void)
  57. {
  58.     P1OUT|=strobe;      // enable strobe register
  59.     P1OUT&=~strobe;
  60.     USICTL1&=~USIIFG;   // reset USI counter IFG
  61. }
/*************************************************
 *     ___       _             _     
 *    |   |_ _ _| |___ ___   _| |___
 *    | | |_'_| . | -_|  _|_| . | -_|
 *    |___|_,_|___|___|___|_|___|___|
 *
 * FILE:     main.c
 * Author:   declis (xdec.de)
 ************************************************/

#include <msp430g2231.h>
#define strobe BIT7
#define sec 100

void main(void)
{
    volatile unsigned char counter=0;
    volatile short m_sec=sec;

    WDTCTL=WDTPW+WDTHOLD;
    BCSCTL1=CALBC1_1MHZ;
    DCOCTL=CALDCO_1MHZ;

    P1DIR|=strobe;              //P1.7=Strobe (output)
    P1OUT&=~strobe;             //clean P1.7
    // SPI Master Mode
    // USI SDO enabled, USI SCLK enabled, LSB first, Data output enabled
    // USI held in reset state
    USICTL0|=USIPE6+USIPE5+USIMST+USILSB+USIOE+USISWRST;
    // Data is captured on first SCLK edge, changed on the following edge
    // USI counter interrupt enabled
    USICTL1|=USICKPH+USIIE;
    // clock source = SMCLK = 1MHz
    USICKCTL|=USISSEL_2;
    // USI released for operation
    USICTL0&=~USISWRST;
    // clean counter IFG
    USICTL1&=~USIIFG;
    _EINT();

    while(1)
    {
        USISRL=counter++;       // 8bit shift register (low byte)=counter (0x00-0xFF)
        while(USICTL1&USIIFG);  // wait for active transmission
        USICNT=8;               // start transmission (8bit)

        while(m_sec--)
            __delay_cycles(1000);

        m_sec=sec;
    }
}

#pragma INTERRUPT (USI)
#pragma vector=USI_VECTOR
void USI(void)
{
    P1OUT|=strobe;      // enable strobe register
    P1OUT&=~strobe;
    USICTL1&=~USIIFG;   // reset USI counter IFG
}

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.