ich habe bisher noch keine Ahnung von Arduino, habe aber mit anderen Atmels schon gearbeitet.
Mich würde interessieren, ob jemand einen einfachen Weg weiß, viele (ca.20-30) Encoder (zur manuellen Eingabe von Daten) an einen Arduino (oder notfalls auch mehrere, miteinander verbundene) anzuschließen. Dabei kommt es nicht auf Geschwindigkeit an, es darf ruhig gelegentlich mal ein Impuls "übersehen" werden; es müssen auch nicht mehrere Encoder gleichzeitig ausgewertet werden. Dafür sollte es mit allen gängigen, billigen Encodern (12-24 Schritte) funktionieren, möglichst ohne viel Schaltungsaufwand...
So wie ich's aus dem Post verstanden habe handelt es sich um elektromechanische Inkrementalgeber ("incremental rotary encoder") - d. h. zwei Schalter aus deren Zustandsänderung eine Drehrichtung ausgelesen werden kann.
Ah ja, okay, ich habe mal genau für diesen Decoder einen Artikel geschrieben, wie man ihn anschließt und dann abfragt und die Abfrage auswertet. Wen es interessiert der Artikel ist hier: elektronik-bastelkeller.de
Oftmals wird das so gemacht, dass der Encoder einen Interrupt auslöst, wenn ein Kontakt sich schließt, wenn also dran gedreht wird. Durch das Prellen der Kontakte kann es aber leicht passieren, dass der Controller dann nur noch mit Encoder-Auswertung in der Interrupt-Service-Routine beschäftigt ist. Deshalb habe ich das anders gelöst, indem ich 1000 Interrupts pro Sekunde erzeuge, in denen der Encoder abgefragt wird. Die Auswertung findet mit einer Art fest programmierter Gray-Code-Logik statt. Dadurch wird das Prellen der Kontakte ziemlich sicher überlesen.
Ich würde eigentlich kein Problem darin sehen, z.B. mit mehren PCF 8574 über den I²C-Bus eine ganze Menge von solchen Encodern abzufragen und das dann auszuwerten. Die Abfragefrequenz kann sicherlich noch vermindert werden, ohne die Sicherheit der Erkennung zu gefährden.
@Serenifly: Mit dem schnelleren Einlesen der Ports muss ich Dir völlig Recht geben. In der Regel sollte man ja im Interrupt-Service immer so schnell wie nur möglich arbeiten.
Ich habe mir den Code im Microcontroller.net angesehen. Ja, im ersten Beispiel der Code ist sinngemäss das Gleiche wie in meinem Beispiel. Aber anders herum, wie will man es mit dem Gray-Code auch großartig anders machen? Es ist halt wichtig alle Zustandsänderungen die in mehr als einem Bit Änderung resultieren zu verwerfen. Solche Encoder gibt es sogar in Hardware gegossen. Oder z.B. hier: Quadratur-Decoder auch das gleiche Prinzip.
Gruß,
Ralf