Hi zusammen, ich spiele gerade mit einer WS2812 LED rum und habe mir dazu das eZ430-F2013 Kit aus der Bastelkiste gekramt. Zum ansteuern der LED brauche ich ein genaues timing, dass ich mit einem Bit-Banging Protokoll umsetzen wollte, da es bei anderen methoden wohl immer wieder zu Problemen gekommen ist. Ich möchte also den MSP430F2013 mit 16Mhz betreiben, und wenn ich das dem Userguide und Datenblatt richtig entnehmen, müsste das hier dafür ausreichen:
1 | WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer |
2 | BCSCTL1 = CALBC1_16MHZ; |
3 | DCOCTL = CALDCO_16MHZ; //Set clock to 16MHz |
Da das Bit-Banging jedoch nicht so gut geklappt hat, und ich an der Hardware keine Probleme feststellen konnte, wollte ich mal überprüfen, ob der uC tatsächlich mit 16Mhz läuft. Ich habe dazu diesen code eingebaut:
1 | P1OUT = 0x01; //LED ON |
2 | unsigned long i = 0; |
3 | for(i = 0; i < 2285714; ++i) //1s loop, 7cycles per loop |
4 | _NOP(); |
5 | for(i = 0; i < 2285714; ++i) |
6 | _NOP(); |
7 | for(i = 0; i < 2285714; ++i) |
8 | _NOP(); |
9 | for(i = 0; i < 2285714; ++i) |
10 | _NOP(); |
11 | for(i = 0; i < 2285714; ++i) |
12 | _NOP(); |
13 | P1OUT &= ~(0x01); ///LED OFF after 5s |
Die idee ist, dass ein Schleifen durchlauf laut Code Composer Studio Debugger genau 7 cycles braucht, also dürften 2285714 durchläufe fast genau eine Sekunde dauern. Die LED sollte also ca. 5 Sekunden leuchten. Dies ist jedoch bei weitem nicht der Fall, im Release modus ohne verbundenen Debugger dauerts ca. 11 Sekunden, mit Debugger konnte ich garnicht so lange warten, bis die LED wieder aus ging. Ich habe leider kein Oszi zu Hause womit ich die Clock-Frequency testen könnte, deswegen bleibt mir keine alternative. Hat jemand eine Idee, woran das liegen könnte? MfG