Forum: Mikrocontroller und Digitale Elektronik Atmega seltsames ADC Verhalten, Überlauf?


von bobberjahn (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

in der uC Programmierung bin ich zwar noch nicht so geübt, ich habe 
allerdings nun folgendes Verhalten mit meinem Code festgestellt, das ich 
nicht nachvollziehen kann. Zunächsteinmal der Code:
1
uint16_t lastADCresult;    //Globale Variablen
2
uint16_t ADCResultBuffer[500];
3
uint16_t ADCBufferCurrent;
4
5
ISR(ADC_vect)   //ADC Ergebnis speichern, läuft im FreeRun-Mode
6
{
7
  lastADCresult= ADCW;
8
}
9
10
ISR(TIMER0_OVF_vect) //Tritt alle 217us auf
11
{  
12
  cli();
13
  
14
  if(ADCBufferCurrent>499)
15
    ADCBufferCurrent=0;
16
  
17
  //wird später ins Array eingefügt
18
  uint16_t measuredSteps;
19
  
20
  if(lastADCresult<=1024)  //Habe ich später zum Test eingeführt, siehe Text
21
  {
22
    if(lastADCresult>=512)
23
      measuredSteps = (lastADCresult-512);
24
    else
25
      measuredSteps = (512 -lastADCresult);
26
    
27
    ADCResultBuffer[ADCBufferCurrent] = measuredSteps;
28
  
29
    //Arrayzeiger inkrementieren
30
    ADCBufferCurrent++;    
31
  }  
32
  sei();
33
}

Das ganze dient zum Auslesen einer sinusförmigen Schwingung, um 2.5V. 
Ich möchte den Abstand des Signals zu den 2.5V messen und in das Array 
schreiben. Da ich den in den ATMega88 integrierten 10bit ADC nutze, 
liegen diese 2.5V bei 512 Steps. Aus einem mir nicht erklärlichen Grund 
ergibt sich immer folgende Belegung des Arrays: siehe Anhang. Eigentlich 
sollten keine Werte >1024 auftreten, da der ADC nur 10bit besitzt. Zu 
Testzwecken habe ich auch diese if-Abfrage oben eingebaut. An einen 
Überlauf habe ich schon gedacht, aber wo woll er auftreten? Wenn das 
Ergebnis >=512 ist, wird davon 512 abgezogen, also kommt mindestens 0 
raus. Ist es kleiner als 512, wird es von 512 abgezogen, auch hier 
sollte es mindestens 0 sein. Ich verstehe auch nicht, warum diese Werte 
nur ab ca Messwert 430 beginnen so zu schwanken. Vor Eintritt in die 
Hauptschleife des Programms wird das Array mit Nullen initialisiert.
Das gleich Verhalten tritt auch auf, wenn ich nicht den FreeRun Modus 
nutze, sondern die Konversation immer explizit starte.

von Stefan E. (sternst)


Lesenswert?

Da dürfte wohl der Stack in dein Array hinein gelaufen sein. Dein 
ATmega88 hat bloß 1024 Bytes RAM und deine drei ADC-Variablen belegen 
bereits 1004 davon.

von bobberjahn (Gast)


Lesenswert?

Okay...dann reduziere ich am besten die Arraygröße.
Da merke ich, wie verwöhnt ich mit dem managed code auf dem Desktop bin, 
an den ich mich gewöhnt hab, an sowas hätte ich nie gedacht.

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.