Danke, dann schreib' ich das Programm um.
edit: Habe Schwierigkeiten, das zu realisieren. Bin eben noch sehr unerfahren, was den Stack angeht.
Also ein Flowchart habe ich schonmal angefertigt. Mit dem Quellcode klappt das alleridngs noch nicht.
Bild hier
Der uC befindet sich zunächst in einer Endlosschleife. Im Interrupthandler vom Timer0 (Label timer) wird dann mit sbic abgefragt, ob die LED an ist. Wenn nicht, springt der uC zum Label LEDon. Dort wird die LED angemacht. Danach kehrt der uC ja aber wieder zurück zum Label timer. Dort steht leider der Befehl sbis, nach welchem der Sprung zu LEDoff steht.
Wie verhindere ich also, dass der uC nicht nach LEDoff springt, wenn er im selben Durchlauf schon in LEDon war?
edit²: Habe das jetzt so gelöst.
Code:
include "m8def.inc"
.def temp = r16
.def oldStatus = r17
.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
cbi PORTD, PD5
loop:
rjmp loop
timer:
sbic PORTD, PD5
rjmp LEDoff
sbi PORTD, PD5
reti
LEDoff:
cbi PORTD, PD5
reti
Ist das programmiertechnisch und stilistisch richtig?
Lesezeichen