mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 Timer TH0-Wert


Autor: Martin Wi (martini)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits :),


void isrtim0() interrupt 1
{
  TH0=-98;
  counter++;
}

das wär meine Frage, wie kommt man dazu, TH0 mit einen negativen Wert zu 
laden? Und warum entfällt dann TL0?

(Timer befindet sich in Betriebsart 1)

lg martini

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>das wär meine Frage, wie kommt man dazu, TH0 mit einen negativen Wert zu
>laden?

Das ist für Leute, die nicht wissen, daß ein 8-Bit-Register von 255
(0xFF) auf 256 (0x00) überläuft ;-)
Genauso hätte man TH0 mit 158 laden können, der Timer zählt dann
98 Schritte hoch, bis er 256 erreicht.
Na ja, läßt sich halt leichter lesen.

> Und warum entfällt dann TL0?

Wenn beim Interrupt die µs keine Rolle spielen (z.B. Tastenentprellung)
braucht man TL0 nicht voreinstellen. TL0 hat dann den Resetwert (0).

Autor: Martin Wi (martini)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, nur stellt sich mir die frage wie -98 dargestellt wird dann, mitn 
taschenrechner hab ichs versucht:

1111111111111111111111111111111111111111111111111111111110011110

da kommt das raus, da es nur ein 8 bit register ist, werden nur die 
hinteren 8 bit dann verwendet? die vorderen quasi einfach verworfen??

also wärs dann 10011110 und das ist 158...soweit richtig?

das mit TL0 versteh ich noch nicht ganz, bis jetzt haben wir eig immer 
beide Register mit Werten beschrieben, also immer als 16 Bit Timer 
verwendet. Hier wird ja genauso ein 16 Bit Zähler verwendet, aber nur 
TH0 verwendet? könnte ich genauso gut TL0 verwenden?

und das mit µs, inwiefern keine Rolle spielen? hm da fehlt mir noch 
einiges ^^

aber danke für deine Antwort.

lg

Autor: MC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>könnte ich genauso gut TL0 verwenden?
Nein.
Bei einem Überlauf des Timers sind die Timerregister gleich 0. Wenn du 
nur TH0 beschreibst, so steht in TL0 immer noch 0. Würdest du aber TL0 
beschreiben, ergäbe sich eine andere Ablaufzeit des Timers.

Das Phänomen TH0=-98 lässt sich mit negativen Dualzahlen erklären.
Schau mal hier rein (Kapitel 3.2 ab Seite 4):
http://www.m-if.de/2006-7/IF10/Skript%20IF10%20-%2...

Ich hoffe, dass hilft dir.
Gruß,
MC

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zweierkomplement heißt das Zauberwort. Negative Werte werden in 
Zweierkomplement-Darstellung verarbeitet. Die -98 wird in den 
entsprechenden Hexadezimalwert 9E (bei 8 Bit Breite, bei 16 Bit wären es 
entsprechend FF9E, und der Windows-Taschenrechner hat eben einen noch 
höheren Wertebereich und baut deshalb noch eine ganze Stange Fs ein) 
umgewandelt.

Autor: Martin Wi (martini)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey,

soweit so gut, is schon wieder ne weile her mit dem zweierkomplement und 
so ^^, ja das hilft mir sehr, muß mich wieder mehr damit beschäftigen, 
anscheined verfolgt das einem noch öfters ^^.

danke für eure hilfreichen u schnellen antworten

lg

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und das mit µs, inwiefern keine Rolle spielen? hm da fehlt mir noch
>einiges ^^

Nehmen wir an, der µ läuft mit 12MHz und TH0 enthält 156. Wenn TL0
0 enthält, dann dauert es 100*256 µs = 25,60 ms bis der Timer überläuft
und der Interrupt ausgelöst wird.

Wenn jetzt TL0 mit 206 geladen wird, dauert es 25,55 ms bis der Timer
überläuft, also 50µs weniger (TL0 wird jede µs inkrementiert).

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das Low-Byte des Reloadwertes 0 ergibt oder es nicht so drauf 
ankommt, reicht es nur TH0 zu laden.

Wenn man aber auch TL0 laden will, wird es etwas tricky, da ja ständig 
Zyklen vergehen (TL0 läuft weiter), aber die Zeit bis zum 
Interrupteintritt unbestimmt ist.

In diesem Fall muß man unbedingt die seit dem Überlauf vergangene Zeit 
berücksichtigen, d.h. der Reload muß durch Addition zu der bereits 
vergangenen Zeit erfolgen. Und die Zeit für die Addition selber muß 
natürlich auch berücksichtigt werden.

Hier ein Beispiel:

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


Peter

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.