Hi !
nachdem mir hier etliche Hilfestellung und Beispiele gegeben haben, hier
mal mein Beispielprog.
Es funktioniert bis auf die Interruptroutine.
Möchte, wenn ein gültiges Signal (0,7 bis 2,3 ms) anliegt, eine Lampe
(im Text search auf pb4) schalten.
Aber es funktioniert net.
Vielleicht seid ihr so nett und schaut mal über den Quältext ;))) (Ist
mein erstes Prog in Assembler seit der 64er Ära)
Hi Jürgen,
beim schnellen Drüberlesen fällt mir erstens auf, dass Du TCNT0 in
Deiner Interrupt-Routine auf NULL setzt, ohne vorher den Zähler-Inhalt
zu lesen. Ein paar Zeilen weiter versuchst Du (sollte statt ldi auch
in heißen!!), den Zähler-Inhalt zu lesen, der dürfte dann aber (bei
etwa 5,3ms/Zähler-Tic) noch Null sein!
EXT_INT_handler:
...
out TCNT0, NULL ; ????
....
reti
FALLING_EDGE:
...
ldi puls, TCNT0
; Du hast Deinen Zähler doch gerade genullt!
; ... zudem müsste es in heißen!
Drittens ist mir nicht klar, wieso Du für EXT_INT_handler und für
Falling_Edge das gleiche Register ("saveSREG") zum Sichern des
Status-Regs benutzt.
Viertens: Statt
in NULL, 0x00
meinst Du sicher clr NULL
oder /ldi reghigh, 0/
/mov NULL,reghigh/
Wie gesagt, ich habe nur ganz schnell über Deinen Code gesehen, es
können durchaus noch mehr Käfer drin sein!
Gruß
Fred
Hi !
dank Dir für die Antwort.
Wenn ich mich nicht verrechnet habe sind
1,2MHz 1 clk 0,000000833s ~0,83µs
prescale 64
1,2MHz / 64 1 clk 0,000053333s ~53µs ~0,053ms
Den Timer setze ich bei steigender Flanke auf null, weil ich die Länge
des Impulses messen möchte. Bei der Funke von 0,7ms minimum bis 2,3ms
maximum
Liegt der puls dazwischen ist er gültig. Dann LED an.
__|TCCR0=0 ----|__lesen TCCR0 für die Länge
Vielleicht bin ich ja betriebsblind. habe ich etwas übersehen oder einen
Denkfehler ??
Habe das gleiche Register zum Sichern gewählt, weil ja der Puls
unterschiedlich lang sein kann. Vor verlassen der jeweiligen Routine
wird SREG ja wieder restauriert.
Grüße
Jürgen
Hallo Jürgen,
Deine TimerTic-Länge stimmt, ich habe mich versehen.
Aber:
> __|TCCR0=0 ----|__lesen TCCR0 für die Länge
Was Du damit meinst, verstehe ich nicht.
Du springst aus Deinem INT0-Handler, wo Du TCNT0 auf 0 gesetzt hast,
nach FALLING_EDGE, wo Du TCNT0 nach "puls" einlesen willst (falsche
Syntax!). Dann wertest Du "puls" aus. "puls" ist dann aber höchsten
eins!
Ich bin nicht sicher, ob Du nicht ein grundsätzliches Problem mit dem
Verständnis der Syntax hast; Du verwechselst mehrmals in mit ldi
usw.
Gruß
Fred
Hi !
Also, wie beschrieben, mein erstes Assemblerprogramm seit der Steinzeit.
ldi ist für Register R16-R31 load immediately.
in bzw. out für SFR Register. Liege ich da richtig?
Fällt mir noch ein bisschen schwer, der Wiedereinstieg.
Deshalb, Danke für Euer Engagement.
Grüße und schönen Sonntag vom
Käfersuchenden
Jürgen
@fred: wenn die steigende Flanke kümmt, TCNT0=0
wenn fallende, Impuls ende, TCNT0 auslesen
zulässiger Bereich 0,7 bis 2,3 ms