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.
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
19. Januar 2015 um 00:50
Very shortly this site will be famous amid all blog visitors, due to it’s pleasant articles or reviews