Frequenzzählprogramm - Timer in 8051

1.MOV TMOD,#15H
2.SETB P3.4
3.MOV R1,#28
4.MOV TL0,#00H
5.MOV TH0,#00H
6.MOV TL1,#00H
7.MOV TH1,#00H
8.SETB TR0
9.HERE2: SETB TR1
10.HERE: JNB TF1, HERE
11.CLR TF1
12.CLR TR1
13.DJNZ R1, HERE2
14.CLR TR0
15.CLR TR1
 

Dieses oben geschriebene Programm dient zum Zählen der Impulsfrequenz, die am Pin p3.4 anliegt. Wir verwenden Timer 0 als Zähler und Timer 1 als normalen Timer. In Zeile 10 verschwendet die Steuerung etwa 35,75 ms. Um also Timer 0 für etwa 1 Sekunde aktiv zu machen, verwenden wir Zeile 10 28 Mal.

Geben Sie hier die Bildbeschreibung ein

Aber hier im Bild in Zeile 14 haben sie die DJNZ auf Zeile 8 verwiesen, warum? Was bringt es, das Register wieder mit 00 aufzufüllen? Sie hätten den TF1 einfach löschen können, um den Timer wieder bei 00 zu starten, stattdessen stoppen sie den Timer in Zeile 13 und starten ihn nach dem Füllen mit 00 erneut.

Warum muss der Timer gestoppt und wieder mit 00 gefüllt werden? Wird nicht nur das Löschen von TF1 (während TR1 eingestellt bleibt) dazu führen, dass der Timer wieder bei 00 beginnt? Da der Rollover-Wert bereits 00 ist und nach dem Überlauf in den Timer geladen wird. Ist es nicht so, dass das erste Programm in Bezug auf die Genauigkeit besser funktioniert?

Die lange Kommentarkette hat das Zumutbare für Kommentare überschritten. Daher wurde es in den Chat verschoben und soll dort weitergeführt werden (Link unten). --- Da diese Massenverschiebung von Kommentaren in den Chat nur einmal pro Frage erfolgen kann, können alle weiteren hier geposteten Kommentare, die versuchen, die Frage zu diskutieren, ohne Vorankündigung gelöscht werden. Bleiben Sie bitte im Chat! Wenn jemand genug Informationen aus dem Chat erhalten hat, um eine Antwort zu posten, dann tun Sie dies bitte. Alle Verbesserungen / Aktualisierungen der Frage, die während des Chats entschieden werden, sollten wie üblich über eine Bearbeitung der Frage vorgenommen werden. Danke.
Kommentare sind nicht für längere Diskussionen gedacht; diese Konversation wurde in den Chat verschoben .

Antworten (1)

Hängt davon ab, was die Absicht des Benutzers mit Timer ist.

Wenn die Absicht des Benutzers war, einen 16-Bit-Timer zu implementieren, der einfach von 0x0bis läuft 0xFFFF, überläuft und dann erneut durchläuft (z. B. um eine periodische Aufgabe zu erledigen):

JA, er musste den Timer nach dem Überlauf nicht stoppen und dann mit neu laden 0x0. Da TR1noch gesetzt ist, startet der Timer sowieso nach dem Überlauf ab 0x0und zählt wieder hoch. In diesem Fall TF1würde eine Entrümpelung ausreichen.

Beachten Sie, dass : das Löschen TF1den Timer nicht zurücksetzt/neu lädt.