.INCLUDE "tn13def.inc" .EQU LED_OFF = 0b00000000 .EQU LED_RED = 0b00010000 .EQU LED_GREEN = 0b00100000 .EQU LED_MSK = 0b00110000 ; use PB5 and PB4 for Dual-LED .EQU RELAIS_1 = 0b00000001 .EQU RELAIS_2 = 0b00000010 .DEF led_counter = r0 .DEF led_color = r1 ; current color of the LED .DEF led_intervall = r2 ; blink speed (1..255, 0 - no blinking) .DEF key_state = r3 .DEF akku = r16 .DEF tmp_led_color = r17 .CSEG .ORG $00 rjmp start ; reset handler .ORG TIM0_OVF0addr rjmp timer ; ISR for each timer overflow .ORG $10 start: ldi akku, LOW(RAMEND) ; initialize stack out SPL, akku ldi akku, 0x33 ; initialize data directions out DDRB, akku ldi akku, 0x2A ; load blink intervall mov led_intervall, akku ldi tmp_led_color, LED_RED ; load color for LED mov led_color, tmp_led_color clr led_counter ; clear working registers clr akku out PORTB, tmp_led_color sbi PORTB, PORTB1 ; Timer stuff ldi akku, 0x03 ; set a prescaler of 64 out TCCR0B, akku in akku, TIMSK0 ; enable timer overflow interrupt ori akku, 0x02 out TIMSK0, akku sei loop: rjmp loop BlinkLED: clr led_counter in akku, PORTB andi akku, LED_MSK ; check the current LED-status cp akku, led_color ; if LED is switched on... brne SetLED ldi tmp_led_color, LED_OFF ; then turn it off... rjmp timer2 SetLED: mov tmp_led_color, led_color ; ...else enlighten the LED in your favorite color rjmp timer2 timer: push akku ; save status-registers in akku, SREG push akku ; save working register inc led_counter cp led_counter, led_intervall breq BlinkLED mov akku, led_intervall cpi akku, 0x00 ; intervall=0 -> don't blink brne timer2 ; (necessary to avoid led_counter overflow) dec led_counter timer2: out PORTB, tmp_led_color sbi PORTB,PORTB1 ; TODO: save other PORTB outputs sbi PORTB,PORTB0 clr akku ; reset timer to keep nearly constant intervalls out TCNT0, akku pop akku ; restore status- and working registers out SREG, akku pop akku reti