Hallo, ich benutze beim MSP430F2013 den SD16 ADC und habe ein sporadisches Problem. Hier kurz die Einstellungen: - Der Controller läuft mit 16MHz - die Initialisierung des ADC: SD16CTL = SD16XDIV_1 + SD16REFON + SD16SSEL_1; SD16CCTL0 = SD16UNI + SD16SNGL + SD16OSR_256; SD16INCTL0 = SD16INCH_1 + SD16GAIN_1; SD16AE = SD16AE2 + SD16AE3; Ich starte den ADC und Summiere in einer for-schleife 32 Werte auf und bilden danach den Mittelwert. In der for-Schleife warte ich in einer while-Schleife bis die Wandlung abgeschlossen ist. for(c_adc_mess=0;c_adc_mess<32;c_adc_mess++) { SD16CCTL0 |= SD16SC; adc_flag = (SD16CCTL0 & SD16SC); while (adc_flag > 0){ adc_flag = (SD16CCTL0 & SD16SC);}; adc_temp = adc_temp + (unsigned long)SD16MEM0; } adc_temp = adc_temp >> 5; Das funktioniert soweit auch sehr gut. Nur kommt es sporadisch vor das der MSP in der while-Schleife hängen bleibt. Ich habe auch noch einen Watchdog-Timer laufen dieser wird aber dann, sobald der MSP in der while-Schleife hängt, auch nicht mehr ausgeführt. Ich hab auch schon einen Interrupt erzeugt sobald die Wandlung fertig ist und darin ein Flag gesetzt, dass dann in der while-Schleife abgefragt wurde. Aber da hatte ich da gleiche Phänomen. Hat vielleicht einer das gleiche Problem und die Lösung dazu? Ich währe sehr dankbar für einen Hinweis wo das Problem liegen könnte! Grüße T.B.
T. B. schrieb: > adc_flag = (SD16CCTL0 & SD16SC); > while (adc_flag > 0){ > adc_flag = (SD16CCTL0 & SD16SC);}; Warum nicht einfach so? while (SD16CCTL0 & SD16SC);
Ja das hab ich auch schon versucht aber da hatte ich das gleiche Problem das er in der while-Schleife hängen bleibt.
Versuch mal...
1 | SD16CCTL0 &= ~ SD16IFG; // clear ADC Interrupt Flag |
2 | SD16CCTL0 |= SD16SC; // AD Wandler starten |
3 | while (!(SD16CCTL0 & SD16IFG)); // AD Wandlung fertig ? |
Laufen irgendwelche Interuppts im Hintergrund? Zeig einmal das vollständige Programm. Oder etaws lauffähiges mit dem Fehler. T. B. schrieb: > adc_temp = adc_temp >> 5; Hier darfst du rihig "/ 32" schreiben. Die Schiebeoperation macht der Compiler trotzdem. Ist nur lesbarar. Noch besser ist es natürlich mit einem #define.
gibt es beim addieren der 32 Werte einen Überlauf ? gleitende Mittelung find ich besser , gebe doch mal ein paar feste Werte in die Schleife ein zu testen auch mit Extremwerten . mfg Erik
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.