MSP430G2553 USCI interrupt

OP #6300649
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?!?!??!?!?!??!?!??!?!?!??!?!
#6300719
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...
OP #6300734
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.
Gast #6301428
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
OP #6303409
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.
Gast #6303759
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
OP #6304487
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren