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
}