Forum: Mikrocontroller und Digitale Elektronik int16 wird bei Addition kleiner


von Julian (Gast)


Angehängte Dateien:

Lesenswert?

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 :)

von Noch einer (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
Noch kein Account? Hier anmelden.