| include "tn24def.inc"
.def temp1 = r16
.def temp2 = r17
.org $0000
rjmp reset
.org OVF1addr
rjmp OVF1Handler
.org $0020
reset:
ldi temp1,low(ramend)
out spl,temp1
sbi ddra,5
//usi Module OFF
sbi prr,1
//wdt off
rcall init_wdt
rcall init_timer_0
rcall init_timer_1
rcall init_adc
sei
endless:
//sleep enable
ldi temp2,0b00100000
out mcucr,temp2
sleep
rjmp endless
OVF1Handler:
in temp1,adch
cpi temp1,$80
brlo turnon
cpi temp1,$81
brsh turnoff
rjmp exit_ovf1
turnoff:
//Stop Timer0 and turn it off
sbi prr,2
//Port ebenfalls abschalten, denn der könnte HIGH sein...
cbi ddra,7
rjmp exit_ovf1
turnon:
//Start Timer in Fast PWM mode
cbi prr,2
sbi ddra,7
exit_ovf1:
reti
init_timer_0:
//Periodendauer in OCR0A
ldi temp1,$40
out ocr0a,temp1
//Pulslänge in OCR0B
ldi temp1,$10
out ocr0b,temp1
//Fast PWM mode
ldi temp1,0b00100011
out tccr0a,temp1
//Start Timer in Fast PWM mode
ldi temp1,0b00001001
out TCCR0b,temp1
//Turn off Timer 0
sbi prr,2
ret
init_timer_1:
//Enable Timer_Interrupt
ldi temp1,0b00000001
out TIMSK1,temp1
//Start Timer in Free Running Mode, Prescaler 8
ldi temp1,0b00000010
out TCCR1b,temp1
ret
init_adc:
//internal reference, input auf PA3
ldi temp1,0b10000011
out admux,temp1
//all digital_input_off
ldi temp1,0b11111111
out didr0,temp1
//left adjust
ldi temp1,0b00010000
out adcsrb,temp1
//free running, clc/128
ldi temp1,0b11100111
out adcsra,temp1
ret
init_wdt:
//wdt off, lt Datenblatt
ldi temp1,(0<<WDRF)
out MCUSR,temp1
in temp1,WDTCSR
ori temp1,(1<<WDCE)|(1<<WDE)
out WDTCSR,temp1
ldi temp1,(0<<WDE)
out WDTCSR,temp1
ret
|