Forum: Mikrocontroller und Digitale Elektronik TH0/TL0


von Thomas (Gast)


Lesenswert?

Hab da ein kleines Prbolem bei folgendem Programm:

ORG 0000H
LJMP 0400H
ORG 000BH
LJMP 0600H

ORG 0000H
CLT TRO
MOV TMOD,#05D
CLR TF0
MOV THO,#0FC     WIE KOMMT MAN AUF DIESEN WERT?
MOV TLO,#18H     WIE KOMMT MAN AUF DIESEN WERT?
MOV P1,#00h
.
.
.
.
usw

Aufgabe ist es nach jedem 1000 Impuls soll Port P1.0 invertiert werden.
Für meine Antwort brauch ich die 1000, aber ich weis nicht weiter???

von Stefan (Gast)


Lesenswert?

Grundsätzlich steht das im Datenblatt vom 8051 im Abschnitt über den 
Timer0. Für die konkreten Werte muss die Taktrate berücksichtigt werden.

Tutorial:
http://www.8052.com/tuttimer.phtml

von Thomas (Gast)


Lesenswert?

Diese Werte stehen aber  nirgendswo...mann muss doch irgendwie auf diese 
Hexzahlen kommen???

von Stefan (Gast)


Lesenswert?

Die rechnest du dir so aus, dass sie zu deiner Anwendung passen.

Angenommen der Timer0 arbeitet als 16-Bit-Timer (TMOD aufdröseln) und 
der Timer ist mit 0xFC * 256 + 0x18 = 252 * 256 + 24 = 64536 vorbelegt. 
Bei laufenden Timer0 wird dieser Wert jeweils um 1 erhöht.

Dann tritt 65536 - 64536 = 1000 Timerklicks später ein Überlauf nach 0 
auf, was einen Interrupt auslösen kann, auf den dein Programm reagieren 
kann. Bingo.

von Thomas (Gast)


Lesenswert?

Versteh ich irgendwie nicht...wie kommst du auf diese formel, und 
deswegen weis ich eigentlich immer noch nicht wie mann, wenn man 1000 
gegeben hat, auf 0FCH und 18H kommt????

von Peter D. (peda)


Lesenswert?

Thomas wrote:
> MOV THO,#0FC     WIE KOMMT MAN AUF DIESEN WERT?
> MOV TLO,#18H     WIE KOMMT MAN AUF DIESEN WERT?

So schreiben es nur Leute, die ihre Quelltexte möglichst unleserlich 
haben wollen.

Besser schreibt man:
1
...
2
        preload equ -1000
3
...
4
        mov     #th0, high(preload)
5
        mov     #tl0, low (preload)
6
...

Es kommt genau der gleiche Code raus.


Peter

von Thomas (Gast)


Lesenswert?

Okay, ich komm jetzt drauf, aber is Preload immer 65536????

Hab von 65536 jetzt 1000 abgezogen, und dann das ergebniss in Hex 
umgewandelt...kann ich das immer so machen???

TH0= High
TL0= Low

Diese muss ja immer berechnen, ich meine gibt es da immer die gleiche 
vorgehensweise wie ich oben geschrieben hab???

von Peter D. (peda)


Lesenswert?

Schau mal in Dein Assemblerhandbuch, was die Anweisungen "high", "low" 
und "equ" bedeuten.

"preload" ist ein willkürlicher Text, dem mit "equ" ein Wert zugewiesen 
wurde.

Du kannst auch
1
qwuselmimrpf equ 12345

schreiben und verwenden.

Aber beachten, daß der 8051 Asseembler nur 16Bit Werte kann (0...65535 
bzw. -32768..+32767).


Peter


von Stefan (Gast)


Lesenswert?

16-Bit kann dein Timer hochzählen. Das ist hexadezimal von 0x0000 bis 
0xFFFF bzw. dezimal von 0 bis 65535 bzw. 65536 Timerticks.

Ja, das kannst du fast immer so machen. Fast, weil 65536 nicht der 
Preload ist (65536-1000 ist hier der Preload) und weil der 8051 hat auch 
andere Timermodi mit 8-Bit und 13-Bit. In diesen Fällen hättest du 
andere Werte statt der 65536 (8-Bit: 1+0xFF = 256 und 13-Bit: 1+0x1FFF = 
8192)

Dein Overflow-Interrupt tritt auf, wenn von 65535 auf 0 (0xFFFF => 0) 
gezählt wird (und er eingeschaltet ist).

Wenn du alle 1000 Timerticks einen Overflow-Interrupt haben willst, darf 
der Timer nicht bei 0 anfangen zu zählen. Er muss bei ... 65536 - 1000 
anfangen zu zählen. Also musst du das Timerregister mit dem Preload 
65536 - 1000 = 64536 vorladen.

Da dieser 16-Bit Wert in zwei 8-Bit Register geschrieben werden muss, 
wird er in ein Highbyte ("ganzzahlig dividiert durch 256") und ein 
Lowbyte ("Rest bei ganzzahliger Division durch 256") aufgespalten.

Peter nutzt mit dem Vorladen von -1000 elegant aus, dass 65536 bei 
16-Bit das gleiche ist wie der Wert 0. 0x0FFFF (65535) + 1 = 0x10000 
(0x10000) und beschnitten auf 16-Bit ist das eben 0x0000. 65536 - 1000 
== 0 - 1000 = -1000 als Preload. Der Trick klappt auch bei 8-Bit und 
13-Bit.

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.