Hallo zusammen,
jetzt ist auch die Software soweit fertig und funktioniert sogar.
Die Software für den Mikrocontroller wurde mit dem CCS Compiler in "C" geschrieben. Der CCS Compiler bietet einige eingebaute Funktionen an,
wie z.B. I2C Senden und Zeitverzögerungen in Mikro- und Millisekunden. Das sollte sich für andere Compiler recht einfach nachbilden lassen, wenn
man keinen PIC Controller verwenden möchte.
Die Empfangsseite habe ich in Python für den Raspberry erstellt. Ich muss dazu sagen, dass ich Python gar nicht gelernt habe, sondern mir einfach
nur die Befehle heraussuche, die ich gerade benötige. Erfahrene Programmierer mögen mir dies nachsehen und bei Bedarf verbessern.
Wenn man es richtig machen wollte, würde man sowieso kein Python verwenden...
So funktioniert es auf der Senderseite:
Am Encoder-Chip sind 14 Tasten angeschlossen. Ein zusätzlicher Eingang ist mit einem Jumper beschaltet, den man mit einer Lötbrücke auf GND
oder +3 V legen kann. Dadurch können zwei Fernbedienungen mit demselben Empfänger verwendet werden. Ob man das braucht, sei mal dahingestellt,
es geht jedenfalls.
Wird eine Taste gedrückt, sendet der Chip eine Sequenz aus Startmarkierung, Adresse und Daten mit einer Modulation von 38 KHz aus. Die Adresse
verwende ich überhaupt nicht, damit könnte man viele unterschiedliche Fernbedienungen realisieren. Es gibt auch die Möglichkeit, zwei Tasten gleichzeitig
zu drücken. Oldtimer unter uns kennen das von Kassettenrekordern, wo man Play und Record gleichzeitig drücken musste, um etwas aufzunehmen.
Hach, das waren noch Zeiten...
Wenn die Taste gedrückt bleibt, gibt der Chip eine 'Repeat' Sequenz aus und wiederholt diese alle 100 ms. Es bleibt dem Empfänger überlassen, was
er mit dieser Information macht.
Das passiert auf der Empfangsseite:
Der kleine PIC Mikrocontroller hat die I2C-Logik in Hardware implementiert. Man muss sich also nicht um das Protokoll scheren, das macht der von allein.
Ich habe einen Interrupt dafür aktiviert und innerhalb der Interrupt-Routine gibt es nur drei Befehle, das ist wirklich überschaubar.
Wenn der Tastencode erkannt wurde, wird die LED für 50 ms aktiviert. Das ist zugleich die Interrupt-Leitung, die man z.B. beim Raspberry anschließen kann.
Man vermeidet damit, dass der Raspberry 20x pro Sekunde über I2C den Status des Empfängers abfragen muss. Anstelle dessen wird er benachrichtigt,
dass ein neuer Tastendruck vorliegt und muss nur noch den Tastencode abholen. Das spart Zeit und wertvolle Ressourcen - auch auf dem I2C-Bus.
Man kann natürlich auch periodisch abfragen, dann bekommt man ein 0xff wenn nichts gedrückt wurde, ansonsten den Tastencode. Das geht also auch.
Eine Besonderheit ist eine ständig gedrückte Taste. Da kann schicke ich erstmal den normalen Tastencode raus, weil ich ja noch nicht weiß, ob die Taste
gedrückt bleibt. Wenn ich darauf folgend den Repeat Code erkenne, sende ich die zuletzt erkannte Taste erneut raus und setze als Markierung das Bit 6.
So wird aus 0x01 beispielsweise 0x41 oder aus 0x0d beispielsweise 0x4d.
Das kann man beispielsweise für ein Tasten-Repeat verwenden oder für die Bewegung des Mauszeigers, wie ich es für OpenCPN verwende.
Hm, ziemlich trockene Sache und es geht leider noch weiter...