Hallo radbruch,
habe Deinen Vorschlag mal gestestet, funktioniert ähnlich gut wie der Code, den ich in der Zwischenzeit mit Hilfe eines weiteren Forummitglieds gestrickt habe. Mit "ähnlich gut" meine ich, dass ein geringes, aber deutlich sichtbares Servozucken an den Servos vorhanden ist, welche mit den eingelesenen RC-Signalen versorgt werden. Servos, denen ich im Programm einen Festwert zuweise, zucken nicht. Daraus schliese ich, dass die Servoausgabe ISR korrekt und zuverlässig arbeitet, aber sich die Interrupts der RC Einleserei in die Quere kommen. Der folgende Code liest 3 RC-Signale ein und gibt 2 davon an 2 Servos weiter, während die anderen beiden Servos einen Festwert zugewiesen bekommen haben. Ich benutze TIMER1 für das Einlesen (tolle Auflösung) und TIMER0 für die Ausgabe (leider nur noch sehr bescheidene Auflösung).
Inzwischen ist die Auswertung der Poti's auch eingebaut und getestet (hier aber nicht gepostet, da es den Code nur unnötig unübersichtlich macht). Allerdings habe ich die Speicherkapazität des Attiny24 mittlerweile geprengt und warte nun auf die bestellten Attiny84.
Mein momentanes Problem ist das nicht ganz saubere Einlesen der RC Signale. Ich habe auch versucht, immer nur einen der drei Interrupts zuzulassen (z.B. mit "disable INT0" in der entsprechenden ISR) und die RC Signale hintereinander einzulesen, führte aber zu keiner Verbesserung.
mfg
Robert
Code:'=============================================================================== 'RC Eingang 1 an Pin 3 (PB1, PCINT9) 'RC Eingang 2 an Pin 7 (PA7, PCINT7) 'RC Eingang 3 an Pin 5 (PB2, INT0) 'Servo 1 an Pin 13 (PA0) 'Servo 2 an Pin 12 (PA1) 'Servo 3 an Pin 11 (PA2) 'Servo 4 an Pin 10 (PA3) '=============================================================================== $regfile = "attiny24.dat" $crystal = 8000000 'FuseBit CKDIV8 deaktivieren $hwstack = 32 $swstack = 20 $framesize = 40 '------------------------------------------------------------------------------------------------- 'Timer und konfigurieren '------------------------------------------------------------------------------------------------- Config Timer1 = Timer , Prescale = 8 'Timer für Einlesen RC Signale Start Timer1 Config Timer0 = Timer , Prescale = 64 'Timer für Servoausgabe, Wert 125 entspricht 1ms, Wert 250 entspricht 2ms Enable Timer0 On Timer0 Servoausgabe '------------------------------------------------------------------------------------------------------------- 'Variablen definieren '------------------------------------------------------------------------------------------------------------- 'Variablen fürs RC Einlesen Dim Rc_signal_1_start As Word Dim Rc_signal_2_start As Word Dim Rc_signal_3_start As Word Dim Impulslaenge_1 As Word Dim Impulslaenge_2 As Word Dim Impulslaenge_3 As Word 'Variablen für Berechnungen Dim Berechnung_1 As Word Dim Berechnung_2 As Word 'Variablen für Servoausgabe Dim Kanal As Byte Dim Servoausgabe_1 As Byte Dim Servoausgabe_2 As Byte Dim Servoausgabe_3 As Byte Dim Servoausgabe_4 As Byte Dim Pausen_variable As Byte '------------------------------------------------------------------------------------------------- 'Einigen Variablen Werte zuweisen '------------------------------------------------------------------------------------------------- Kanal = 1 Pausen_variable = 0 '------------------------------------------------------------------------------------------------------------- 'Ein- und Ausgang festlegen '------------------------------------------------------------------------------------------------------------- Ddra = &B00001111 'PA0 - PA3 werden Ausgänge Ddrb = &B00000000 'PortB bleibt Eingang '------------------------------------------------------------------------------------------------- 'Interrupt-Service-Routinen konfigurieren und freigeben '------------------------------------------------------------------------------------------------- 'Info: 'Alle Porta Pinchangeinterrupts sind in Bascom "PCINT0" zugeordnet. 'Alle Portb Pinchangeinterrupts sind in Bascom "PCINT1" zugeordnet. Pcmsk1.pcint9 = 1 'beim Flankenwechsel an PB1/PCINT9 (RC Eingang 1) Pinchangeinterrupt1 auslösen und in die Subroutine springen Enable Pcint1 'Pinchangeinterrupt1 (1 weil auf PortB) zulassen On Pcint1 Rc_eingang_1 Pcmsk0.pcint7 = 1 'beim Flankenwechsel an PA7/PCINT6 (RC Eingang 2) Pinchangeinterrupt0 auslösen und in die Subroutine springen Enable Pcint0 'Pinchangeinterrupt0 (0 weil auf PortA) zulassen On Pcint0 Rc_eingang_2 Config Int0 = Change 'beim Flankenwechsel an PB2/INT0 (RC Eingang 3) Int0 auslösen und in die Subroutine springen Enable Int0 On Int0 Rc_eingang_3 Enable Interrupts '====================================================== 'Hauptprogramm '====================================================== Do 'Umrechnung erstes RC Signal auf 8-Bit Berechnung_1 = Impulslaenge_1 / 8 'ergibt Werte zwischen 125 und 250 If Berechnung_1 > 255 Then 'zu hohe Werte abfangen 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 If Berechnung_2 > 255 Then 'zu hohe Werte abfangen Berechnung_2 = 255 End If If Berechnung_2 < 120 Then 'zu kleine Werte abfangen Berechnung_2 = 120 End If Servoausgabe_1 = Berechnung_1 Servoausgabe_2 = Berechnung_2 Servoausgabe_3 = 190 Servoausgabe_4 = 190 Loop '====================================================== 'ISR '====================================================== Rc_eingang_1: If Pinb.1 = 1 Then Rc_signal_1_start = Timer1 Else Impulslaenge_1 = Timer1 - Rc_signal_1_start End If Return Rc_eingang_2: If Pina.7 = 1 Then Rc_signal_2_start = Timer1 Else Impulslaenge_2 = Timer1 - Rc_signal_2_start End If Return Rc_eingang_3: If Pinb.2 = 1 Then Rc_signal_3_start = Timer1 Else Impulslaenge_3 = Timer1 - Rc_signal_3_start End If Return Servoausgabe: If Kanal = 1 Then If Porta.0 = 0 Then 'wenn der Ausgangspin aus ist Load Timer0 , Servoausgabe_1 'wird der Timer0 mit dem Wert der Variable "Servoausgabe_1" vorgeladen Porta.0 = 1 'und der Ausgangspin eingeschaltet Else 'erst beim nächsten Timer0 Überlauf landen wir hier Porta.0 = 0 'Ausgangspin wird wieder ausgeschaltet Incr Kanal 'und der nächsten Kanal bearbeitet End If End If If Kanal = 2 Then If Porta.1 = 0 Then Load Timer0 , Servoausgabe_2 Porta.1 = 1 Else Porta.1 = 0 Incr Kanal End If End If If Kanal = 3 Then If Porta.2 = 0 Then Load Timer0 , Servoausgabe_3 Porta.2 = 1 Else Porta.2 = 0 Incr Kanal End If End If If Kanal = 4 Then If Porta.3 = 0 Then Load Timer0 , Servoausgabe_4 Porta.3 = 1 Else Porta.3 = 0 Incr Kanal End If End If 'Pausenauffüllung If Kanal = 5 Then Timer0 = 0 '8-Bit Timer auf 0, Überlauf alle 2,048ms If Pausen_variable < 7 Then '2,048ms * 6 = 12,288ms Pausenfüllzeit Incr Pausen_variable Else Pausen_variable = 0 Kanal = 1 End If End If Return







Zitieren

Lesezeichen