Code:
.include "m8def.inc"
.def tmp = r16
.def k0 = r17;Servo 0
.def k1 = r18;Servo 1
.def k2 = r19;Servo 2
.def k3 = r20;Servo 3
.def zyclus = r21
.def kanal = r22 ;geht an ADMUX
.def pause = r23 ;für die 1ms Offset und die zweite ms für
; die Servoposition wird die selbe ISR benutzt. Ist Pause = 0
;wird über das LOW setzten weggesprungen, wenn Pause = 1 eben nicht.
;sinngemäß wird Pause nach der ms erhöht und nach dem Positionsstellen
;erniedrigt.
.def save_sreg = r24 ;erklärt sich sicher von selbst
.org 0x000
rjmp reset
.org OC2addr ; OCR2 Interrupt Vector Address
rjmp hitvalue
reset:
;Stack wird bei Interrupts benötigt!
ldi r16,HIGH(RAMEND)
out SPH,r16
ldi r16,LOW(RAMEND)
out SPL,r16
ldi tmp,0b00000010
out TCCR0,tmp
ldi tmp,0b00100000
out DDRC,tmp
ldi tmp,0b01010101
out DDRD,tmp
ldi tmp,0b011000000
out ADMUX,tmp
ldi tmp,30
out OCR2,tmp
sei
main:
;##################################################################
;##################################################################
;hier werden die ADC Werte für das jeweilige Servo erfasst
ldi kanal,0b01100000 ;Hier wird für den Servo 0
out ADMUX,kanal ;die Position ermittelt
ldi tmp,0b11000101 ;PRESCALER 32 - Singleconversion
out ADCSRA,tmp
kanal0:
in tmp,ADCSRA
sbrs tmp,4
rjmp kanal0
in k0,ADCH
ldi kanal,0b01100001
out ADMUX,kanal
ldi tmp,0b11000101 ;PRESCALER 32
out ADCSRA,tmp
kanal1:
in tmp,ADCSRA
sbrs tmp,4
rjmp kanal1
in k1,ADCH
ldi kanal,0b01100010
out ADMUX,kanal
ldi tmp,0b11000101 ;PRESCALER 32
out ADCSRA,tmp
kanal2:
in tmp,ADCSRA
sbrs tmp,4
rjmp kanal2
in k2,ADCH
ldi kanal,0b01100011
out ADMUX,kanal
ldi tmp,0b11000101 ;PRESCALER 32
out ADCSRA,tmp
kanal3:
in tmp,ADCSRA
sbrs tmp,4
rjmp kanal3
in k3,ADCH
;#############################################################
;#############################################################
ldi tmp,0
out TCNT0,tmp
;_________________18ms Pause_____________-
waita:
in tmp,TCNT0
cpi tmp,252
brlo waita
ldi tmp,0
out TCNT0,tmp
inc r26
cpi r26,74
brlo waita
;________________________________________-
ldi tmp,0b00001001 ;RPESCALER 1
out TCCR2,tmp
ldi tmp,0
out TCNT2,tmp
ldi tmp,0b01010101 ;Pins für das Signal HIGH setzten
out PORTD,tmp
ldi tmp,0b10000000
out TIMSK,tmp
ldi zyclus,0
ldi r26,0
;*******************1ms Offset*****************
warten1:
cpi zyclus,250
breq wigger
rjmp warten1
wigger:
;**********************************************
sbi PORTC,5 ;wurde zur Kontrolle der Zeiten benutzt und mit Oszi gemessen
ldi zyclus,0
out TCNT2,zyclus
ldi pause,1
;ab hier Stellungs kritische ms
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;diese Schleife wird solange durchlaufen,
;bis der PORTD an dem die Servo angeschlossen sind
;komplett LOW ist
pulse:
in tmp,PORTD
cpi tmp,0
brne pulse
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;'''''''''''''''''''''''''''''''''
;diese Schleife macht die ms ggf. voll,um das PWM nicht zu verzerren
warten:
cpi zyclus,250
brsh ende
rjmp warten
ende:
;'''''''''''''''''''''''''''''''''
cbi PORTC,5
ldi zyclus,0
out TCCR2,zyclus
ldi pause,0
ldi kanal,0b01100000
out ADMUX,kanal
rjmp main
hitvalue:
in save_sreg,SREG
cpi pause,0
breq null
cp zyclus,k0
brne ka
cbi PORTD,0
ka:
cp zyclus,k1
brne kb
cbi PORTD,2
kb:
cp zyclus,k2
brne kc
cbi PORTD,4
kc:
cp zyclus,k3
brne kd
cbi PORTD,6
kd:
null:
inc zyclus
out SREG,save_sreg
reti
Danke auch bis hier hin schon für die Mühen,
Lesezeichen