Forum: Mikrocontroller und Digitale Elektronik Frage zu Timer0 bei 8051


von MC (Gast)


Lesenswert?

Tag an alle,
ich benutze in 8051-Derivat. Meine Frage ist:
Wenn ich die Timer0 bzw. 1 als 16Bit-Timer benutze und in der ISR den 
Timer neu lade, muss ich, um die Ablaufzeit konstant zu halten, die 
Zeit, die zum Ausführen der Instruktionen zum Neuladen des Timers ja 
benötigt wird, berücksichtigen?!

Beispiel:
;Timer0_ISR
clr tcon.4     ;1 Zyklus
mov th0,#123   ;2 Zyklen
mov tl0,#234   ;2 Zyklen
setb tcon.4    ;1 Zyklus

Das ich die ersten drei Anweisungen berücksichtigen muss, ist mir klar. 
Was ist aber mit der letzten Anweisung, die den Timer0 wieder startet? 
Muss ich die auch von dem Zählwert des Timers abziehen???

Danke schon mal für eure Antworten,
MC

von Ralf (Gast)


Lesenswert?

Hallo,

ganz sicher bin ich mir nicht, aber ich würde sagen, du musst die letzte 
Anweisung auch abziehen, weil die ja auch Zeit braucht, bis das Bit 
gesetzt ist.
Je nachdem, welches Derivat du hast, könntest du auch Timer 2 verwenden, 
der kann 16-Bit mit AutoReload.

Ralf

von MC (Gast)


Lesenswert?

Danke für deine Antwort,
>Je nachdem, welches Derivat du hast, könntest du auch Timer 2 verwenden,
>der kann 16-Bit mit AutoReload.

Der ist leider schon benutzt.
Ich verwende den AT89S8253 von Atmel. Insgesamt benutze ich alle drei 
Timer, die serielle Schnittstelle,das interne EEPROM, den X2-Mode, 
später noch die SPI,...

Werde mit nem Speicheroszilloskop mal versuchen, eine Differenz zwischen 
"letze Antweisung mitberücksichtig" und "letzte Anweisung nicht 
berücksichtit" zu messen.

von MC (Gast)


Lesenswert?

Habe mal mit meinem Oszilloskop nachgemessen.
Es kann noch nichtmal nen Unterschied feststellen, wenn ich die Zeit zum 
Neuladen des Timers nicht beachte.
Eigentlich sollte der Zeitunterschied bei 11,059MHz ohne X2-Mode 6,5µs 
betragen. Das sollte ein Speicheroszilloskop bis 60MHz doch auflösen 
können, oder nicht?

von Peter D. (peda)


Lesenswert?

Wenn Du ein präzises Timing willst, das ist mit MOV unmöglich, da die 
Interrupteinsprungzeit nicht konstant ist.

Präzises Timing geht nur mit Addition zu der real vergangenen Zeit:

http://home.tiscali.de/peterd/appl/soft/clock/index.htm


Peter

von MC (Gast)


Lesenswert?

Danke für die Antwort,
an die Verzögerung für den Interrupt habe ich gar nicht gedacht.
Habe noch mal nachgemessen. Um bei 11,059MHz auf 50ms zu kommen, muss 
ich deutlich mehr Zyklen berücksichtigen, als beim Neuladen des Timers 
ausgeführt werden (14 anstatt von 6). Die werden wohl von der 
Interrupt-Verzögerung kommen.
MfG,
MC

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.