Code:
.include "m8def.inc"
.def temp = r16 ; Arbeitsregister
.def temp2 = r17 ; Arbeitsregister
.equ CLOCK = 8000000
.dseg
timer_1: .byte 1 ; 8 Bit
timer_6: .byte 1 ; milisekunden Zähler
.cseg
.org 0x000
rjmp Prog_Initial ; Interruptvektoren überspringen
reti ; INT0addr - Externer Interrupt 0
reti ; INT1addr - Externer Interrupt 1
reti ; OC2addr - Output Compare2
reti ; OVF2addr - Overflow2
reti ; ICP1addr - Input Capture1
reti ; OC1Aaddr - Output Compare1A
reti ; OC1Baddr - Output Compare1B
reti ; OVF1addr - Overflow1
rjmp delay ; OVF0addr - Overflow0
reti ; SPIaddr - SPI
reti ; URXCaddr - USART Receive Complete
reti ; UDREaddr - USART Data Register Empty
reti ; UTXCaddr - USART Transmit Complete
reti ; ADCCaddr - Analog Digital wandler
reti ; ERDYaddr - EEPROM
reti ; ACIaddr - Analog Comparator
reti ; TWIaddr - Two - Wire Interface
reti ; SPMaddr - SPM complete
Prog_Initial:
;*********************************************************
; Stack Pointer setzen *
;*********************************************************
ldi temp, LOW(RAMEND) ; Stack Pointer low
out SPL, temp ; setzen
ldi temp, HIGH(RAMEND) ; Stack Pointer high
out SPH, temp ; setzen
;********************************************************
;* Init Timer / Counter 0 *
;********************************************************
;Preclaer Divisions Factor = 64
ldi temp, 131 ; Counter = (256 - 125)
out TCNT0, temp ; nach 125 Takten erfolgt ein Überlauf
ldi temp, 0b00000011 ; CS00 + CS01 = 1
out TCCR0, temp ; Prescaler Division = 64
in temp, TIMSK
ori temp, 0b00000001 ; Interrupt
out TIMSK, temp ; erlauben
;*********************************************************
;* Init LEDs *
;*********************************************************
sbi DDRB, DDB0 ; Duo LED grün
sbi DDRD, DDD2 ; Duo LED rot
cbi PORTB, PORTB0 ; aus
cbi PORTD, PORTD2 ; schalten
sbi DDRD, DDD6 ; Front LED
cbi PORTD, PORTD6 ; aus
sbi DDRD, DDD7 ; Back LEDs
cbi PORTD, PORTD7
sbi DDRC, DDC0
sbi DDRC, DDC1
cbi PORTC, PORTC1
cbi PORTC, PORTC1 ; ausschalten
ldi temp, 0x00
sts timer_1, temp ; max
sts timer_6, temp ; max 255 mili Sekunden
sei ; Interrupts erlauben
;**************** Ende Init ****************************
Prog_Run:
loop:
rcall back_led_l_on;
rcall back_led_r_on;
ldi temp2, 1 ; 1 sekunde nichts tun
rcall wait_timer_1
rcall back_led_l_off
rcall back_led_r_off
ldi temp2, 1 ; 1 sekunde nichts tun
rcall wait_timer_1
rjmp loop
;*********************************************************
;* Interrupt Routine für Timer 0 *
;*********************************************************
delay:
push ZH
push ZL
push temp2
push temp
in temp, SREG
push temp ; sichern
lds temp, timer_6 ; Milisekunenden
inc temp ; Zähler
sts timer_6, temp ; + 1
adiw r25:r24, 1 ; Counter + 1
ldi temp, 0xE8 ;0xE8 ; 0x03E8 = 1000
ldi temp2, 0x03 ;0x03
cp r24, temp ; Counter Low / 16 Bit compare
cpc r25, temp2 ; Counter High
brne next_step ; noch keine Sekunde vergangen
lds temp, timer_1 ; erhöhe die Sekunden Zähler um 1
inc temp
sts timer_1, temp
ldi r24, 0
ldi r25, 0
next_step:
ldi temp, 131 ; Counter Register
out TCNT0, temp ; neu Vorbelegen
pop temp ; Register
out SREG, temp
pop temp
pop temp2
pop ZL
pop ZH ; wieder herstellen
reti
;********************************************************
;* Hintere LED rechts Ein *
;********************************************************
back_led_r_on:
sbi DDRD, DDD7
cbi PORTD, PORTD7
sbi DDRC, PORTC0
sbi PORTC, PORTC0
ret
;*******************************************************
;* Hintere LED rechts Aus *
;*******************************************************
back_led_r_off:
cbi PORTC, PORTC0
ret
;******************************************************
;* Hintere LED links Ein *
;******************************************************
back_led_l_on:
sbi DDRD, DDD7
cbi PORTD, PORTD7
sbi DDRC, PORTC1
sbi PORTC, PORTC1
ret
;******************************************************
;* Hintere LED links Aus *
;******************************************************
back_led_l_off:
cbi PORTC, PORTC1
ret
;***************************************************************
;* warten auf timer_1 *
;* in temp2 wird die Verzögerungs Zeit in Sekunden übergeben*
;***************************************************************
wait_timer_1:
push temp2 ; Register
push temp
in temp, SREG
push temp ; sichern
ldi temp, 0x00 ; timer_1
sts timer_1, temp ; auf Null setzen
w_t_1:
lds temp, timer_1
cp temp, temp2 ; timer_1 => temp2
brsh ret_t_1 ; ja
rjmp w_t_1
ret_t_1:
pop temp ; Register
out SREG, temp
pop temp
pop temp2 ; wieder herstellen
ret
;******************************************************************************
;* warten auf timer_6 *
;* in temp2 wird die Verzögerungs Zeit in mili Sekunden übergeben *
;******************************************************************************
wait_timer_6:
push temp2 ; Register
push temp
in temp, SREG
push temp ; sichern
ldi temp, 0x00 ; timer_6
sts timer_6, temp ; auf Null setzen
w_t_6:
lds temp, timer_6
cp temp, temp2 ; timer_6 => temp2
brsh ret_t_6 ; ja
rjmp w_t_6
ret_t_6:
pop temp ; Register
out SREG, temp
pop temp
pop temp2 ; wieder herstellen
ret
Lesezeichen