- Offizieller Beitrag
Der INT-Eingang ermöglicht praktisch eine einfache Art und Weise, wie man im Programm die Flankenwechsel von dem Empfängersignal mitkriegt.
ZitatDer andere Weg ist das Pollen eines Portpins der als Eingang geschaltet ist. Auch das geht, ist aber kniffliger und man muss besser aufpassen was man tut...
Im Prinzip muss man ständig (nach der kleinen Aktion im Programm) sofort wieder die Ports abfragen und dann analysieren, ob sich da was an dem Empfängereingant getan hat. Sonst kommt man zu spät und die Messung von der Pulslänge ist nicht korrekt.
Dieses ständige "nachsehen" bläht den Code etwas auf. Aber er ist etwas "betriebssicherer".
In der Praxis würde das Programm mit dem INT-Eingang so funktionieren, dass Du zunächst mal einstellst, dass dieser Eingang auf einen positiven Flankenwechsel reagierst. Dann machst Du im Programm Deine ganz normale Geschichte, also PWM ansteuern usw. . Aber diesmal nicht die Ports manuell überwachen.
Sobald jetzt der Empfänger eine positive Flanke schickt (= Beginn des Pulses), wird der Interrupt ausgelöst. Das Programm springt dann vom aktuellen Stand sofort in diese Subroutine. Dort startests Du dann den Timer, um die Zeit für die Pulslänge zu messen.
Jetzt kommt der Gag: Du musst diesen Interrupt-Port jetzt umprogrammieren, damit er nicht mehr auf eine steigende Flanke, sondern auf eine fallende Flanke reagiert. Dann verlässt Du diese Subroutine und Dein Programm macht wieder da weiter, wo Du vorher warst.
Irgendwann ist das Empfängersignal beendet, es gibt eine fallende Flanke. Der Interrupt wird ausgelöst, das Programm springt in die Interrupt-Subroutine und Du mist den aktuellen Stand des Timers. Kannst dann die Differenz ausrechnen und weist, wie lange das Empfängersignal war. Dann den Interrupteingang wieder auf "steigende Flanke" umstellen, damit das nächste Empfängersignal erwischt wird.
Durch diese Interrupt-Routine ist das alles etwas übersichtlicher im Code. Vor allem brauchst Du jetzt nicht mehr aufpassen, dass ein Teil im Programm zu lange braucht, weil Du sonst die Abfrage vom Timer (bei einem Flankenwechsel des Empfängersignals) verschlafen hättest.
Nachteil der Interrupt-Methode: Sobald ja eine Flankenänderung ist, wird das Programm hektisch und springt in die Interrupt-Subroutine hinein. Wenn Du Störungen am Empfängerpegel hast, dann wird Dir bei jedem kleinen Spike das Programm in die Routine springen. Also ständig da hinein-/herausspringen und Blödsinn einlesen. Damit kannst du den Prozessor praktisch "tot" machen, er tut nichts anderes mehr.
Ich habe mich deshalb für die etwas mühsamere aber betriebssichere Methode entschieden. Das war zu der Zeit, als man nur mit 40MHz-Funken agierte und Störungen die Regel waren.
Mittlerweile gibt es die 2.4GHz-Funken. Und die Störungen sind praktisch weg. Ich könnte also auch die zweite Möglichkeit mit der Interrupt-Methode empfehlen. Sobald Du aber mal ausnahmsweise eine 40MHz-Funke anhängst, hätte ich dazu Bausschmerzen....
Aber: Die Hinweise von den beiden Atmel-Profis waren gut. Du solltest den Empfängereingang ruhig auf einen Port legen, wo man damit auch sogenannte Hardware-Interrupts auslösen kann. Ich bin sicher, dass Du das irgendwann mal ausprobieren wirst.