www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TH0/TL0


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese Werte stehen aber  nirgendswo...mann muss doch irgendwie auf diese 
Hexzahlen kommen???

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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????

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:
...
        preload equ -1000
...
        mov     #th0, high(preload)
        mov     #tl0, low (preload)
...

Es kommt genau der gleiche Code raus.


Peter

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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
qwuselmimrpf equ 12345

schreiben und verwenden.

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


Peter


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.