Forum: Mikrocontroller und Digitale Elektronik 8051 Timer Verständnisfrage


von brichun (Gast)


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ß

von swen (Gast)


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.

von Ralf (Gast)


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

von brichun (Gast)


Lesenswert?

ich danke euch beiden jetzt hab ich es verstanden


gruß

Brichun

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.