Hallo, ich dreh bald komplett durch... Hatte versucht ein 74HC595 per SPI zu nutzen um eine RGB led zu betreiben... Hab das ganze erstmal aufgegeben da ich komplett RANDOM USCIAB0RX und TX interrupts bekommen habe. Nun habe ich alle USCI Spuren aus meinem Code entfernt. Jetzt ist mein IC stuck im USCIAB0RX_VECTOR interrupt. was is da los?!?!??!?!?!??!?!??!?!?!??!?!
Chris D. schrieb: > was is da los?!?!??!?!?!??!?!??!?!?!??!?! Du hast nicht den Hauch einer Ahnung, von dem, was du da zu tun versuchst. Das ist da los. Das geht C&P-"Programmierern" des öfteren so. Also: alles im Grünen Bereich...
c-hater schrieb: > Das geht C&P-"Programmierern" des öfteren so. Also: alles im Grünen > Bereich... ?
c-hater (Gast) Du bist schon ein ganz toller Typ... Im Internet große Fresse...
Chris D. schrieb: > c-hater (Gast) Du bist schon ein ganz toller Typ... > > Im Internet große Fresse... Fragt der jenige, der mit gaaanz vielen Satzzeichen ein Problem mit seiner Software sucht, aber nicht mal eine einzige Zeile seines Codes veröffentlicht. Ohne diese Infos kann ich c-hater mit seinem Kommentar durchaus verstehen. - Er ist halt eher der direkte Typ. Und Salami-Taktik ist hier im Konsens halt unerwünscht...
Chris D. schrieb: > Im Internet große Fresse... Na ja, würde ich nicht so sagen. Denn Assembler kann er.
Chris D. schrieb: > Hatte versucht ein 74HC595 per SPI zu nutzen um eine RGB led zu > betreiben... Ja und wo ist da ein Problem? Hast Du es anfangs mal ohne Interupt getestet? Lief es da? Dann setz dort wieder auf. mfg Klaus
"Hast Du es anfangs mal ohne Interupt getestet?" Ganeu das ist mein Problem... Wie werd ich den Interrupt los. Habe den code gelöscht... /* Disable USCI */ UCB0CTL1 |= UCSWRST; UCB0CTL0 = UCCKPH | UCMST | UCMODE_0 | UCSYNC; UCB0CTL1 = UCSSEL_1 | UCSWRST; UCB0BR0 = 1; /* Enable USCI */ UCB0CTL1 &= ~UCSWRST; __attribute__((interrupt(TIMER1_A0_VECTOR))) void TIMER1_A0_ISR_HOOK(void) { IE2 |= UCA0TXIE; } __attribute__((interrupt(USCIAB0TX_VECTOR))) void USCI0TX_ISR_HOOK(void) { buffer füllen und IE2 &= ~UCA0TXIE; } das stand da ungefähr... Nur verstehe ich nicht wiso der RX interrupt kommt da der pin nicht auf MISO konfiguriert ist... Er kommt selbst wenn ich im Code nix vom USCI benutze.
:
Bearbeitet durch User
Chris D. schrieb: > Wie werd ich den Interrupt los. // Manuelle Methode cli(); // Interrupts abschalten port |= 0x03; sei(); // Interrupts wieder einschalten https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Das ist mein Problem. Wenn ich den UCB nicht benutze warum sind die Register auf 1? Kann es sein das der TX buffer im Auslieferungszustand gefüllt ist?
:
Bearbeitet durch User
Chris D. schrieb: > Was soll ich mit port |= 0x03; anfangen????????? Das war ein Beispiel wie man Interrupts ein und ausschaltet.
F. F. schrieb: > Chris D. schrieb: >> Was soll ich mit port |= 0x03; anfangen????????? > > Das war ein Beispiel wie man Interrupts ein und ausschaltet. also wie ich ADC/TIMER/DCO/COMP/HW_PWM/LMPx benutze weiß ich... Ich verstehe nur nicht warum der Tx/Rx Interrupt vom USCI immer wieder an ist obwohl ich den USCI nicht benutze.
Hallo Chris, das UCA0TXIE-Bit im Register IE2 muß nach einem Reset auf 0 sein, also gehe im Single-step durch den Code, und schau nach, welche Zeile Deines Codes dieses Bit auf 1 setzt und bearbeite diese Zeile entsprechend. Die Flags im Register IFG2 sind dann egal, wenn keine Interrups eingeschaltet sind. Gruß wv
Sodele... nach langem gebastel hab das 74HC595 zumindest per bitbang spi zum laufen bekommen... Der Random Interrupt is weg. Nur leider will HW-SPI immer noch nicht:
1 | void WriteData(unsigned char data) { |
2 | UCB0TXBUF = data; |
3 | while (!(IFG2 & UCA0TXIFG)) |
4 | ;
|
5 | P3OUT |= STCP; |
6 | P3OUT &= ~STCP; |
7 | }
|
8 | |
9 | void initSR(void) { |
10 | |
11 | UCB0CTL1 |= UCSWRST; |
12 | // setup UCB0
|
13 | P1SEL |= SHCP + DS; // pins 5 + 7 |
14 | P1SEL2 |= SHCP + DS; // UCB0CLK + UCB0SIMO |
15 | UCB0CTL0 = UCCKPH + UCCKPL + UCMST + UCSYNC; // data captured on 1st UCLK edge/changed on follwing edge, MSB first, master, 3-pin SPI,synchronous |
16 | // UCB0CTL0 &= ~(UCCKPH);
|
17 | |
18 | UCB0CTL1 |= UCSSEL_1; // SMCLK |
19 | UCB0BR0 |= 0x01; // 1:1 |
20 | UCB0BR1 = 0; |
21 | UCB0CTL1 &= ~UCSWRST; // clear SW |
22 | |
23 | P3OUT &= ~STCP; |
24 | |
25 | WriteData(0b00111100); |
26 | }
|
Und ja der Code ist zum teil aus irgenwelche Threads raus kopiert da mein eigenes Zeug ja auch nur rumgesponnen hat. ich glaube ich bin einfach blind und übersehe irgendewas dummes.
Teste SPI doch mal mit reinem TI Sample-Code. Der läuft doch immer. Wenn nicht, dann liegt es nicht am Code. Nach dem Motto: zurück zu den roots.? mfg Klaus
Hab es am laufen:-) War irgendein dummer dreher in der ganzen SPI+Shiftregister logic... Hab dann jetz auch noch nen Software Pwm mit laufen und bis jetz geht es. LG
Chris D. schrieb: > Hab es am laufen:-) > > War irgendein dummer dreher in der ganzen SPI+Shiftregister logic... > > Hab dann jetz auch noch nen Software Pwm mit laufen und bis jetz geht > es. > > LG Danke für die Rückmeldung. ;) Erfolgsmeldungen nach Behebung (ob mit oder Beteiligung des Forums) sieht man leider zu wenig.
Hallo Chris, in der Zeile while (!(IFG2 & UCA0TXIFG)) beobachtest Du das falsche Flag, Du benutzt UCB0. Außerdem gibt es dafür das Busy-Flag im Register UCB0STAT also besser while(UCB0STAT & UCBUSY); und dahinter besser noch ein _nop(); damit zwischen dem letzten Sendebit und dem Strobe eine minimale Pause entsteht. Dann nimm mal bei der Initialisiierung den UCCKPL raus. Das Bit würde den Clock invertieren. Welche Bitrate willst Du eigentlich einstellen? UCSSEL_1 --> ACLK UCSSEL_2 --> SMCLK wenn Du also SMCLK willst, muß die Zeile UCB0CTL1 = UCSSEL_2 | UCSWRST; (damit der Reset noch erhalten bleibt) 0x01 im UCB0BR0 ist unzulässig, setz das mal auf 0x02 oder 0x04 Die Zeile P3OUT &= ~STCP; ist wirkungslos, da der Pin nicht als GPIO konfiguriert ist, kannst Du streichen. Gruß wv
Moin, das mit der falschen Flag is vom rein kopieren ins Forum, hatte den USCI krams zu dem Zeitpunkt nich mehr im code:D Das mit dem P3OUT war aus Verzweiflung da mal mit drinn. Wusste nicht mehr weiter^^ Der Tip mit dem nop is super!
1 | /* Disable USCI */
|
2 | UCB0CTL1 |= UCSWRST; |
3 | |
4 | P1SEL |= SHCP + DS; // UCB0CLK + UCB0SIMO |
5 | P1SEL2 |= SHCP + DS; // UCB0CLK + UCB0SIMO |
6 | |
7 | UCB0CTL0 = UCCKPH | UCMSB | UCMST | UCMODE_0 | UCSYNC; |
8 | UCB0CTL1 = UCSSEL_2 | UCSWRST; |
9 | |
10 | /* Bit Rate Control Register 0 */
|
11 | UCB0BR0 = 8; |
12 | |
13 | /* Enable USCI */
|
14 | UCB0CTL1 &= ~UCSWRST; |
Chris D. schrieb: > Der Tip mit dem nop is super! Also scheint bei Dir alles so zu laufen wie Du es gewollt hast.? Ich würde mir gerne den ganzen Code mal anschauen. Habe zwar schon länger nichts mit dem MSP430G2553 gemacht, aber interessieren würde es mich schon und bestimmt auch andere. mfg Klaus
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.