Forum: Mikrocontroller und Digitale Elektronik MSP430F2013 sd16 Problem


von T. B. (djangowest)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

T. B. schrieb:
> adc_flag = (SD16CCTL0 & SD16SC);
>       while (adc_flag > 0){
>         adc_flag = (SD16CCTL0 & SD16SC);};

Warum nicht einfach so?

  while (SD16CCTL0 & SD16SC);

von T. B. (djangowest)


Lesenswert?

Ja das hab ich auch schon versucht aber da hatte ich das gleiche Problem 
das er in der while-Schleife hängen bleibt.

von Bernd N (Gast)


Lesenswert?

Versuch mal...
1
    SD16CCTL0 &= ~ SD16IFG;               // clear ADC Interrupt Flag
2
    SD16CCTL0 |= SD16SC;                  // AD Wandler starten
3
    while (!(SD16CCTL0 & SD16IFG));       // AD Wandlung fertig ?

von will sehen (Gast)


Lesenswert?

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.

von Erik (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.