PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Seltsames Problem bei Array; Werte wandern



Jaecko
05.07.2012, 19:42
Moin.

Mal wieder ein kniffligeres Problem, bei dem ich wieder garnicht weiss, wo das herkommt.
Der Einfachheit halber hier das gesamte AVR-Studio-Projekt:

http://www.cihome.de/forendaten/rn/powermonitor.zip

Kurze Erklärung zum Projekt:
Diese Software läuft auf einer Schaltung mit ATmega32 und einem KS0108-LCD. Eine Lichtschranke am Stromzähler überwacht die rote Markierung und liefert an INT0 einen Puls. Durch die Dauer einer Umdrehung lässt sich der Stromfluss berechnen.
Dabei sollen die Messungen u.a. in verschiedenen Diagrammen dargestellt werden.
Im Array diagBuf_Power_W[] liegen die Messwerte der letzten 25 Umdrehungen. Die Verarbeitung dieser Daten klappt soweit.

Jetzt das Problem:
Im Array diagBuf_DayTrend_Revs[] soll jeweils die Anzahl Umdrehungen der letzten 25 Stunden abgelegt werden. Also jeder Puls zählt DayTrend_Cnt hoch. Nach jeder Stunde (im Projekt für Debugzwecke aktuell nach jeder Minute) werden die Werte im Array weitergeschoben und DayTrend_Cnt kommt auf Platz 0.
So wie auch bei diagBuf_Power_W[], nur dass hier das Durchschieben nach jeder Umdrehung erfolgt.

Das Problem nun: Die Werte in diagBuf_DayTrend_Revs[] werden nicht erst beim Stunden-/Minutenwechsel durchgeschoben, sondern ebenfalls nach jeder Umdrehung.

Erwartet:


Arrayinhalt: { 0, 0, 0, ...}
Puls => { 1, 0, 0, ...}
Puls => { 2, 0, 0, ...}
Puls => { 3, 0, 0, ...}
Stundenwechsel => { 0, 3, 0, ...}
Puls => { 1, 3, 0, ...}
Puls => { 2, 3, 0, ...}
Stundenwechsel => { 0, 2, 3, ...}
Puls => { 1, 2, 3, ...}
Puls => { 2, 2, 3, ...}
...


Aber wie es tatsächlich abläuft:


Arrayinhalt: { 0, 0, 0, ...}
Puls => { 1, 0, 0, ...}
Puls => { 2, 1, 0, ...}
Puls => { 3, 2, 1, ...}
Puls => { 4, 3, 2, ...}


Das ganze ist unabhängig davon, ob das Diagramm angezeigt wird oder nicht; auch die Debug-Ausgabe der Werte (main.c, Zeilen 136-141) beinhaltet schon die falschen Daten. Ebenso machts keinen Unterschied, ob ich DayTrend_Cnt verwende, oder direkt diagBuf_DayTrend_Revs[0] hochzähle.

Und eben hier kommt die Frage: Why?

Hab ich da schon wieder was übersehen? Bug im Compiler? AVR defekt?

mfG

MagicWSmoke
05.07.2012, 21:33
Schau doch mal, wofür sizeof() den Wert zurückgibt,

for (cnt8 = sizeof(diagBuf_DayTrend_Revs) - 1; cnt8 > 0; cnt8--)
den Du dann hier als Index benutzt:

diagBuf_DayTrend_Revs[cnt8] = diagBuf_DayTrend_Revs[cnt8-1];

Jaecko
05.07.2012, 21:40
Thx... wars tatsächlich.
Klassiker... v.a. hab ich genau das Problem an anderen Stellen im Code ja schon behoben; nur bei der for() hab ichs übersehen.

MagicWSmoke
05.07.2012, 22:11
an anderen Stellen im Code ja schon behoben
Jep, da hat die Filterfunktion des Hirns zugeschlagen :D