Fortsetzung:
Servoausgabe:
Die Servoimpulse für alle Servos werden nacheinander ausgegeben und der Timer0 mit seinem Overflow Interrupt
zum Abmessen der Zeiten verwendet.
Die Servoimpulslänge für jeden Kanal wird vom Hauptprogramm in den Variablen "Servoausgabe_1" bis "Servoausgabe_4" als Vorladewert (Servoausgabe_1 = 256 - Berechnung_1a) abgelegt.
Tritt die ISR "Servoausgabe" zum erstenmal auf, wird Kanal 1 bearbeitet.
Die ISR wird durch den Timer0 Overflow Interrupt aufgerufen.
Der Vorladewert für den ersten Kanal wird geholt und der Timer0 damit geladen und der Portpin für Servo auf high gesetzt - Pulsbeginn. (Durch Abfrage des Zustandes des Portpins wird auf Puls beginnen oder Puls beendene entschieden)
Nach Erreichen des nächsten Overflowinterrupts, die Zeit wird ja durch den Vorladewert bestimmt, wird das Servosignal nach low gesetzt - Pulsende.
Dann wird die Kanalnummer noch erhöht und gleich der nächste Kanal bearbeitet mit Vorladewert holen und Pin für Pulsbegin auf high. Ablauf wie für Kanal 1.
So werden 4 Ausgabekanäle ausgegeben und dann eine Ausgabepause gemacht um die ca. 50Hz für Servopulsfrequenz zu erreichen.
Die "Pausenanfang" und "Pausenende" Instruktionen am Ende der ISR machen die ca. 20ms Folgen für die Servopulse. Wurden alle 4 Kanäle abgearbeitet/ausgegeben (ca 2ms * 4 = 8ms), wird eine Pause von 12ms auch durch temporäre Veränderung des Prescalers gemacht, damit weniger Interrupts auftreten und dadurch die Messung der Eingänge nicht so sehr gestört werden kann. Die 50Hz Ausgabe zu den einzelnen Servos ist etwas abhängig von den Pulslängen. Da die Genauigkeit von 50Hz aber nicht so kritisch sind, haben wir die damals vernachlässigt.
Gruß
Searcher
PSBild hier Bild hier Sonst würde etwas nicht stimmen. Bild hierirgendwie stimmt da etwas nicht.
Viel Erfolg beim testen. Bis dann.
Lesezeichen