Guten Tag zusammen, ich beginne gerade mit Assembler programmierung an einem 80C517 mit 12MHz und soll unter anderem eine kleine Zeitmessung programmieren. Die Messung soll mit einem Port gestartet und gestoppt werden. Und der Wert in ms über die serielle Schnitstelle ausgegeben werden. Meine erste Idee war es natürlich das ganze mit einem Timer zu realisieren. Ich hab mich erstmal für den timer1 entschieden, da ich durch das 16bit Register weniger Überläufe hab. mov TMOD, #00010001B clr tr0 mov TH0, #0H mov TL0, #0H clr tf0 Ich warte nun auf das Setzten des Ports und starte dann den timer jb P4.1,$ setb tr0 call Timer1 call Auswertung Timer1: jnb tf0,$ clr tf0 inc 2DH ;(Hier speicher ich die Timerüberläufe) jnb P4.1,Timer1 clr tr0 ret Die Auswertung des Wert klappt, sprich die Umrechnung von 1,2 Registern in ms oder µs und bisschen Textausgabe über die Schnittstelle bekomme ich hin. Mein größstes Problem ist gerade dass ich immer auf einen Timerüberlauf warte um diesen zu speichern und danach erst prüfe ob überhaupt noch gestoppt werden soll. Sprich im ungünstigsten Fall ist mein Ergebnis um ~65,5 ms falsch. Gibt es eine Möglichkeit den Timer direkt zu stoppen wenn mein Port 0 ist und dennoch die Überläufe zu zählen, sodass ich später den aktuellen Timerstand auslesen kann? Vielen Dank schonmal im Voraus
1 | Timer1:
|
2 | jnb tf0, _ti2 |
3 | clr tf0 |
4 | inc 2DH ;(Hier speicher ich die Timerüberläufe) |
5 | _ti2: |
6 | jnb P4.1, Timer1 |
7 | clr tr0 |
8 | ret
|
Beschäftige dich mit Interrupts. Bei jedem Timerüberlauf lässt sich ein Interrupt generieren und du zählst in der Interruptserviceroutine dein Register (2Dh?) hoch. Wenn Du über den Port das Stopp-Signal bekommst, wird nachgeschaut, wie viele Timerüberläufe in 2Dh stehen.
Wow schon mal vielen Dank für die schnellen Antworten. Die Idee von Peter ist ja wirklich simpel und funktioniert schon ganz gut -.- Vermutlich könnte es sein, dass man einen Überlauf nicht mitbekommt wenn man dabei gerade den Port 4.1 prüft. Die Wahrscheinlichkeit ist ziemlich klein aber vermutlich da. Die Interupts hören sich interessant an, da werde ich mich mal etwas einlesen. Nochmals vielen Dank!!
Marius M. schrieb: > Vermutlich könnte es sein, dass man einen Überlauf nicht mitbekommt Daher erst T0 stoppen und danach Überlauf addieren:
1 | Timer1:
|
2 | jnb P4.1, _ti2 |
3 | clr tr0 |
4 | _ti2: |
5 | jnb tf0, _ti3 |
6 | clr tf0 |
7 | inc 2DH ;(Hier speicher ich die Timerüberläufe) |
8 | _ti3: |
9 | jb tr0, Timer1 |
10 | ret
|
villeicht versteh ich etwas falsch, aber ich glaube damit ist das Problem noch nicht ganz behoben. Was ich meinte ist, dass der Prozessor durch das hin und her springen ~4 Maschinenzyklen = 4µs beschäftigt ist und so lange den Timerüberlauf nicht prüft. Sprich es besteht eine ~4:65536 Chance dass Überläufe nicht registriert werden. Trotzdem schon eine schöne Lösung. Aber ich denke ich versuche es mal mit den Interrupts. Ich habe mich dazu jetz ein wenig eingelesen aber ich finde noch nichts genaues wie ich Start und Ende der Interupt-Service-Routine in meinem Code markiere. Alles was ich finde sieht eher aus wie C:
1 | void INTTIM0 (void) interrupt 1 |
2 | {
|
3 | }
|
Auf jeden Fall meckert mein Compiler über unbekannte Zeichen. (Programmiere das ganze mit RIDE) Kennt sich damit jemand aus, oder geht das mit Ride überhaupt? Liebe Grüße Marius
Marius M. schrieb: > Was ich meinte ist, dass der Prozessor durch das hin und her springen ~4 > Maschinenzyklen = 4µs beschäftigt ist und so lange den Timerüberlauf > nicht prüft. Wen störts, der nächste Überlauf kommt doch erst nach 65536µs, das sollte wohl reichen.
Ach richtig da hatte ich doch nen Denkfehler, einfach zu warm heute... Das Überlaufflag wird ja gar nicht automatisch gelöscht, das bleibt ja stehen. Ja dann passt das ja so. Vielen Dank nochmals :D
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.