Gast
#655196
Hi, habe mich an einem kleinen Lauflicht in Assembler versucht, leider wird nur die erste LED angeschaltet und das wars. Das Programm funktioniert als ein 1Hz LED Blinker (Led1 und 2) wenn in timer1_overflow die Zeilen invertiert werden (normale Zeilen ausdokumentiert, ausdokumentierte als normaler Code). Der Timer part läuft also schonmal, danach bewege ich mich allerdings auf Neuland. Was passieren soll: Led 3 aus, - beim ersten Durchlauf ist Led 3 aus Led 1 an, sleep Led 1 aus Led 2 an, sleep Led 2 aus Led 3 an Hat jemand eine idee was bei den Verzweigungen schief läuft? .def temp = r16 .def led1 = r17 .def led2 = r18 .def led3 = r19 .def lednumber = r20 .org 0x0000 rjmp main ; Reset Handler .org OVF1addr rjmp timer1_overflow ; Timer Overflow Handler main: ldi temp, LOW(RAMEND) ; Stackpointer initialisieren out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ;Port B auf Ausgang ldi temp, 0xFF out DDRB, temp ;Port C auf Ausgang ldi temp, 0xFF out DDRC, temp ;Nummer der Led ldi lednumber, 1 ; Vergleichswert für den Zähler ( ca 1Hz bei 12Mhz, Vorteiler 1024) ldi temp, high( 23437 ) out OCR1AH, temp ldi temp, low( 23437 ) out OCR1AL, temp ; CTC Modus einschalten, Vorteiler auf 1024 ldi temp, ( 1 << WGM12 ) | ( 1 << CS10 ) | ( 1 << CS12) out TCCR1B, temp ; OCIE1A: Interrupt bei Timer Compare ldi temp, 1 << OCIE1A out TIMSK, temp sei loop: rjmp loop ; Timer 1 overflow handler ; Mehrfachverzweigung, welche Led soll umgeschaltet werden timer1_overflow: ;out PORTB, r21 ;com r21 ;reti cpi lednumber, 1 breq led1on cpi lednumber, 2 breq led2on cpi lednumber, 3 breq led3on reti led1on: cbi PORTC, 0 sbi PORTB, 1 inc lednumber rjmp loop led2on: cbi PORTB, 1 sbi PORTB, 2 inc lednumber rjmp loop led3on: cbi PORTB, 2 sbi PORTC, 0 ldi lednumber, 1 rjmp loop