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???
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
Diese Werte stehen aber nirgendswo...mann muss doch irgendwie auf diese Hexzahlen kommen???
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.
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????
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
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???
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.