www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 Timer Verständnisfrage


Autor: brichun (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: brichun (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich danke euch beiden jetzt hab ich es verstanden


gruß

Brichun

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.