
Zitat von
R2D2 Bastler
Meine Vermutung ist nun folgende: Wenn das Servo langsam losfährt, ist die Variable "Servospeed" in der For-Next Schleife sehr groß. Auch wenn ich den Knüppel nun schlagartig auf Endandanschlag bringe, findet ja keine neue Berechnung der Variable "Servospeed" statt. Wenn also Servospeed sehr groß ist und ich den Knüppel nicht wieder in Mittelstellung bringe (um aus der ganzen IF Bedingung raus zu kommen), fährt das Servo nur mit Minimalgeschwindigkeit bis zum Anschlag.
Ich habe leider keine rechte Vorstellung, wie der Bagger reagiert, vielleicht auch weil ich selbst keine Modellbaufernbedienung habe.
Auf jeden Fall darf die Zeit zwischen den Abfragen der Rc_signal_stop_flags nicht länger sein als der Abstand zweier Impulse an dem Eingang. Anders: die Laufzeit einer Runde in der Hauptschleife darf nicht länger sein als der Abstand zweier Impulse, da es sonst zu Fehlmessungen kommen kann (Flag wird nicht zurückgesetzt und Rc_signal_start wird neu gesetzt und Rc_signal_stop noch nicht. Dazwischen bis zu 2ms Zeit Fehler zu produzieren. Gefahr könnte man auf die Schnelle durch Maßnahmen in den ISR vermindern aber nicht ganz ausschließen. Einfacher und besser ist es die Hauptschleife schneller zu machen.
Die For-Next Schleifen können das Hauptprogramm bis zu 70ms aufhalten - grob im Simulator getestet.
Das sollte erstmal eliminiert werden. Hoffe mein Vorschlag funktioniert wenigstens ansatzweise.
Er basiert auf der zusätzlichen Nutzung von Timer1 zur Zeitmessung, so daß das Hauptprogramm nicht aufgehalten wird.
Sobald Timer1 läuft, werden auch nach spätestens 66ms die OCF1A und OCF1B Comparematch Interruptflags gesetzt und bleiben gesetzt, da ja da kein Interrupt drauf aktiviert ist.
Die werden in meinem Vorschlag abgefragt, gelöscht, wenn sie gesetzt sind und die OCR1x Register mit Wartezeiten geladen. Damit werden zusätzlich Interrupts zur Zeitmessung vermieden, allerdings sind Wartezeiten etwas abhängig von Programmverzweigungen (kann ich nicht überblicken, sollte aber im Verhältnis kaum ins Gewicht fallen?)
Die INCR und DECR der "Berechnung_xA" findet sofort ohne Wartezeit statt. Kann man später noch mit Flagsteuerung ändern - möchte nur erstmal wissen ob es im Prinzip so akzeptabel ist (und zuallererst ob es überhaupt funktioniert - wenn vielleicht auch das Knüppelsteuerungsreißproblem noch nicht behoben wird
)
Dies hier also mit dem weiter unten stehenden ersetzten.
Code:
'Berechnung der Servogeschwindigkeit und Servostellung
'Erstes Baggerarmservo
If Berechnung_1 < 182 Then 'Info: Todband (Mittelstellung) liegt zwischen 182 und 193
Servospeed = Berechnung_1 - 120 'ergibt Werte zwischen 0 (schnell) und 61 (langsam)
Servospeed = Servospeed * 100 'Werte hochscalieren (Faktor 30 bis 100, höherer Faktor = langsamere minimal Speed)
For I = 1 To Servospeed 'Werte von 0 (schnell) bis max 6100 (langsam) sinnvoll
Next I
Decr Berechnung_1a
End If
If Berechnung_1 > 193 Then
Servospeed = 255 - Berechnung_1
Servospeed = Servospeed * 100
For I = 1 To Servospeed
Next I
Incr Berechnung_1a
End If
'Zweites Baggerarmservo
If Berechnung_2 < 182 Then 'Info: Todband (Mittelstellung) liegt zwischen 182 und 193
Servospeed = Berechnung_2 - 120 'ergibt Werte zwischen 0 (schnell) und 61 (langsam)
Servospeed = Servospeed * 100 'Werte hochscalieren (Faktor 30 bis 100, höherer Faktor = langsamere minimal Speed)
For I = 1 To Servospeed 'Werte von 0 (schnell) bis max 6100 (langsam) sinnvoll
Next I
Decr Berechnung_2a
End If
If Berechnung_2 > 193 Then
Servospeed = 255 - Berechnung_2
Servospeed = Servospeed * 100
For I = 1 To Servospeed
Next I
Incr Berechnung_2a
End If
Hab grob versucht die gleiche Wartzeit hinzukriegen. Original for-next mit servospeed=61*100=6100 -> maximal 35ms. jetzt 61*500 = 30500µs = 30,5ms
Code:
If Tifr1.ocf1a = 1 And Berechnung_1 < 182 Then
Set Tifr1.ocf1a 'Interruptflag löschen
Servospeed = Berechnung_1 - 120
Servospeed = Servospeed * 500 'eine Einheit in Servospeed macht 1µs Wartezeit
'sicherheitszeit 1000µs damit bei kleinen Werten kein kompletter timer rundlauf bis zum nächsten
'comparematch abgewartet werden muß. Länger sollte auch eine Runde in der Hauptschleife nicht dauern.
If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
Ocr1a = Tcnt1 + Servospeed 'Setzen von OCR1A damit nach Servospeed ein Compare Match auftritt
Decr Berechnung_1a
End If
If Tifr1.ocf1a = 1 And Berechnung_1 > 193 Then
Set Tifr1.ocf1a
Servospeed = 255 - Berechnung_1
Servospeed = Servospeed * 500
If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
Ocr1a = Tcnt1 + Servospeed
Incr Berechnung_1a
End If
If Tifr1.ocf1b = 1 And Berechnung_2 < 182 Then
Set Tifr1.ocf1b
Servospeed = Berechnung_2 - 120
Servospeed = Servospeed * 500
If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
Ocr1b = Tcnt1 + Servospeed
Decr Berechnung_2a
End If
If Tifr1.ocf1b = 1 And Berechnung_2 > 193 Then
Set Tifr1.ocf1b
Servospeed = 255 - Berechnung_2
Servospeed = Servospeed * 500
If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
Ocr1b = Tcnt1 + Servospeed
Incr Berechnung_2a
End If
Gruß
Searcher
Lesezeichen