Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Searcher,
also nach langem hin und her, habe ich jetzt zumindest erreicht, dass der Servo verfährt und auf die Eingangssignale des Empfängers hört.
Ich habe die Codezeile: "Shift Berechnung_1 , Right , 3" und "Shift Berechung_1, Right, 4" umgeändert. Hierdurch wird das Eingangssignal des Empfängers von Neutral 2950 auf min 137 und max 236 umgerechnet; damit funktioniert es :-)
Das Servo reagiert jetzt eigentlich richtig, nur verfährt es in einem sehr kleinen Bereich, ziwschen den Werten "Signal Servoausgabe 2" (= MinPosition) und "Signalausgabe 60" (= MaxPosition Servo, sogar der harte Endanschlag des Servos). Den Prescaler des Timers0 auf 8 zu reduzieren, brachte nur einen Geschwindigkeitszuwachs aber keine Veränderung der Neutralposition und des Arbeitsbereichs des Servo.
Interessant ist auch, dass das Eingangssignal des Empfängers immer kurzzeitig auf 24000 springt, wodurch die Berechnungen immer um 1 springen und damit das Servo langsam in die Minposition (Servoausgabe_1= 2) verfährt und dort verharrt. Ist aber wohl nur ein Filterproblem, welches sich sicherlich einfach lösen lässt.
Ich sehen im Moment keine Lösung für den geringen Verfahrbereich. Kann das am Timing für den Servo (asm Schnittstelle) liegen? Prescaler und Pausenzeiten vielleicht?
Wenn ich an der Fernsteuerung den Arbeitsbereich erweitere, oder den Nullpunkt verschiebe, erreiche ich nichts. Da die Variable Servoausgabe_1 ja begrenzt ist.
Servoausgabe = 256 - Berechnung_1a
Vielleicht hast du noch eine Idee. Dacht mir vielleicht dass es schon an der Demo Version von Bascom liegt, diese gibt ja maximal 4KB große Dateien frei, die *.bin Datei hat aber nur 3,44KB, sollte also i.O. sein.
VG
Tom
Anbei nochmal der gesamte Code
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat von
Tony DesWegeles
Ich habe die Codezeile: "Shift Berechnung_1 , Right , 3" und "Shift Berechung_1, Right, 4" umgeändert. Hierdurch wird das Eingangssignal des Empfängers von Neutral 2950 auf min 137 und max 236 umgerechnet; damit funktioniert es :-)
Hab ich gesehen und darf aber nicht sein :) Die Division hab ich wieder rückgängig gemacht. Siehe weiter unten - Es gab Problem mit dem Takt von 16MHz.
Zitat:
Interessant ist auch, dass das Eingangssignal des Empfängers immer kurzzeitig auf 24000 springt, wodurch die Berechnungen immer um 1 springen und damit das Servo langsam in die Minposition (Servoausgabe_1= 2) verfährt und dort verharrt. Ist aber wohl nur ein Filterproblem, welches sich sicherlich einfach lösen lässt.
Man müßte genau wissen, was der Empfänger wirklich schickt. Servosignale sollen nur zwischen 1000µs und 2000µs lang sein. Ich gehe immer von 500µs bis 2500µs aus.
Zitat:
Ich sehen im Moment keine Lösung für den geringen Verfahrbereich. Kann das am Timing für den Servo (asm Schnittstelle) liegen? Prescaler und Pausenzeiten vielleicht?
Wenn ich an der Fernsteuerung den Arbeitsbereich erweitere, oder den Nullpunkt verschiebe, erreiche ich nichts. Da die Variable Servoausgabe_1 ja begrenzt ist.
Servoausgabe = 256 - Berechnung_1a
Vielleicht hast du noch eine Idee.
Den Takt in Ordnung bringen und schauen ob das Durchschleifen paßt. Siehe unten.
Zitat:
Dacht mir vielleicht dass es schon an der Demo Version von Bascom liegt, diese gibt ja maximal 4KB große Dateien frei, die *.bin Datei hat aber nur 3,44KB, sollte also i.O. sein.
Ich nutze auch die Demoversion 2.0.7.5. Ist in Ordung und kann die Programmgröße noch händeln.
Hier fängt "unten" an: ;)
Ich habe das Programm zum Durchschleifen von 3 Eingängen auf 3 Ausgänge verändert und mit einem Mega88A mal getestet.
Das veränderte Programm "BaggerDurchschleif_V23_ATmel_V3_mega328.bas", lauffähig auf 16MHz ATMega328p ist im Anhang.
Soweit ich noch alles zusammenbekomme gibt es folgende Veränderungen:
1. Änderung bei der Clockdevision. Zweites CMD muß "Clkpr = &B0000_0001" sein, sonst wird das nix. (Bisher gab es dadurch bei 16MHz schon ein Problem weil es nicht gewirkt hat) $crystal ist noch auf 16000000. Dadurch, daß nach dem Heruntersetzen des Taktes der µC ja nur mit 8MHz läuft, wäre es vielleicht richtiger auch den $crystal Wert auf 8000000 zu setzten. Sollte aber im gegenwärtigen Programm keine Auswirkung haben, da keine WAIT Anweisungen oder so vorhanden sind. Es gibt allerdings deine PRINT Anweisung. Wenn der µC dann tatsächlich mit 8MHz läuft und $crystal noch auf 16000000 steht, geht die Ausgabe über UART dann wahrscheinlich nicht mehr.
2. Die RC_Min und RC_max Werte angepaßt um Ausgabepulsbereich zu erweitern.
3. Auskommentierung von allen Pulsveränderungen bis auf den Jitterausgleich. Das Durchschleifen getestet mit 3 Eingängen und 3 Ausgängen so gut es ich es mit einem Simulator durch einen Attiny44 auf die Schnelle hinbekommen habe. Läuft!
Die Zeilen mit den Auskommentierungszeichen sind an den hash Zeichen (##########..) erkennbar. Die Zeilen einfach wieder rausnehmen.
4. Anmerkung: Gemessen wird im Programm mit einer Auflösung von 1µs. Die Ausgabepulse werden mit einer Auflösung von 8µs ausgegeben. Divisionen durch 16 auf 8 rückgängig gemacht. (Jitterausgleich - funktioniert/wirkt laut R2D2, ich konnte das noch nicht testen - Jitter ist eventuell Ursache nur für Servozittern - zuletzt dran drehen, wenn sonst keine Ursache auszumachen ist)
5. An Zeilen mit "srch" im Kommentar hab ich auch noch gewerkelt.
6. Programm enthält noch auskommentierte Zeilen für meinen ATMega88A.
7. Die ASM Teile und Portanpassungen von Dir wurden nicht verändert.
So, und nun darfst Du Dich wieder auslassen.
Gruß
Searcher
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Searcher,
also gestern habe ich dann noch die Lösung gefunden und hab dann heute deine Vermutung gelesen.
Jup es war der "Print" Befehl der alles aufgehalten hat. :-)
Danke trotzdem für die Erklärung der Funktionen Tifr1.ocf1b. Ich war dann heute gleich so beflügelt vom Erfolg, dass ich das Ganze noch um einen weiteren Servo erweitert habe.
Ich habe einfach den letzten PIN-Change Interrupt ausgewählt PCINT2 und damit funktioniert es auch ganz gut.
Nur leider ist es so, dass der CompareMatch im Timer1 (hoffe liege da richtig) nur Compare Match A und B kann und C nicht möglich ist.
Daher meine Frage ob ich jetzt, damit alle drei Servos gleichzeitig verfahren werden können ich einen dritten Timer (Timer 2) aufmachen muss??
Anbei nochmal der Code erweitert um den dritten Servo. Ich habe den Compare Match einfach kopiert, was ich wohl nicht machen darf?
Den dritten Servo habe ich so gelegt, das PCMSK0, PCMSK1 und PCMSK2 auf unterschiedlichen Pins liegen und sich nicht stören sollten.
Der Servo 4 ist über den Befehl Berechnung_4 = 255 ausgehebelt, somit kommt der nicht in die Quere.
Wie gesagt es funktionieren alle drei sehr gut, 1 und 2 lassen sich gleichzeitig bewegen, also ruckelfrei, nur 3 fährt nur wenn 1 oder 2 stehen.
If Tifr1.ocf1a = 1 And Berechnung_3 < 182 Then
Set Tifr1.ocf1a
Servospeed = Berechnung_3 - Rc_min
Servospeed = Servospeed * 500
If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
Ocr1a = Tcnt1 + Servospeed
Decr Berechnung_3a
End If
If Tifr1.ocf1a = 1 And Berechnung_3 > 193 Then
Set Tifr1.ocf1a
Servospeed = Rc_max - Berechnung_3
Servospeed = Servospeed * 500
If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
Ocr1a = Tcnt1 + Servospeed
Incr Berechnung_3a
End If
Meine Überlegung war jetzt einen weiteren Timer 2 aufzumachen um hier die beiden weiteren Compare Matches A und B verwenden zu können?
Würde das so funktionieren, oder gibt es hier einen eleganteren Weg?
VG
Tom
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Searcher,
ich hab jetzt den Timer 2 eingefügt:
onfig Timer1 = Timer , Prescale = 8 'Timer für Einlesen RC Signale
Start Timer1
Config Timer2 = Timer , Prescale = 8 'Timer für Einlesen RC Signale
Start Timer2
Config Timer0 = Timer , Prescale = 64 'Timer für Servoausgabe, Wert 125 entspricht 1ms, Wert 250 entspricht 2ms
Enable Timer0
On Timer0 Servoausgabe Nosave
und den unteren Teil habe ich folgendermaßen geändert
If Tifr2.ocf2a = 1 And Berechnung_3 < 182 Then
Set Tifr2.ocf2a
Servospeed = Berechnung_3 - Rc_min
Servospeed = Servospeed * 500
If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
Ocr2a = Tcnt2 + Servospeed
Decr Berechnung_3a
End If
If Tifr2.ocf2a = 1 And Berechnung_3 > 193 Then
Set Tifr2.ocf2a
Servospeed = Rc_max - Berechnung_3
Servospeed = Servospeed * 500
If Servospeed < 1000 Then Servospeed = 1000 'Sicherheitszeit
Ocr2a = Tcnt2 + Servospeed
Incr Berechnung_3a
End If
Das Ergebnis dieser Änderung ist, dass das dritte Servo deutlich zu schnell fährt. Aber ich kann alle drei Servos gleichzeitig betätigen.
Vermutlich fehlt es jetzt nur am Timing. Ich habe in der Doku versucht zu verstehen, wie der Timer 2 funktioniert. Den Prescaler habe ich gleich gelassen wie bei Timer1.
Anbei noch mal der geänderte Code.
VG
Thomas