Forum: Mikrocontroller und Digitale Elektronik ATmega32U4 Countdown


von Florian M. (error404)


Lesenswert?

Ich habe ein Problem mit meinem Programm. Das Ziel ist es, mit dem µC 
auf einem LCD einen Countdown zu machen. Startwert lässt sich mittels 
Taster einstellen und der Countdown lässt sich starten. Er zählt auch 
genau jede Sekunde runter...aber immer um 9 Werte. Bin mir sicher es ist 
ein billiger Fehler, aber ich komm einfach nicht drauf.
Hier der Programmausschnitt:

if((time-((time/100)*100))==0) //ersetzt Modulu (alle 100 mal OK)
{
sprintf(s,"%02d",start); //startwert wird formatiert in string 
geschrieben
lcd_string(s); //string wird am LCD ausgegeben(lcd-routines.h)
lcd_setcursor(6,2); //Position wird neu gesetzt
if(start>0) start--; //FEHLERHAFTE ZEILE
}

time...alle 10ms wird time von timer1 um 1 erhöht
start...Startwert, der im ext. Interrupt festgelegt wird. Danach im 
Programm nur in dem Programmausschnitt verwendet

Hab schon versucht time statt start auszugeben..100,200,300..und das 
alle Sekunden...sollte auch so sein. Es liegt ganz sicher an 'start--'

Bitte um Hilfe!
LG. Error404

von holger (Gast)


Lesenswert?

>if(start>0) start--; //FEHLERHAFTE ZEILE
>Es liegt ganz sicher an 'start--'

Nö, daran liegt es mit Sicherheit nicht.
Das Problem ist woanders in deinem Code.

von Florian M. (error404)


Lesenswert?

Woran denn? Wenn ich time anstatt start ausgebe, dann wird jede Sekunde 
ein vielfaches von 100 ausgegeben, da heißt, dass alles im if genau jede 
Sekunde aufgerufen wird. Start wird sonst nirgendwo angerührt. Wo sollte 
der Fehler liegen?

von foo (Gast)


Lesenswert?

Florian Moser schrieb:
> if((time-((time/100)*100))==0) //ersetzt Modulu (alle 100 mal OK)

Warum so kompliziert, wenns auch einfach geht? if ((time % 100) == 0)

von Mario M. (thelonging)


Lesenswert?

Die If-Abfrage ist für jeweils 10ms wahr. Wenn der gezeigte 
Code-Schnipsel in einer Schleife immer wieder aufgerufen wird, schafft 
er es den Wert von "start" mehrmals zu dekrementieren.

von Florian M. (error404)


Lesenswert?

Nur um zu versuchen, ob es am Modulu liegt. Wenn time unter 100 liegt, 
dann ist der Wert mit Modulu nicht das, was er sein sollte.

von Florian M. (error404)


Lesenswert?

Wieso alle 10ms? der timer1 braucht genau 10ms bis er den wert 20000 
erreicht. dann wird time um 1 erhöht. Das heißt... wenn time ein 
Vielfaches von 100 ist, ist 1s vergangen...und nicht 10ms

von Mario M. (thelonging)


Lesenswert?

Aber bis "time" auf 101 erhöht wird dauert es 10ms. Und während dieser 
Zeit kann das Programm immer wieder in die if-Abfrage gelangen und 
"start--" ausführen. Ich gehe davon aus, dass der gezeigte 
Code-Schnipsel in einer Schleife wiederholt wird.

von Florian M. (error404)


Lesenswert?

Stimmt! Genau! Soweit hab ich garnicht gedacht. Ist eine einfach 
while(1) Schleife. Hast du vielleicht einen Lösungsvorschlag?
DANKE!

von Florian M. (error404)


Lesenswert?

Ok, ging einfach, schon gelöst. Vielen Danke nochmal!

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.