Ungetestet:
Code:
'===============================================================================
'Baggersteuerung (ACHTUNG FUNKTIONIERT NICHT, SERVO RUCKELT EXTREM)
'RC Empfangskanal 1 an Pin 6 (PA7)
'RC Empfangskanal 2 an Pin 7 (PA6)
'RC Empfangskanal 3 (Mode-Schalter) an Pin 5 (PB2)
'Werte zwischen 100 und 200 entsprechen dem kompletten Knüppelweg
'Der Wert 150 entspricht dabei ca. Mittelstellung, der Wert 200 ca. Vollausschlag
'Poti Eingang 1 Pin 9 (PA4)
'Poti Eingang 1 Pin 8 (PA5)
'Servoausgang 1 Pin13 (PA0)
'Servoausgang 2 Pin12 (PA1)
'Servoausgang 3 Pin11 (PA2)
'Servoausgang 4 Pin10 (PA3)
'Made by Robert (www.roberts-r2d2-bau.de)
'Angepasst von radbruch 21.12.2013
'https://www.roboternetz.de/community/threads/63750-Mehrere-RC-Signale-einlesen-und-mehrere-Servos-ausgeben?
'===============================================================================
$regfile = "attiny24.dat"
$crystal = 8000000 'FuseBit CKDIV8 deaktivieren
$hwstack = 32
$swstack = 20
$framesize = 40
'-------------------------------------------------------------------------------------------------------------
'Variablen definieren
'-------------------------------------------------------------------------------------------------------------
Dim Empfangskanal(3) As Word
Dim Empfangskanal_temp_ein(3) As Word
Dim Empfangskanal_temp_aus(3) As Word
Dim Kanal As Byte
Dim Servo(4) As Word
'-------------------------------------------------------------------------------------------------------------
'Ein- und Ausgang festlegen
'-------------------------------------------------------------------------------------------------------------
Ddra = &B00001111 'PA0, PA1, PA2 und PA3 werden Ausgänge, der restliche Port A bleibt Eingang
Ddrb = &B00000000 'PortB bleibt Eingang
'-------------------------------------------------------------------------------------------------
'Timer und Interrupt-Service-Routinen konfigurieren und freigeben
'-------------------------------------------------------------------------------------------------
Config Timer1 = Timer , Prescale = 8 'Timer für Servos, läuft mit 1MHz, ergibt 1000 Schritte Auflösung pro ms
Compare1a = 1000 ' Nach 1ms wird die ISR initialisiert
Timer1 = 1
Enable Compare1a 'schaltet den Timer1 Compare1a Match-Interrupt ein
On Compare1a Servoausgabe 'Springt bei Timer1 Compare1a Match in die ISR
Enable Interrupts ' Interrupts zulassen
'-------------------------------------------------------------------------------------------------------------
'Einigen Variablen Werte zuweisen
'-------------------------------------------------------------------------------------------------------------
Kanal = 0 ' Kanal startet jetzt bei 0 wegen porta.kanal in der ISR!
Servo(1) = 1500
Servo(2) = 1500
Servo(3) = 1500
Servo(4) = 1500
Empfangskanal(1) = 0
Empfangskanal(2) = 0
Empfangskanal(3) = 0
Empfangskanal_temp_ein(1) = 0
Empfangskanal_temp_ein(2) = 0
Empfangskanal_temp_ein(3) = 0
Empfangskanal_temp_aus(1) = 0
Empfangskanal_temp_aus(2) = 0
Empfangskanal_temp_aus(3) = 0
'-------------------------------------------------------------------------------------------------------------
'Hauptprogramm starten
'-------------------------------------------------------------------------------------------------------------
Do
If Pina.7 = 1 And Empfangskanal_temp_ein(1) = 0 Then
Empfangskanal_temp_ein(1) = Timer1
End If
If Pina.7 = 0 And Empfangskanal_temp_ein(1) <> 0 Then
Empfangskanal_temp_aus(1) = Timer1
If Empfangskanal_temp_aus(1) < Empfangskanal_temp_ein(1) Then
Empfangskanal_temp_aus(1) = Empfangskanal_temp_aus(1) + 20000
End If
Empfangskanal(1) = Empfangskanal_temp_aus(1) - Empfangskanal_temp_ein(1)
Empfangskanal_temp_ein(1) = 0
End If
If Pina.6 = 1 And Empfangskanal_temp_ein(2) = 0 Then
Empfangskanal_temp_ein(2) = Timer1
End If
If Pina.6 = 0 And Empfangskanal_temp_ein(2) <> 0 Then
Empfangskanal_temp_aus(2) = Timer1
If Empfangskanal_temp_aus(2) < Empfangskanal_temp_ein(2) Then
Empfangskanal_temp_aus(2) = Empfangskanal_temp_aus(2) + 20000
End If
Empfangskanal(2) = Empfangskanal_temp_aus(2) - Empfangskanal_temp_ein(2)
Empfangskanal_temp_ein(2) = 0
End If
If Empfangskanal(1) <> 0 Then Servo(1) = Empfangskanal(1) End If
If Empfangskanal(2) <> 0 Then Servo(2) = Empfangskanal(2) End If
Loop
End
'(
Der Timer startet beim ersten Servo mit dem Zählwert 1, Das Compare-Register wird auf den Wert
für die Impulslänge des ersten Servo gesetzt.In der Compere-ISR (wenn der Zählwert den Wert im
Compareregister erreicht hat) wird dann ausgehend vom aktuelen Timerwert der Vergleichswert für
die Impulslänge des nächsten Servo berechnet und gesetzt. Nach dem letzten Servo wird 20000 für
die Wiederholfrequenz des Signals gesetzt
')
Servoausgabe:
Porta.0 = 0 'alle Servosignale ausschalten
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
If Kanal < 4 Then ' Zeitpunkt für nächstes Servo setzen
If Kanal = 0 Then
Timer1 = 1 ' beim ersten Servo Timer Zähler zurücksetzen
End If
Compare1a = Timer1 + Servo(kanal + 1) ' aktueller Timerwert + Servo Impulslänge
Porta.kanal = 1 ' Impuls ausgeben
Incr Kanal ' nächstes Servo vormerken
Else
Compare1a = 20000 ' 50Hz Wiederholfrequenz setzen
Kanal = 0
End If
Return
Lesezeichen