MSP430F5438: Probleme mit mehreren interrupts

OP #3309642
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
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
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
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
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.
Gast #3311825
Sandro G. schrieb:
> // 1 MHz input, 57'600 baud
> UCA0BR0 = 17;               // UCBR0 = 17 according to table on page 908
> UCA0MCTL |= UCBRS_3;        // UCBRS = 3 according to table on page 908


UCA0BR1 = ?

Die Gegenstelle hat die gleichen seriellen Parameter?
OP #3312833
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.