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.