Moin! Ich habe eine kleine Platine gebaut, die eine LED mit Batteriespannung betreiben soll, die Spannung überwacht und die Restlaufzeit per RGB-LED ausgibt. Es funktioniert größtenteils sehr gut. Ich habe lediglich ein Problem beim Laden. Background: Der Zähler "Running_Time" wird im EEPROM gespeichert und speichert die Restlaufzeit. Im LED-Betrieb wird die Variable alle 72s um ein verringert (Zeile: 458). Dies geschieht durch den Watchdogtimer, der alle 8 Sekunden einen Interrupt auslöst. Im Auflademodus löst ebenfalls der Watchdog alle 8 Sekunden aus. Dieses Mal wird "Running_Time" alle 72s um 3 erhöht (Zeile: 370). Sobald "Running_Time_Max" erreicht wird, sollte der Ladevorgang beendet werden und die RGB-LED blau blinken. (ab Zeile 373) Das Problem ist, dass Running_Time anscheinend nie über Running_Time_Max kommt. Wie in Zeile 372 zu sehen, lasse ich die blaue LED bereits alle 8 Sekunden blinken. Dies tut sie auch. Entsprechend gehe ich davon aus, dass Running_Time ebenfalls erhöht wird. Allerdings wird die Bedingung in Zeile 373 nie ausgelöst :/ Der Ladevorgang kann unterbrochen werden (Zeile 327 bzw. Interrupthandler in 465). Die Bedingung 327 löst aus und trennt die Stromversorgung über die Funktion "die()" (364). Diese Funktion speichert vorher Running_Time zurück in den EEPROM. Ich habe den EEPROM manuell mit 430 beschrieben. Nach einem kurzen Ladevorgang (ich habe die Watchdog/Inkrement-Geschwindigkeit auf alle 8s erhöht), ging ich davon aus, dass der Wert gestiegen sein müsste. Stattdessen schien er um der erwarteten Wert gesunken zu sein. Ich habe das ganze mehrfach durchgeführt, unterschiedlich lange. Beim letzten Versuch ist er von 430 auf 214 gesunken! Ich sitze mittlerweile seit Stunden vor diesem Problem und habe das Gefühl, dass es irgendwas dämliches sein muss, was ich durchweg übersehe. Running_Time ist in Zeile 85/86 als int16 deklariert (uint6 ist hier nicht möglich, da Running_Time im LED-Betrieb negativ werden kann). Die adc-Bibliotheken sind die Standard-Bibs von Peter Fleury, leicht angepasst. Ich habe sie lediglich zu Vollständigkeit mithochgeladen. Relevant ist hauptsächlich die main.c Es ist sehr "viel" (490 Zeilen) Code und da ich nicht weiß, wo der Fehler liegt, wollte ich ihn nicht kürzen und womöglich den Fehler "löschen". Ich hoffe dennoch, dass jemand sich die Mühe macht und mal drüber schaut und den Fehler entdeckt oder mich wenigstens auf die richtige Fährte bringt :)
Kurze Antwort. Den Code um die Hälfte kürzen. Wenn der Fehler nicht mehr auftritt, die andere Hälfte kürzen. Das wiederholst du so lange, bis nur mehr 20 Zeilen übrig sind. Dann siehst du den Fehler selbst.
Julian schrieb: > übersehe. Running_Time ist in Zeile 85/86 als int16 deklariert (uint6 > ist hier nicht möglich, da Running_Time im LED-Betrieb negativ werden > kann). Wenn schon so komisch, dann probiere es wenigstens mit int32. Und wenn es klappt, weisst du wenigstens wo der Fehler liegt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.