Hallo ich hoffe Ihr könnt mir helfen. Es geht um folgende Aufgabe, siehe
Anhang. Soweit habe ich es hinbekommen, nun worüber ich mir nicht sicher
bin ist die wartezeit im Timer, nämlich der Wert -5000. In der Aufgabe
steht, damit es flimmerfrei verläuft, sollen min 100 mal in der sekunde
realisiert werden. Nun war meine überleung 12MHz / 200 = 60000. Mir
wurde empfohlen den wert -5000 sowohl in der low als auch in den
highteil einzugeben. Verstdanden habe ich es nicht. Ich hoffe ihr könnt
mir da behilflich sein. Zweites problem ist die sache mit dem Interrupt.
Man kann diese aufgabe über einen irq machen. Nun weiss ich leider nicht
wie ich da vorgehen soll. Was muss ich am Programm ändern damit das
ganze mit dem irq läuft? Ich wäre euch sehr verbunden, wenn ihr mir eure
mögliche lösung mit komments senden würdet.
Vorüberlegung für irq:
setb PT0 ; prio hoch
setb ET0 ; interruptfreigabe für timer0
setb EA ; glob Interruptfreigabe
dann fehlt mir leider das know-how :(
Arthur schrieb:> Mir wurde empfohlen den wert -5000 sowohl in der low als auch> in den highteil einzugeben.
Wenn dir klar ist, was eine negative Zeit sein soll ??? Guter Tip:
Schlage diese sinnfreie Empfehlung in den Wind.
Überlege dir, was ein Timer ist, welchen Zahlenbereich Low- und
High-Byte vom Zähler abdecken und ob dann negative Werte dort überhaupt
etwas zu suchen haben.
Arthur schrieb:> Mir wurde empfohlen den wert -5000 sowohl in der low als auch in den> highteil einzugeben.
Du hast GRUNDLEGENDE Probleme beim Verständnis der Assemblersyntax!
Hier wird das höherwertige Byte von -5000 = 65536-5000 = 60536 = 0xEC78
--> 0xEC nach in das Timer-Highbyte eingetragen, und das untere Byte
0x78 in das Timer-Lowbyte:
> mov th0, #high(-5000);> mov tl0, #low(-5000);Arthur schrieb:> Nun war meine überleung 12MHz / 200 = 60000.
Falsch! Da fehlt irgendwas!
So wärs richtig: 12MHz / 200Hz = 60000
Oder so: 12MHz / 200Hz = 60000Hz
Arthur schrieb:> Nun weiss ich leider nicht wie ich da vorgehen soll. Was muss ich> am Programm ändern damit das ganze mit dem irq läuft?
Du mußt den Timerinterupt initialisieren und den passenden
Interruptvektor dazu belegen.
EDIT:
> -5000, also eine negative Zahl, hat keinen Sinn, wenn man nicht gerade> im Zweierkomplement rechnet. Der Mikro kennt keine negativen Zahlen.
Aber der 8051-Assembler kann gut damit rechnen...
Dort war und ist es üblich, die nötigen Zählschritte negativ anzugeben.
Der Zähler zählt dann hoch und erzeugt beim Überlauf nach 0 einen
Overflow/Interrupt.
Arthur schrieb:> Nun war meine überleung 12MHz / 200 = 60000. Mir> wurde empfohlen den wert -5000 sowohl in der low als auch in den> highteil einzugeben. Verstdanden habe ich es nicht.
Schau mal in das Datenblatt Deines 8051, die meisten teilen den Quarz /
12.
Wie kommt man also von 60000 auf 5000?
Wie kommt man nun auf -5000?
Der Timerüberlauf wird gesetzt beim Zählen von 0FFFFh auf 0 oder im
Zweierkomplement gesehen von -1 auf 0.
So und wie lange dauert nun das Zählen von -5000 auf 0?
Der Timer besteht aus 2 Registern und der 8051 kann keinen
16Bit-Zugriff.
Also muß man die -5000 in Low- und High-Byte zerlegen und dann einzeln
laden.
Vorzugsweise das High-Byte zuerst, da ja das Low-Byte gerade
übergelaufen war, also nicht im nächsten Takt gleich wieder überlaufen
wird.
Arthur schrieb:> wait:> jbc tf0, _wait1 ; warte bis overflow> jmp main
Das hatte ich bestimmt nicht so geschrieben!
Peter