Hi,
mein Problem ist, dass der AD-Wandler meines µC (MSP430F1610) in
halbwegs unregelmäßigen Abständen stehen bleibt.
Das die Stelle, an der er passiert:
1 | float pt_get()
|
2 | {
|
3 | float temp;
|
4 |
|
5 | ADC12CTL0 &= 0xfffd; // ENC aus um Konfig zu ändern (stoppt am Ende der Sequenz)
|
6 | ADC12IFG &= 0xfffe; // Interrupt flag löschen
|
7 | ADC12CTL0 |= ENC + ADC12SC; //ADC12 wieder starten
|
8 | pt_data.count++;
|
9 | while( !(ADC12IFG & 0x0001));
|
10 | pt_data.adc = ad_get_int(0);
|
11 | temp = pt_data.adc * ADC_REF_EXT / (1<<12); // AD-Wert --> Spannung
|
Der ADC läuft im "Repeat sequence of channels"-Mode frei durch.
Deshalb soll das Programm in der while-Schleife auf den nächsten
Wandlerwert warten, da zuvor Messkanal erst durchgeschaltet wurde.
Nur bleibt er eben in der while-Schleife immer wieder hängen.
Dabei steht dann im ADC12IFG: 0x000E. Die ADC12 Kontrollregister sehen
im Debugger eigentlich richtig aus (ENC, ADC12ON und ADC12SC sind
gesetzt), aber der Wandler liefert keine neuen Werte, ergo kein neues
Interrupt-flag und ich kommen nicht mehr aus der Schleife raus. Bleibt
er hängen, ist das BUSY-Bit durchgehend 1.
Wenn ich via Debugger ADC12ON erst Null und dann wieder Eins setzte,
läuft er weiter.
Was mich jedoch am meiste wundert ist, dass das Programm immer wieder
nach der gleichen Anzhal Zyklen stehenbleibt. (pt_get() wird in
2ms-Intervallen aufgerufen)
Ich habe das Programm bis jetzt 14 mal durchlaufen lassen, dabei sind
Hänger im Bereich des 55. bis 394. Zykluses aufgetreten. Dabei waren:
55: 3mal
89: 3mal
123: 2mal
191: 2mal
Nehme ich die while-Schleife raus, treten keine Hänger auf...
Hat jemand ne Idee, wo der Fehler liegen könnte und vor allem in welche
Richtung ich suche sollte?
Wieso beeinflusst das Polling überhaut den ADC?
Danke schonmal im Vorraus.
Gruß Christoph
und noch was: alle Interrupts sind in dem Programmbereich aus. (GIE = 0)