Meine Idee ist:
Bei jedem Overflow des Counter1 wird ein Interrupt ausgeführt, dieser
gibt 0h81 an die serielle Schnittstelle aus. Das scheint auch ganz gut
zu funktionieren.
Wenn der Taster gedrückt wurde (ich würde hier gerne auf die steigende
Flanke triggern), soll der aktuelle Wert des Counters ausgegeben werden.
Hier hakt es jedoch und der µC gibt nur Mist aus (meist nur ein Wert,
und zwar 0h26). Kann mir da jemand helfen?
Was mir beim schnellen durchsehen aufgefallen ist ;)
> rjmp putChar
"rcall putChar" ist bestimmt besser...
in den ISRs solltest du das SREG sichern, kannst ja z.B. eins der
Register r2-r15 entbehren:
1
.def sreg_bak = R2
2
;...
3
on_TC1:
4
; cli, sei sind in den ISR i.d.R. unnoetig!
5
IN sreg_bak, SREG
6
push r16
7
ldi r16,129
8
RCALL putChar
9
pop r16
10
OUT SREG, sregbak
11
reti
- ich hab die Zugriffsreihenfolge bei den 16-Bit Registern (TCNT1, ICR1,
etc.) grad nicht im Kopf, schau das lieber nochmal nach ;)
> sbis UCSRA,5
"sbis UCSRA, UDRE " liest sich besser, benutz das ruhig bei allen
I/O-Registern
hth. Jörg
> ldi r16,ICR1L> rjmp putChar> ldi r16,ICR1H
Du weißt, was ldi macht? Dann weißt Du vermutlich auch, dass ldi hier
sicher nicht das macht, was Du willst. Versuch es mal mit
1
inr16,ICR1L
Übrigens: ICR1L hat die Adresse 0x26. Jetzt weißt Du auch, wo die 26
herkommt...
> on_TC1: cli> ...> on_ICP: cli
Das cli kannste Dir sparen. Das macht der Controller automatisch beim
Einsprung in den Interrupt-Vektor.
> sei> ret
Und das ebenfalls unsinnig. Dafür gibts reti.
Also: Das I-Bit im SREG wird beim Sprung in einen Interrupt-Vektor
automatisch von der Hardware gelöscht. Zum Rücksprung aus dem Interrupt
Handler gibt es den Befehl reti, der im Unterschied zu ret (ohne i)
dafür sorgt, dass beim Rücksprung das I-Bit wieder gesetzt wird.