Code:
.include "2313def.inc" ;Definitionsdatei laden
.Def RXtemp =r27
.Def S1Pos = r28 ;Servo1 invertiert an PB0 - Position in 64tel
.Def S2Pos = r29
.equ S1Offset=4 ;Offset in 256µS
.equ S2Offset=4
.equ CLOCK = 8000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
.org 0x000
rjmp start
.org 0x00B
rjmp onRXD ;Interupt für RX
start: ldi r16,low(ramend) ;Stackpointer auf
out spl,r16 ;RAM-Ende setzen
ldi r16,0x0f
out ddrb,r16 ;PortB.0-3 aus Ausgang setzen
ldi r16,0
out portb,r16 ;Interne Pullups von PortD abstellen, Ausgänge auf low
ldi r16,0b00000010
out TCCR1B,r16 ;Prescaler für Timer1 auf 8 stellen
ldi r16, UBRRVAL
out UBRR, r16 ;Baudrate einstellen
ldi r16, 0b10011000
out UCR, r16 ;TX anmachen, RX anmachen, RX-Int anmachen
ldi S1Pos,32 ;Startpositionen setzen
ldi S2Pos,32
sei ;interupts an
loop:
ldi r16,0 ;Timer1 zurücksetzen
out TCNT1H,r16
;ldi r16,0
out TCNT1L,r16
LDI r16,0
out portb,r16 ;Signal an
anloop: ;Endlosschleife die die Servopulse überwacht und nach ca. 20ms zu loop zurückspringt
IN r18,TCNT1L
IN r16,TCNT1H
;ÜBERPRÜFEN,OB PULS FÜR SERVO1 FERTIG
SBIC portb,0
rjmp s1fertig ;Wenn der Puls schon aus ist, Überprüfung skippen
mov r17,s1pos
ANDI r17,0xF0 ;Low-Nibble von S1pos löschen
SWAP r17 ;Und Nibbles tauschen - effektiv durch 16 teilen
SUBI r17,-S1Offset ;Offset hinzufügen
cp r16,r17 ;S1pos mit Timer vergleichen, Ausmachen skippen, wenn Timer kleiner
brlo S1Fertig
mov r17,s1pos ;Sonst mit dem Low-Teil des Timers vergleichen
ANDI r17,0x0F ;H-Nibble von S1pos löschen
SWAP r17 ;Und Nibbles tauschen - effektiv mit 16 multiplizieren
cp r18,r17
brlo S1Fertig ;Wenn Timer kleiner, anlassen
SBI portb,0 ;Servo1 Puls ausmachen
S1fertig:
;ÜBERPRÜFEN,OB PULS FÜR SERVO2 FERTIG
SBIC portb,1
rjmp s2fertig ;Wenn der Puls schon aus ist, Überprüfung skippen
mov r17,s2pos
ANDI r17,0xF0 ;Low-Nibble von S2pos löschen
SWAP r17 ;Und Nibbles tauschen - effektiv durch 16 teilen
SUBI r17,-S2Offset ;Offset hinzufügen
cp r16,r17 ;S2pos mit Timer vergleichen, Ausmachen skippen, wenn Timer kleiner
brlo S2Fertig
mov r17,s2pos ;Sonst mit dem Low-Teil des Timers vergleichen
ANDI r17,0x0F ;H-Nibble von S2pos löschen
SWAP r17 ;Und Nibbles tauschen - effektiv mit 16 multiplizieren
cp r18,r17
brlo S2Fertig ;Wenn Timer kleiner, anlassen
SBI portb,1 ;Servo2 Puls ausmachen
S2fertig:
cpi r16,80 ;Nach Ablauf von ca. 20ms neuen Zyklus starten
brsh loop
rjmp anloop
onRXD:
IN S1POS,UDR
IN rxtemp,TCNT1L
OUT UDR,rxtemp
reti
Lesezeichen