Heute habe ich den MSP430 nach der Sommerpause reaktiviert. Erschreckenderweise habe ich viel vergessen und musste mich erst mal mit totalen Basics beschäftigen. Dazu gehört auch der Einsatz eines Shiftregisters.Shift Register Example


Ich wollte dabei insbesondere die reine Funktionsweise selbst programmieren um es besser zu verstehen. Zunächst habe ich mir nochmal das Video (das beste Video zum Thema Shift Register) angeschaut.

Nachdem ich verstanden hatte was gemacht werden muss setzte ich es für den MSP Stück für Stück um.

Als erstes habe ich mit #define die Pins definiert an denen die jeweiligen Pins des Shiftregisters liegen.

#define CLOCKPIN BIT0
#define LATCHPIN BIT1
#define DATAIN BIT2

Dann habe ich die Variablen definiert. Man kann in der For Schleife nicht direct ein int vor das i setzen. Das gibt einen Fehler, da dies bei C nicht geht. Erst ab C++. Die Variable ticks erstellt ein Array, welches ich verwendet habe, um zu verstehen welche Ergebnisse diese Bizarre Formel ausgibt. Das ist für die reine Funktion des Shiftregisters nicht nötig, aber interessant.

int i;// variable for the for loop
int ticks[8]; //only needed to see what the bizarre (val & (1 << i)) in the shiftOut method does

Hier startest die Funktion die ich erstellt habe um das Shiftregister anzusprechen. Jeder Schritt den ich in dem Video gelernt habe wird hier nacheinander ausgeführt. Das Aufbröseln der einzelnen Bits aus der Zahl die ich an die Funktion übergebe übernimmt die schlecht lesbare Formel

(val & (1 << i))

Die habe ich auch schon in einem anderen Beitrag erklärt.

http://www.tns-labs.org/kryptische-codezeilen-entkryptisiert-heute-pinwritedata-val-1/

void shiftOut(int val){ //the shiftOut method to make it easier to send values to the shiftregister it contains all needed steps, and takes an eight 
bit value (0 to 255)
 P2OUT &= ~LATCHPIN; //make sure the Latch Pin is low
 for(i = 0; i < 8; i++) //start a loop with 8 steps from zero to eight
 {
 if((val & (1 << i))!= 0) //check if the bit at position "i" is zero or not
 {
 P2OUT |= DATAIN; //if not it should send a high to the shift register
 }
 else
 {
 P2OUT &= ~DATAIN;//if its zero send a low to the shift register
 }
 ticks[i] = val & (1 << i); //feed the array "ticks" with the result of the operation that we did in the if loop to see what happens there
 P2OUT |= CLOCKPIN; //Clockpin high
 P2OUT &= ~CLOCKPIN; // and then low to push the value to the register.
 }
 P2OUT |= LATCHPIN; //pulse the latchpin to
 P2OUT &= ~LATCHPIN; //send all eight states to the register
 }

In der Main Methode werden die Pins konfiguriert, und ein Beispielwert an das Register übergeben.
Das ist auch schon alles.

int main(void) {
 WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
 P2OUT = 0x00; //switch all P2 Ports off
 P2DIR = 0x07; //put P2.0, 2.1 and 2.2 to outputs
 
 shiftOut(149); //this starts the shift register with the given value
 while(1){} //endless loop
}

Hier ist der Code:shiftregisterexample.c