Hallo Zusammen
Ich versuche mich seit Montag Morgen mit den 144 Stück WS2812b LEDs und
einem MSP430G2553.
Dieses Projekt ist ein Teilprojekt eines Grösseren...
Naja wen das dann klappen sollte.
https://www.mikrocontroller.net/articles/WS2812_Ansteuerung
Die LEDs brauchen ein Signal von 800kHz, meines schwankt zwischen 793
kHz und 813 kHz. Was meines erachten genug genau ist.
Das ich nicht all zu viel Zeit verliere dachte ich, versuche ich mich
mit Interrupts.
Soweit so klar, mein erster Interrupt funktioniert Yeaaass
Nun möchte ich aber zuerst nur die ersten 8 Bits ausgeben.
Als Versuch und Kontrolle.
Leider bekomme ich 12 Bits auf dem Oszilloskop über, was natürlich nicht
sehr nützlich ist. (Bild im Anhang)
Sieht jemanden den Fehler, oder sind 800kHz zu schnell mit diesem
Ansatz?
Meine Programmierstruktur lässt wünschen übrig, hoffe jedoch das es
verständlich aufgebaut ist.
edit Richtiges Bild angehängt
1 | #include <msp430.h>
|
2 |
|
3 | #define LED BIT6
|
4 | #define LED_TH 7
|
5 | #define LED_TL 3
|
6 | #define LED_ON 19
|
7 |
|
8 | unsigned int i = 0;
|
9 |
|
10 |
|
11 | #pragma vector=TIMER0_A0_VECTOR;
|
12 | __interrupt void LED_print() //Profisorische Datenübergabe Bitweise, LED_TH oder LED_TL setzen
|
13 | {
|
14 | i++;
|
15 |
|
16 | if(i<=8)
|
17 | {
|
18 | TA0CCR1 = LED_TH;
|
19 | }
|
20 | if(i>=8)
|
21 | TA0CCR0 = 0;
|
22 | }
|
23 |
|
24 |
|
25 | int main(void)
|
26 | {
|
27 | // INIT // //----------------------------------------------------------------------------//
|
28 |
|
29 | WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
|
30 |
|
31 | DCOCTL = CALDCO_16MHZ; //MSP auf 16mHz
|
32 | BCSCTL1 = CALBC1_16MHZ;
|
33 |
|
34 | __enable_interrupt(); //interrupts aktivieren
|
35 |
|
36 | P1OUT = 0;
|
37 | P1DIR = LED; //LED OUTPUT
|
38 | P1SEL = LED; //LED Quelle Auswählen
|
39 | P1SEL2 =~LED;
|
40 |
|
41 | TA0CTL = TASSEL_2 | ID_0 | TACLR; //Quelle auf SMCKL, 16mHz/0 = 16 mHz, Zähler in UP Mode
|
42 | TA0CCTL0 = TAIE | CCIE | TAIFG | CCIFG; //Interrup einstellen, Capter Compar Interup enable
|
43 | TA0CCTL1 |= OUTMOD_7; //Output Mode LOW als wen Aus!!
|
44 | TA0CCR0 = LED_ON; //Zeit EInstellen LED ON = 18 = 813kHz
|
45 | TA0CTL |= MC_1;
|
46 |
|
47 |
|
48 | while(1);
|
49 | }
|
edit Richtiges Bild angehängt