Code:
.NOLIST
.INCLUDE <m8def.inc>
.LIST
.def temp = r20
.def pwmval1 = r21
.def pwmval2 = r22
.def batval = r23
.CSEG
.org 0
; Interupt Vektoren
rjmp init ; Reset Handler
reti ; IRQ0 Handler
reti ; IRQ1 Handler
reti ; Timer2 Compare Handler
reti ; Timer2 Overflow Handler
reti ; Timer1 Capture Handler
reti ; Timer1 CompareA Handler
reti ; Timer1 CompareB Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART RX Complete Handler
reti ; UDR Empty Handler
reti ; USART TX Complete Handler
rjmp ADCfertig ; ADC Conversion Complete Handler
reti ; EEPROM Ready Handler
reti ; Analog Comparator Handler
reti ; Two-wire Serial Interface Handler
reti ; Store Program Memory Ready Handler
init:
;Stackpointer
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Aus/Eingänge
ldi temp, 248
out DDRC, temp ; PC0,1,2 als Eingang
ldi temp, 31
out DDRD, temp ; PD7,6,5 als Eingang
ldi temp, 255
out DDRB, temp ; PB1,2,3 als Ausgang
ldi temp, (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10) ; set PWM mode
out TCCR1A,temp
ldi temp, (1<<CS10)
out TCCR1B,temp
ldi temp, (1<<WGM20)|(1<<COM21)|(1<<CS20)
out TCCR2, temp
sei ; Generelle Interruptfreigabe
ldi pwmval1, 0
ldi pwmval2, 0
Main: ;----------------------------- Einsprungspunkt Main
ldi r24, 0
out OCR1AL, r24
out OCR2, r24
ldi r24, 0
out PORTD, r24
ldi r24, 0
out PORTB, r24
ldi r24, (1<<ADLAR)
out ADMUX, r24
ldi r24, (1<<ADEN) | (1<<ADSC) | (1<<ADIE); | (1<<ADPS2)
out ADCSRA, r24
off:
clr r25
out OCR1BL,r25
out OCR2, r25
run:
cpi batval, 161
brcs bat1
ldi r25,7
out PORTD, r25
rjmp check
bat1:
cpi batval, 138
brcs bat2
ldi r25,3
out PORTD, r25
rjmp check
bat2:
cpi batval, 127
brcs bat3
ldi r25,1
out PORTD, r25
rjmp check
bat3:
ldi r25,0
out PORTD, r25
check:
sbic PINB,7 ;check for pause button
rjmp full
sbic PIND,5 ;check for toggle switch
rjmp spec
sbic PINB,0 ;check for fire button
rjmp norm
sbic PINB,6 ;check for cursor button
rjmp norm
rjmp off
norm:
sbis PIND,7
rjmp norm1
ldi r25, 0
out OCR2, r25
out OCR1BL,pwmval2
rjmp run
norm1:
sbis PIND,6
rjmp norm2
out OCR2, pwmval1
out OCR1BL,pwmval2
rjmp run
norm2:
sbic PIND,7
rjmp off
sbic PIND,6
rjmp off
out OCR2, pwmval1
ldi r25, 0
out OCR1BL,r25
rjmp run
spec:
sbic PINB,0 ;check for fire button
rjmp spec0
sbic PINB,6 ;check for cursor button
rjmp spec0
rjmp norm
spec0:
sbis PIND,7
rjmp spec1
ldi r25, 0
out OCR2, r25
ldi r25, 255
out OCR1BL,r25
rjmp run
spec1:
sbis PIND,6
rjmp spec2
ldi r25, 255
out OCR2, r25
out OCR1BL,r25
rjmp run
spec2:
sbic PIND,7
rjmp off
sbic PIND,6
rjmp off
ldi r25, 255
out OCR2, r25
ldi r25, 0
out OCR1BL,r25
rjmp run
full:
ldi r24, 255
out OCR1BL,r24
out OCR2, r24
rjmp run
;--------------------------------- subroutines / irqs
ADCfertig:
sbic ADMUX, MUX0
rjmp pwm2adc
sbic ADMUX, MUX1
rjmp bat2adc
in pwmval1, ADCH
ldi temp, (1<<ADLAR)|(1<<MUX0)
out ADMUX, temp
ldi temp, (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2)
out ADCSRA, temp
rjmp ende
pwm2adc:
in pwmval2, ADCH
ldi temp, (1<<ADLAR)|(1<<MUX1)
out ADMUX, temp
ldi temp, (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2)
out ADCSRA, temp
rjmp ende
bat2adc:
in batval, ADCH
ldi temp, (1<<ADLAR)
out ADMUX, temp
ldi temp, (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2)
out ADCSRA, temp
ende:
reti
vielleicht hilft es ja dem einen oder anderen (regelbares PWM, etc.)
Lesezeichen