Hallo zusammen, Ich bastel gerade an einer Uhr. siehe Code. Es funktioniert alles prima, sogar die Zeit ist genau. Jetzt möchte ich die Zeit einstellen, sprich mit Tastern die Std und Min hochzählen. die Funktion im Main mit Taster 0 klappt auch..die Std werden hochgezählt und die Zeit dann aktuell angezeigt. Jetzt zum Problem: Ich möchte ein kleines Einstellmenü bastel, dieses wird mit Taster 2 aufgerufen.Danach können mit Taster 0 und 1 die Std und Min eingestellt werden (Anzeige auf Display), bis Taster 3 gedrückt wird. Dann hab ich allerdings das Problem das der Display "festhängt"! also die Uhr läuft scheinbar nicht mehr. Grüße Matthias
Laß das direkte Rumgefrickel mit den Portpins, da kommt nur Mist raus. Nimm ne Entprellfunktion: Beitrag "Universelle Tastenabfrage" Peter
Hallo, ok ich hab nun die Taster entprellt mit Hilfe des Tutorials ( Bin noch ziemlicher Rookie :-) deshalb kann ich noch nicht viel mit deinem Verweis anfangen) Das klappt auch fast alles, allerdings hab ich jetzt wieder das Problem: - Die Zeit läuft wie sie soll - Durch drücken von Taster 1 komm ich ins Menü - Das LCD wird gelöscht und es werden Std und Min gezeigt - Mit Taster 2 und 3 kann ich Std und Min einstellen - Durch erneutes Drücken von Taster 1 komme ich zurück - Die aktualisierte Uhrzeit wird auf dem LCD ausgegeben - Bleibt dann aber stehen und schnall nicht wieso.... die While schleife läuft doch weiter?! Danke für die Hilfe. Grüße Matthias
Matthias Kugler schrieb: > - Bleibt dann aber stehen und schnall nicht wieso.... Irgendwann wird sie schon wieder weiterlaufen. Du musst nur lange genug warten > die While schleife läuft doch weiter?! die ist auch nicht das Problem in deiner Hauptschleife machst du einen Clocktick nur dann wenn: if (counter1 == 1){ nun warts du aber im Einstellemenü. Während du als Benutzer da rumgefpriemelt hast, ist die ganze Zeit der Timer weiter gelaufen und hat mit der ISR die Variable counter1 hochgezählt. Verlässt du das Einstellmenü, dann wird coutner1 irgendeinen Wert haben, zb 67, je nachdem wie lange du zum Einstellen gebraucht hast. Der ist aber sicherlich nicht gleich 1. Und damit erfolgt dann auch kein Weiterschalten deiner Uhr mehr, weil 67 nun mal nicht gleich 1 ist. Erst wenn die Variable überläuft und erzwungenermassen wieder bei 0 weiterzählt, würde deine Uhr dann wieder laufen. if( debounce_D1() ) { ZeitEinstellen(); counter1 = 0; } oder noch einfacher
1 | while(1) { |
2 | |
3 | if (counter1 > 1) { |
4 | clocktick(); |
5 | counter1 = 0; |
6 | }
|
7 | |
8 | lcd_ausgabe(); |
9 | _delay_ms(100); |
10 | |
11 | if ... |
was macht eigentlich der Delay da drinnen? Und musst du wirklich ständig das LCD updaten? Das muss doch nur passieren, wenn sich die Zeit auch wirklich geändert hat, oder nicht?
1 | while(1) { |
2 | |
3 | if (counter1 > 1) { |
4 | clocktick(); |
5 | counter1 = 0; |
6 | lcd_ausgabe(); |
7 | }
|
8 | |
9 | if ... |
PS: an deiner Codeformatierung musst du noch arbeiten. So, wie du jetzt
deinen Code formatierst, versteckst du dir wichtige Informationen durch
ungeschickte Anordnung im Code. zb ist es wichtig zu wissen, wo ein {
anfängt und wo das zugehörige } den Block abschliest. Das sind Dinge,
die möchte man gerne aus 5 Meter Entfernung beim ersten Blick auf den
Monitor sehen können.
Bei einer Formatierung wie der hier1 | if (counter1 == 1){ |
2 | clocktick(); |
3 | counter1 = 0;} |
4 | lcd_ausgabe(); |
5 | _delay_ms(100); |
kann man das nicht. So hingegen
1 | if (counter1 == 1) { |
2 | clocktick(); |
3 | counter1 = 0; |
4 | }
|
5 | |
6 | lcd_ausgabe(); |
7 | _delay_ms(100); |
kann ein Blinder mit Krückstock aus 3 Meter Entfernung sagen, welcher Code vom if abhängt, wo er anfängt und wo er aufhört.
ja natürlich...jetzt wo du es sagst!
das ist ja logisch, da muss man erstmal drauf kommen :-(
Vielen Dank!!!
Es funktioniert jetzt wie es soll!
Mit der aktualisierung des LCD hast du natürlich recht, das musst ich
nur bei jeder Sekunde machen!
ich hab ein "größer gleich" eingefügt, sonst zählt er ja nur alle 2
Sekunden:
if (counter1 >= 1) {
clocktick();
counter1 = 0;
lcd_ausgabe();
}
Eine generelle Frage habe ich noch:
würde es Sinn machen den clocktick direkt aus der ISR anzusprechen?
ggf. ich würd noch Funktionen aus dem Main aufrufen die Zeit benötigen,
könnte ich ja
auch counter-impulse "verschlafen" oder?
Aller Anfang ist schwer merk ich mal wieder :-)
Matthias
Matthias Kugler schrieb: > Eine generelle Frage habe ich noch: > würde es Sinn machen den clocktick direkt aus der ISR anzusprechen? > > ggf. ich würd noch Funktionen aus dem Main aufrufen die Zeit benötigen, > könnte ich ja > auch counter-impulse "verschlafen" oder? So sollte zumindest die Zeit immer auf dem laufenden sein.
1 | ISR(TIMER1_COMPA_vect) |
2 | {
|
3 | c_seconds ++;//Bei jedem Tick die Sekunden erhöhen |
4 | |
5 | if (c_seconds == 60) //Wenn 60 Sekunden um sind, Minute ++ |
6 | {
|
7 | c_seconds = 0; |
8 | c_minutes ++; |
9 | }
|
10 | |
11 | if (c_minutes == 60) //Wenn 60 Minuten um sind, Stunde ++ |
12 | {
|
13 | c_minutes = 0; |
14 | c_hours ++; |
15 | }
|
16 | |
17 | if (c_hours == 24) //Wenn 24 Stunden rum sind, neuer Tag |
18 | {
|
19 | c_hours = 0; |
20 | }
|
21 | |
22 | PORTC ^= (1<<PC0); |
23 | }
|
void clocktick() wegwerfen und die main anpassen. z.B.
1 | if (c_seconds != c_seconds_alt) |
2 | {
|
3 | lcd_ausgabe(); |
4 | ...
|
5 | ...
|
6 | |
7 | c_seconds_alt = c_seconds; |
8 | }
|
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.