Jaecko
05.07.2012, 20: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
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