Forum: Mikrocontroller und Digitale Elektronik MSP430F5438: Probleme mit mehreren interrupts


von Sandro G. (sandro_g)


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

von mapper (Gast)


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?

von Sandro G. (sandro_g)


Lesenswert?

Jep, doppelt und dreifach geprüft...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Name (Gast)


Lesenswert?

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

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

ADC12ON ist aber gesetzt, oder?

LG

von Sandro G. (sandro_g)


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 =)

von Sandro G. (sandro_g)


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.

von DirkZ (Gast)


Lesenswert?

Sandro G. schrieb:
> da ich den Code von einem F2132 portiert habe
> (Register und Pins angepasst),

Wie werden bzw. sind

UCA0CTL1
UCA0IE

gesetzt?

von Sandro G. (sandro_g)


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.

von DirkZ (Gast)


Lesenswert?

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?

von Mrs MSP (Gast)


Lesenswert?

Wie sieht es aus? Läuft dein Programm?

Wenn nicht, hier ein paar hilfreiche Links:
http://dbindner.freeshell.org/msp430/adc_g2553.html
http://glitovsky.com/blog/?p=300

von Sandro G. (sandro_g)


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 :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.