8051 Timer Verständnisfrage

Gast #1661856
Lesenswert?

Hi,


kurze Frage zum Timer0 des 8051.

Nehmen wir mal an ich hab den Timer0 (16Bit = 65535 Zustände)soeben 
gestartet wenn der Timer0 nun beim Overflow in eine Interrupt 
ServiceRoutine springt um diese dann abzuarbeiten.Dann ist doch das 
Hauptprogramm solange unterbrochen.

Wenn ich jetzt aber einen 24h Timer mithilfe von mehreren Registern in 
der ISR programmiert habe, dann kann ich doch mein Hauptprogramm 24h 
lang nicht mehr ansprechen oder?


D.h das Programm verweilt erst 24h in der ISR und springt nach Ablauf 
der 24h wieder ins Hauptprogramm.


Bitte um Aufklärung

Danke
Gruß
Gast #1661885
Lesenswert?

mann sollte sich so kurz wie möglich im interupt prog. befinden.

d.h. beim einem timer counter overflow landest du im interrupt, setzt 
ein flag/änderst ne (volitale) variable und nix wie ab zurück ins 
hauptprogramm. dort kannste dann mit den flags/variablen "schleifen" was 
das zeug hält. du bist also quasi "nur" im hauptprogramm.
Gast #1662003
Lesenswert?

> Wenn ich jetzt aber einen 24h Timer mithilfe von mehreren Registern in
> der ISR programmiert habe, dann kann ich doch mein Hauptprogramm 24h
> lang nicht mehr ansprechen oder?
Nein, ist falsches Verständnis. Ich geh jetzt mal davon aus, dass du 
alle 24h eine "Nachricht" haben willst, dass eben die 24h rum sind. Also 
machst du folgendes:

Du konfigurierst deinen Interrupt auf sagen wir beispielsweise 10ms oder 
100ms (geht auch exakt mit ungeraden Quarzfrequenzen(!)). Dann nimmst du 
vier 1-Byte Variablen, welche die 10ms, die Sekunden, die Minuten und 
die Stunden darstellen. Der Interrupt inkrementiert bei jedem Durchlauf 
die 10ms-Variable. Ist sie gleich 100, wird sie auf 0 gelöscht und dafür 
die Sekunden inkrementiert. Und so gehts dann weiter, bis deine 
Stunden-Variable den Wert 24 hat. Dann wird alles gelöscht und es geht 
von vorne los. Bei Erreichen von 24 für die Stunden setzt du zusätzlich 
eine 1-Bit Variable, welche im Hauptprogramm abgefragt wird (und dort 
auch wieder gelöscht wird).

Das heisst insgesamt, dass der Interrupt nur alle 10ms kommt, die 
Berechnungen durchführt und wieder verlassen wird, d.h. das 
Hauptprogramm kommt immer dazwischen zum Zuge.
Mit der o.g. Implementierung hast du auch gleichzeitig eine RTC 
programmiert, wenn du die Zugriffe auf die Interrupt-Variablen richtig 
steuerst, kannst du eine sehr exakte Uhr programmieren :)

Ich hoffe, ich konnte das einigermaßen verständlich rüberbringen =)

Ralf

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren