Hallo Leute, ich beschäftige mich seit Kurzem mit Mikrocontrollern. Dementsprechend habe ich auch nur geringe Kenntnisse. Nun zu meinem eigentlichen Problem: Ich möchte einen Atmega8 als Art "Zeitschaltuhr" programmieren. Diese soll alle 12 Stunden eine Aktion ausführen. Da ein Delay nur für kürzere Verzögerungszeiten funktioniert, brauch ich nun Eure Hilfe....
Delay ist sowieso der falsche Ansatz (abgesehen davon, dass wenn man 20 mal 1 Sekunde wartet, man in Summe ja auch 20 Sekunden gewartet hat. Wie die Arithmetik einer Uhr funktioniert, weißt du? 60 Sekunde sind 1 Minute. 60 Minuten sind 1 Stunde. Du willst 12 Stunden warten.) Was du brauchst ist: Der Einsatz eines Timers. http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC
Danke für den Link. Ich hab mir den Timer mal durchgelesen und den Beispielcode auf meine Bedürfnisse abgeändert. Leider funktioniert das nicht ganz :-( Hat jemand von euch eventuell noch ein einfaches Beispielprogramm (C)?
Bernd S. schrieb: > Danke für den Link. Ich hab mir den Timer mal durchgelesen und den > Beispielcode auf meine Bedürfnisse abgeändert. Dann lass mal sehen...
Okay. Also nach 5 Sekunden (anstatt meine 12 Stunden, um das Programm schneller zu testen) soll Ausgang PD0 gesetzt werden. CODE: im Anhang. Die Zeilen mit Kommentar versehen, wurden geändert.
Bernd S. schrieb: > Also nach 5 Sekunden Sieht für mich eher nach 5 Minuten aus. Bernd S. schrieb: > CODE: im Anhang. Und wieso als .txt, und nicht als .c?
Als erstes nimmst du jetzt mal deinen Code und rückst ihn korrekt ein! Dann wirst du auch deinen Fehler sehen.
hm...ich vermute, dass "Ausgang setzen" außerhalb der Endlosschleife war...?!
was soll das while hier machen?
1 | while(1) |
2 | |
3 | TCCR1B = (1<<WGM12) | (1<<CS10); |
4 | OCR1A = XTAL / DEBOUNCE - 1; |
5 | TCNT1 = 0; |
6 | second = 0; |
7 | prescaler = (uchar)DEBOUNCE; |
8 | TIMSK = 1<<OCIE1A; |
9 | ...
|
Dieses Dauer-While ist aber etwas fehl am Platz. while(1) TCCR1B = (1<<WGM12) | (1<<CS10);
okay. habs rausgenommen. Ausgang wird jetzt auch gesetzt, allerdings mit extremer Verzögerung. Muss ich noch etwas an der Frequenz bzw. Prescale verändern?
Überprüf doch mal, ob deine 'extreme Verzögerung' nicht zufällig den Wert 11059008L / 1000000 also ca 11 hat. Wenn ja, dann läuft dein µC nicht mit 11Mhz sondern ist noch im Auslieferungszustand 1Mhz
reicht es dann einfach, wenn ich 11059008L auf 1000000 Hz im Code ändere?
Ich würd sicherheitshalber mal mit dem Taschenrechner die sich daraus ergebenden Zahlen nachrechnen, ob sie sich noch so einigermassen im Rahmen bewegen. Allerdings: Ohne Quarz mit einer halbwegs genau definierten Frequenz, wirst du mit deiner Uhr nicht viel Freude haben. Wenn die je nach Tagestemperatur unterschiedliche Abweichungen hat, wird sie dir schnell aus dem Ruder laufen. Da könnte man sich diesen ganzen Aufwand auch sparen und das Schätzeisen tatsächlich auch gleich mit delay_ms betreiben.
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.