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
C-Programm
FILE: main.c
- /*************************************************
- * ___ _ _
- * | |_ _ _| |___ ___ _| |___
- * | | |_'_| . | -_| _|_| . | -_|
- * |___|_,_|___|___|___|_|___|___|
- *
- * 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
- }
/************************************************* * ___ _ _ * | |_ _ _| |___ ___ _| |___ * | | |_'_| . | -_| _|_| . | -_| * |___|_,_|___|___|___|_|___|___| * * 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 }