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

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