-
-
Moderator
Robotik Visionär
Hallo
Ich weiß nicht, wie du auf die 22,5 kommst (es sind wohl ms), aber löse dich davon. Um die Position des Steuerknüppels erkennen zu können ist es nahezu unerheblich in welchem Abstand die Impulse kommen, die Dauer der Impulse ist das Entscheidende. Auch für den Intervall des Timers ist die Impulsdauer uninteressant, er muss nur in regelmäßigen Abständen (das "regelmäßig" wiederrum ist wichtig) den Pin abfragen an dem das RC-Signal anliegt. Je schneller das geschied, umso größer sind die Werte der gemessenen Impulslängen und umso genauer die Position (und umso weniger Zeit bleibt für's Hauptprogramm. Bei 8MHz und 100kHz Timerfrequenz werden Impulslängen von ca. 50-200 gemessen, das passt wunderbar. Es bleiben dann 80 Taktzyklen zwischen den Interrupts minus den Zyklen während des Interrupts für's Hauptprogramm) .
Die ISR funktioniert so (in Worten, wenn man den Code oben nicht versteht):
Solange das Signal am Pin low ist(=kein Impuls), passiert nichts. Sobald es nach High wechselt, wird jedesmal wenn die ISR den Pin abfragt ein Zähler erhöht (rc_count im Beispiel oben) und das solange wie der Pegel auf high bleibt. Wenn nun der Pegel am Pin wieder low wird (=Impuls zu Ende) erkennt dies der nächste Aufruf der ISR. Nun hat der Zähler einen Wert (if (rc_count)...) der der Impulsdauer entspricht (abhängig vom Intervall des Timers). Dieser Wert wird gespeichert (rc_pos) und der Zähler gelöscht. Ab jetzt "warten" wir wieder bis die ISR den Start des nächsten Impuls erkennt.
Da in rc_pos immer die zuletzt gemessene Impulslänge gespeichert ist, kann man diesen Wert dann im Hauptprogramm auswerten. Bei meiner Fernbedienung sind die Mitte-Werte ca. 130 (Gesamtbereich 90-170). Ob das an meinem Code oder an der Fernbedienung liegt kann ich noch nicht sagen, ist aber unerheblich, wenn man die Werte kennt.
Vielleicht noch ein Versuch die Funktion der ISR zu veranschaulichen:
Ein Lattenzaun hat einige Lücken, wieviele Bretter fehlen jeweils in den Lücken(=Impulsdauer)?. Mit geschlossenen Augen laufen wir im Tangoschritt(=Hauptprogramm) am Zaun entlang und klopfen (=wir sind die ISR) gleichmaßig schnell (=Timerintervall) gegen den Zaun (=fragen den Pin ab). Sobald wir das erste Mal in eine Lücke hauen(=Impulsstart), beginnen wir zu zählen(=rc_count) wie oft wir ins Leere hauen. Wir tanzen, klopfen und zählen weiter, bis wir wieder auf eine Latten treffen(=Impulsende). Viele fehlende Latten(=lange Impulse) ergeben hohe Zählwerte, wenige fehlende Latte ergeben niedrige Zählwerte.
Wenn wir schneller klopfen erhöhen sich alle Zählwerte(=höhere Timerfrequenz), klopfen wir langsamer, werden die Werte kleiner(=kleinere Timerfrequenz). Wenn wir zu langsam klopfen, könnten wir eine Lücke überspringen, wenn wir zu schnell klopfen, werden wir stolpern, weil wir keine Zeit mehr haben, mit den Beinen Tango zu tanzen.
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen