MSP430F5438: Probleme mit mehreren interrupts

OP #3309642
Lesenswert?
• ▲
▼
Huhu

Ich habe bei meinem aktuellen Projekt das folgende Problem:

Beim USCI_A0 (als UART) und ADC12 werden die TXIGF bzw. ADC12IFG nicht 
gesetzt wenn ich die flags polle. Die flags werden jedoch problemlos 
gesetzt, wenn ich stattdessen mit wait() eine runde Däumchen drehen 
lasse und nachher mit dem Debugger die Register ansehe...
1
int fputc(int _c, register FILE *_fp)
2
{
3
  // while(!(UCA0IFG&UCTXIFG));  // <- funzt nicht!
4
  wait(1000);                    // <- funzt!
5
  UCA0TXBUF = (unsigned char) _c;
6
  return((unsigned char)_c);
7
}
1
int get_ADC()
2
{
3
  // [set up ADC12...]
4
  ADC12CTL0 |= ADC12ENC | ADC12SC;
5
  // while( !(ADC12IFG & ADC12IFG0) );  // <- funzt nicht!
6
  wait(2500);                           // <- funzt!
7
        // [etc...]
8
}

Beide Funktionen funktionieren so - wenn auch nicht sonderlich schnell, 
da die wait-Werte übervorsichtig gross gewählt wurden.

Beim I2C gibts dieses Problem auch, aber dort scheint noch einiges 
anderes im Argen zu liegen (u.A. wird UCBUSY nicht gelöscht). Was 
ebenfalls komisch ist, da ich den Code von einem F2132 portiert habe 
(Register und Pins angepasst), wo er problemlos funktioniert hat...

Danke schon im Voraus für eure Tipps!

--Sandro
Gast #3309653
Lesenswert?
• ▲
▼
richtige headers eingebunden, sprich ist das MACRO Register Mapping 
korrekt nicht das du in der while ein bit abfrägst was gar nicht 
gewünscht ist weil das mapping (also die absolute adresse) nicht 
übereinstimmt mit deinem device?
OP #3309983
Lesenswert?
• ▲
▼
Rufus ?. Firefly schrieb:
> Sandro G. schrieb:
>> Beim USCI_A0 (als UART) und ADC12 werden die TXIGF bzw. ADC12IFG nicht
>> gesetzt wenn ich die flags polle.
>
> Und warum pollst Du die Flags, wenn Du doch von Interrupts redest?

Wenn die Interrupt Flags nicht gesetzt werden gibts auch keinen 
Interrupt. Sobald das mit den Flags läuft wie es soll schaue ich dann 
weiter bzgl. Interrupt.


Name schrieb:
> Wenn man nach UCA0TXBUF schreibt, wird UCA0TXIFG auf 0 gesetzt.
> Vielleicht gibt's bei der ADC-Einheit auch einen ähnlichen
> Zusammenhang...

Genau, und sobald das Byte im UCA0TXBUF gesendet wurde sollte UCA0TXIFG 
wieder auf 1 gesetzt werden. Was aber nie passiert, wenn gepollt wird. 
Aber schon, wenn die Zeit mit wait() vertrödelt wird.


Christopher B. schrieb:
> ADC12ON ist aber gesetzt, oder?

Jep, sonst hätte ich nicht geschrieben dass es "funzt". Die Resultate 
sind nämlich tiptop =)
OP #3310224
Lesenswert?
• ▲
▼
Und zum zeigen dass ich die richtigen Flags polle, und dass das problem 
wirklich nur ist dass sie nicht gesetzt werden:
1
int fputc(int _c, register FILE *_fp)
2
{
3
  wait(250);
4
  while(!(UCA0IFG&UCTXIFG));
5
  UCA0TXBUF = (unsigned char) _c;
6
  return((unsigned char)_c);
7
}

Zuerst warten, dann das Flag pollen - so klappts. Zumindest wenn beim 
ersten mal pollen das Flag schon gesetzt ist.
OP #3311467
Lesenswert?
• ▲
▼
1
UCA0CTL1 |= UCSWRST;        // enable reset
2

3
UCA0CTL1 |= UCSSEL__SMCLK;  // SMCLK as source (1 MHz)
4

5
                            // 1 MHz input, 57'600 baud
6
UCA0BR0 = 17;               // UCBR0 = 17 according to table on page 908
7
UCA0MCTL |= UCBRS_3;        // UCBRS = 3 according to table on page 908
8

9
                            // default: 8 bits; no parity; 1 stop bit; async
10

11
UCA0CTL1 &= ~UCSWRST;       // disable reset
12

13
UCA0IE |= UCRXIE;           // enable RX interrupt

Nach zurücksetzen von UCSWRST ist das TXIFG gesetzt, genau so wie es 
sein sollte.
OP #3312833
Lesenswert?
• ▲
▼
Nope, noch keinen Deut weiter. Und langsam läuft mir echt die Zeit 
davon. Ich werde mich mal an die noch ausstehende Dokumentation machen, 
die ist wichtiger. Sonst läuft ja das meiste, also halb so schlimm...

Und danke für die Links, besonders den von glitovsky werde ich mir 
später mal vertieft anschauen :)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.