Forum: Mikrocontroller und Digitale Elektronik MSP430G2553 USCI interrupt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Chris D. (d3_m0n)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

?

von Chris D. (d3_m0n)


Bewertung
-3 lesenswert
nicht lesenswert
c-hater (Gast) Du bist schon ein ganz toller Typ...

Im Internet große Fresse...

von M. P. (phpmysqlfreak)


Bewertung
2 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht lesenswert
Was soll ich mit port |= 0x03; anfangen?????????

von Chris D. (d3_m0n)


Angehängte Dateien:

Bewertung
-2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.