Ich wollte mit SBI TCCR0, CS02 ein Bit in den Register setzen, aber der Compiler meldet: "Out of range".
Mit LDI temp, 0b00000100 und dann OUT TCCR0, temp hat es dann geklappt. Aber jetzt frage ich mich, wie ich einzelne Bits in dem Register manipulieren kann, ohne andere zu beeinflussen?
Noch was:
Ne ganz komische Sache. Beim ersten Überlauf wird der Interrupt aktiviert, alles ok. Der TOV0 Flag wird auch (automatisch) zurückgesetzt und die LED geht an. Beim zweiten Überlauf kommt das Programm aber nicht mehr aus der loop-Schleife und der TOV1 Flag wird zwar gesetzt, aber nicht mehr gelöscht. Auch die Befehle ldi temp, (1<<TOV0) und out TIFR, temp haben da nicht gebracht. Woran liegt das?
Hier der Quellcode:
Code:
.include "m8def.inc"
.def temp = r16
.org 0x000
rjmp main ; Reset Handler
.org OVF0addr
rjmp timer ; Timer0 Handler
main:
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp
sbi DDRD, PD5
cbi DDRD, PD2
ldi temp, 0b00000001
out TCCR0, temp
ldi temp, 0b00000001
out TIMSK, temp
sei
loop:
rjmp loop
timer:
sbis PORTD, PD5
rjmp setLED
sbic PORTD, PD5
rjmp clrLED
setLED:
sbi PORTD, PD5
ldi temp, (1<<TOV0)
out TIFR, temp
rjmp loop
clrLED:
cbi PORTD, PD5
ldi temp, (1<<TOV0)
out TIFR, temp
rjmp loop
Lesezeichen