Forum: Mikrocontroller und Digitale Elektronik Zeitfunktion mit Atmega8


von Bernd S. (bernd16)


Lesenswert?

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....

von Karl H. (kbuchegg)


Lesenswert?

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

von Bernd S. (bernd16)


Lesenswert?

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

von Trollpfleger (Gast)


Lesenswert?

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...

von Bernd S. (bernd16)


Angehängte Dateien:

Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

Als erstes nimmst du jetzt mal deinen Code und rückst ihn korrekt ein!

Dann wirst du auch deinen Fehler sehen.

von Bernd S. (bernd16)


Angehängte Dateien:

Lesenswert?

hm...ich vermute, dass "Ausgang setzen" außerhalb der Endlosschleife 
war...?!

von Peter II (Gast)


Lesenswert?

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
 ...

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Dieses Dauer-While ist aber etwas fehl am Platz.

 while(1)

  TCCR1B = (1<<WGM12) | (1<<CS10);

von Bernd S. (bernd16)


Lesenswert?

okay. habs rausgenommen. Ausgang wird jetzt auch gesetzt, allerdings mit 
extremer Verzögerung. Muss ich noch etwas an der Frequenz bzw. Prescale 
verändern?

von Karl H. (kbuchegg)


Lesenswert?

Ü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

von Bernd S. (bernd16)


Lesenswert?

reicht es dann einfach, wenn ich 11059008L auf 1000000 Hz im Code 
ändere?

von Karl H. (kbuchegg)


Lesenswert?

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