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