TH0/TL0

Gast #544730
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???
Gast #544743
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.
#544783
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
Gast #544795
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???
#544812
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

Gast #544884
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren