Forum: Projekte & Code 16bit-Aufwärtszähler


von Thomas Strauß (Gast)


Lesenswert?

Man kann auf 8051ern und Derivaten, die ja bekanntlich nicht über viele 
16bit - Möglichkeiten verfügen, auf einfache Weise 16bit-Zähler 
realisieren, die zwar nicht so schön sind wie der incw-Befehl des Z8 und 
Nachfahren (Zilog), aber funktionieren!


Entweder durch Ketten von Registern, klar, aber auf nicht gerade die 
optimale Lösung.

Oder mit dem Befehl  inc DPTR

aber auch mit folgenden zwei Befehlen: setb TR0
                                       clr TR0

vorausgesetzt, der Timer0 läuft im 16bit-Modus (orl TMOD,#1)
zählt der Timer dann genau einmal hoch.

Dauer der Befehle: 2 Mikrosekunden bei 12Mhz

Leider ist das Ergebnis nicht auf Registern abgelegt.
Aber man hat einen echten 16bit-Aufwärtszähler realisiert.

von Peter D. (peda)


Lesenswert?

Das geht aber nur, wenn keine Interrupts verwendet werden, sonst zählst 
Du zu viel, wenn ein Interrupt zwischen "setb TR0" und "clr TR0" 
zuschlägt.

Besser ist es aber, man zählt direkt im RAM.

Das hat den Vorteil, man verschwendet nicht die kostbaren Timer und kann 
auch bis zu 64 Zähler bilden:

inc 7Fh
xch a, 7Fh
jnz label1
inc 7Eh
label1:
xch a, 7Fh

Das ändert auch keine Flags, d.h. man kann es auch in Interrupts machen 
ohne A und PSW zu sichern.


Beim AVR sähe das so aus:

push r15
in r15, sreg
push r24
push r25
lds r24, 0x7F
lds r25, 0x7E
adiw r24, 1
sts 0x7F, r24
sts 0x7e, r25
pop r25
pop r24
out sreg, r15
pop r15


Peter

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
Noch kein Account? Hier anmelden.