Forum: Mikrocontroller und Digitale Elektronik MSP430G2553 USCI interrupt


von Chris D. (d3_m0n)


Lesenswert?

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?!?!??!?!?!??!?!??!?!?!??!?!

von c-hater (Gast)


Lesenswert?

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...

von F. F. (foldi)


Lesenswert?

c-hater schrieb:
> Das geht C&P-"Programmierern" des öfteren so. Also: alles im Grünen
> Bereich...

?

von Chris D. (d3_m0n)


Lesenswert?

c-hater (Gast) Du bist schon ein ganz toller Typ...

Im Internet große Fresse...

von M. P. (phpmysqlfreak)


Lesenswert?

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...

von F. F. (foldi)


Lesenswert?

Chris D. schrieb:
> Im Internet große Fresse...

Na ja, würde ich nicht so sagen. Denn Assembler kann er.

von Klaus R. (klara)


Lesenswert?

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

von Chris D. (d3_m0n)


Lesenswert?

"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
von F. F. (foldi)


Lesenswert?

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

von Chris D. (d3_m0n)


Lesenswert?

Was soll ich mit port |= 0x03; anfangen?????????

von Chris D. (d3_m0n)


Angehängte Dateien:

Lesenswert?

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
von F. F. (foldi)


Lesenswert?

Chris D. schrieb:
> Was soll ich mit port |= 0x03; anfangen?????????

Das war ein Beispiel wie man Interrupts ein und ausschaltet.

von Chris D. (d3_m0n)


Lesenswert?

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.

von wv (Gast)


Lesenswert?

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

von Chris D. (d3_m0n)


Lesenswert?

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.

von Klaus R. (klara)


Lesenswert?

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

von Chris D. (d3_m0n)


Lesenswert?

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

von M. P. (phpmysqlfreak)


Lesenswert?

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.

von wv (Gast)


Lesenswert?

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

von Chris D. (d3_m0n)


Lesenswert?

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;

von Klaus R. (klara)


Lesenswert?

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
Noch kein Account? Hier anmelden.