Code:
'======================================================
'Hauptprogramm
'======================================================
Do
'Umrechnung erstes RC Signal auf 8-Bit
'Berechnung_1 = Impulslaenge_1 / 8 'ergibt Werte zwischen 125 und 250
Berechnung_1 = Impulslaenge_1 'Berechnung kann und Impulslaenge SOLLTE als Byte declariert werden
'If Berechnung_1 > 255 Then 'zu hohe Werte abfangen 'kann nicht mehr höher als 255 werden
' Berechnung_1 = 255
'End If
If Berechnung_1 < 120 Then 'zu kleine Werte abfangen
Berechnung_1 = 120
End If
'Umrechnung zweites RC Signal auf 8-Bit
'Berechnung_2 = Impulslaenge_2 / 8 'ergibt Werte zwischen 125 und 250
Berechnung_2 = Impulslaenge_2 'Berechnung kann und Impulslaenge SOLLTE als Byte declariert werden
'If Berechnung_2 > 255 Then 'zu hohe Werte abfangen 'kann nicht mehr höher als 255 werden
' Berechnung_2 = 255
'End If
If Berechnung_2 < 120 Then 'zu kleine Werte abfangen
Berechnung_2 = 120
End If
Servoausgabe_1 = 256 - Berechnung_1 'Servoausgabe_ zum direkten Laden in TCNT0 vorbereiten (Cmd Load umgangen)
Servoausgabe_2 = 256 - Berechnung_2 'Servoausgabe_ zum direkten Laden in TCNT0 vorbereiten (Cmd Load umgangen)
Servoausgabe_3 = 190
Servoausgabe_4 = 190
Loop
'======================================================
'ISR
'======================================================
Rc_eingang_1:
$asm
sbis pinb , 1 'Skip next Instr if PINBx = 1
rjmp pulslaenge1 'Spring zur Berechnung von Impulslaenge
push r17 'Register auf Stack sichern
in r17 , tcnt1l 'Timer1 low Byte holen
sts {Rc_signal_1_start} , r17 'Speichere Timer1 low Byte nach Rc_signal low Byte
in r17 , tcnt1h 'Timer1 high Byte holen
sts {Rc_signal_1_start} + 1 , r17 'Speichere Timer1 high Byte nach Rc_signal high Byte
pop r17 'Register vom Stack zurückholen
rjmp ende1 'Springe zum Ende
Pulslaenge1:
push r16 'Register auf Stack sichern
in r16,sreg 'Statusregister holen und halten
push r17 'Register auf Stack sichern
push r18 'Register auf Stack sichern
push r19 'Register auf Stack sichern
in r17 , tcnt1l 'Timer1 low Byte holen
lds r18 , {Rc_signal_1_start} 'Hole Rc_signal low Byte
Sub R17 , R18 'Subtrahiere Rc_signal low Byte von Timer1 low Byte
in r18 , tcnt1h 'Timer1 high Byte holen
lds r19 , {Rc_signal_1_start} + 1 'Hole Rc_signal high Byte
sbc r18 , r19 'Subtrahiere Rc_signal high Byte von Timer1 high Byte
'divison durch 8 durch dreimaliges rechts shiften des 16bit ergebnisses
lsr r18 'logical shift right von ergebnis high byte, lsb wandert ins carry flag
ror r17 'rechts rollen von ergebnis low byte, msb kommt aus carry flag
lsr r18 'logical shift right von ergebnis high byte, lsb wandert ins carry flag
ror r17 'rechts rollen von ergebnis low byte, msb kommt aus carry flag
lsr r18 'logical shift right von ergebnis high byte, lsb wandert ins carry flag
ror r17 'rechts rollen von ergebnis low byte, msb kommt aus carry flag
sts {Impulslaenge_1} , r17 'Speichere durch 8 dividiertes Resultat in Impulslaenge
pop r19 'Register vom Stack zurückholen
pop r18 'Register vom Stack zurückholen
pop r17 'Register vom Stack zurückholen
Out Sreg , R16 'Statusregister zurückspeichern
pop r16 'Register vom Stack zurückholen
Ende1:
$end Asm
Return
Rc_eingang_2:
$asm
sbis pinA , 7 'Skip next Instr if PINBx = 1
rjmp pulslaenge2 'Spring zur Berechnung von Impulslaenge
push r17 'Register auf Stack sichern
in r17 , tcnt1l 'Timer1 low Byte holen
sts {Rc_signal_2_start} , r17 'Speichere Timer1 low Byte nach Rc_signal low Byte
in r17 , tcnt1h 'Timer1 high Byte holen
sts {Rc_signal_2_start} + 1 , r17 'Speichere Timer1 high Byte nach Rc_signal high Byte
pop r17 'Register vom Stack zurückholen
rjmp ende2 'Springe zum Ende
Pulslaenge2:
push r16 'Register auf Stack sichern
in r16,sreg 'Statusregister holen und halten
push r17 'Register auf Stack sichern
push r18 'Register auf Stack sichern
push r19 'Register auf Stack sichern
in r17 , tcnt1l 'Timer1 low Byte holen
lds r18 , {Rc_signal_2_start} 'Hole Rc_signal low Byte
Sub R17 , R18 'Subtrahiere Rc_signal low Byte von Timer1 low Byte
in r18 , tcnt1h 'Timer1 high Byte holen
lds r19 , {Rc_signal_2_start} + 1 'Hole Rc_signal high Byte
sbc r18 , r19 'Subtrahiere Rc_signal high Byte von Timer1 high Byte
'Divison durch 8 durch dreimaliges rechts shiften des 16bit ergebnisses
lsr r18 'logical shift right von ergebnis high byte, lsb wandert ins carry flag
ror r17 'rechts rollen von ergebnis low byte, msb kommt aus carry flag
lsr r18 'logical shift right von ergebnis high byte, lsb wandert ins carry flag
ror r17 'rechts rollen von ergebnis low byte, msb kommt aus carry flag
lsr r18 'logical shift right von ergebnis high byte, lsb wandert ins carry flag
ror r17 'rechts rollen von ergebnis low byte, msb kommt aus carry flag
sts {Impulslaenge_2} , r17 'Speichere durch 8 dividiertes Resultat in Impulslaenge
pop r19 'Register vom Stack zurückholen
pop r18 'Register vom Stack zurückholen
pop r17 'Register vom Stack zurückholen
Out Sreg , R16 'Statusregister zurückspeichern
pop r16 'Register vom Stack zurückholen
Ende2:
$end Asm
Return
Rc_eingang_3:
$asm
sbis pinb , 2 'Skip next Instr if PINBx = 1
rjmp pulslaenge3 'Spring zur Berechnung von Impulslaenge
push r17 'Register auf Stack sichern
in r17 , tcnt1l 'Timer1 low Byte holen
sts {Rc_signal_3_start} , r17 'Speichere Timer1 low Byte nach Rc_signal low Byte
in r17 , tcnt1h 'Timer1 high Byte holen
sts {Rc_signal_3_start} + 1 , r17 'Speichere Timer1 high Byte nach Rc_signal high Byte
pop r17 'Register vom Stack zurückholen
rjmp ende3 'Springe zum Ende
Pulslaenge3:
push r16 'Register auf Stack sichern
in r16,sreg 'Statusregister holen und halten
push r17 'Register auf Stack sichern
push r18 'Register auf Stack sichern
push r19 'Register auf Stack sichern
in r17 , tcnt1l 'Timer1 low Byte holen
lds r18 , {Rc_signal_3_start} 'Hole Rc_signal low Byte
Sub R17 , R18 'Subtrahiere Rc_signal low Byte von Timer1 low Byte
in r18 , tcnt1h 'Timer1 high Byte holen
lds r19 , {Rc_signal_3_start} + 1 'Hole Rc_signal high Byte
sbc r18 , r19 'Subtrahiere Rc_signal high Byte von Timer1 high Byte
'divison durch 8 durch dreimaliges rechts shiften des 16bit ergebnisses
lsr r18 'logical shift right von ergebnis high byte, lsb wandert ins carry flag
ror r17 'rechts rollen von ergebnis low byte, msb kommt aus carry flag
lsr r18 'logical shift right von ergebnis high byte, lsb wandert ins carry flag
ror r17 'rechts rollen von ergebnis low byte, msb kommt aus carry flag
lsr r18 'logical shift right von ergebnis high byte, lsb wandert ins carry flag
ror r17 'rechts rollen von ergebnis low byte, msb kommt aus carry flag
sts {Impulslaenge_3} , r17 'Speichere durch 8 dividiertes Resultat in Impulslaenge
pop r19 'Register vom Stack zurückholen
pop r18 'Register vom Stack zurückholen
pop r17 'Register vom Stack zurückholen
Out Sreg , R16 'Statusregister zurückspeichern
pop r16 'Register vom Stack zurückholen
Ende3:
$end Asm
Return
Lesezeichen