Code:
#define servoreg1 DDRA
#define servoreg2 DDRA
#define servoport1 PORTA
#define servoport2 PORTA
#define servopin1 PA0
#define servopin2 PA1
.def servo1 = R19
.def servo2 = R20
.include "m32def.inc"
.def tmp = R16 ; Allzweckregister
.def counter = R17 ; Counter für Timer-1-Zyklen
.def counter2 = R18 ; Counter für Timer-0-Zyklen
.equ Timer1AOVF = 200 ; 200 = 0,1ms bei prescaler 8
; 20 = 0,01ms bei prescaler 8
; 2 = 0,001ms bei prescaler 8
; 10 = 0,005ms bei prescaler 8
; 16 = 0,001ms bei prescaler 1
; 80 = 0,005ms bei prescaler 1
.org 0x000
rjmp Main
.org OC1Aaddr ; Output Compare1A Interrupt Vector Address
rjmp OC1A_interrupt
.org OVF0addr ; Overflow0 Interrupt Vector Address
rjmp OVF0_interrupt
.org INT_VECTORS_SIZE
OC1A_interrupt:
inc counter
;update servos:
cp counter, servo1
brne s2
cbi servoport1, servopin1
s2:
cp counter, servo2
brne counterreset
cbi servoport2, servopin2
counterreset:
cpi counter, 200
brne end
clr counter
sbi servoport1, servopin1
sbi servoport2, servopin2
end: reti
OVF0_interrupt:
inc counter2
cpi counter2, 255
brne end2
inc servo1
inc servo2
clr counter2
cpi servo1, 21
brne end
ldi servo1, 10
ldi servo2, 10
end2: reti
Main: ; hier beginnt das Hauptprogramm
ldi tmp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, tmp
ldi tmp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, tmp
clr tmp
;/*Timer 0:
ldi tmp, ( 1 << CS02 ) | ( 1 << CS00 ) ; Prescaler auf 1024
out TCCR0, tmp
;=> 61.4 Overflows in der Sekunde (bei 16 MHz)
;=> alle 16,4 ms
ldi tmp, TIMSK
ori tmp, ( 1 << TOIE0 ) ; TOIE0: Interrupt bei Timer Overflow
out TIMSK, tmp
;*/ ;Timer 0
;/*Timer 1:
ldi tmp, high( Timer1AOVF - 1 )
out OCR1AH, tmp
ldi tmp, low( Timer1AOVF - 1 )
out OCR1AL, tmp
; Prescaler auf 1 (001), 8 (010), 64 (011), 256 (100), 1024 (101)
ldi tmp, ( 1 << WGM12 ) | ( 1 << CS11 )
out TCCR1B, tmp
ldi tmp, TIMSK
ori tmp, ( 1 << OCIE1A ) ; OCIE1A: Interrupt bei Timer Compare A
out TIMSK, tmp
;*/ ;Timer 1
ldi tmp, 0xFF
out DDRA, tmp
ldi counter, 0x00
ldi counter2, 0x00
rcall init_servos
sei
loop:
rjmp loop
init_servos:
sbi servoreg1, servopin1
ldi servo1, 10
sbi servoreg2, servopin2
ldi servo2, 10
ret
Ziel war es:
Lesezeichen