Wie: I/O Multiplexing auf Digital Ports?

Wie hier in einem früheren Thread beschrieben, habe ich an einem Arduino UNO sowohl den Tlc5940 als auch das LCD 16x2 angeschlossen.
Damit sind die DigitalPins 2-11 und 13 belegt. Pin 0-1 sollten m.W. für die ser. Kommuikation frei bleiben. Pin 12 könnte evtl. verwendet werden, dazu wäre allerdings eine Änderung in der Tlc5940 Bibliothek notwendig, da Tlc.init() irgendwie den Pin 12 auf HIGH setzt. Pin 12 ist auch der PB4/MISO Pin des ATmega328.

Ich benötige nun noch wenigstens 3 reine Digtale Eingänge deren Zustände allerdings nicht in jedem Loop benötigt werden.

Ich stelle mir das so vor, dass z.B. in den geradzahligen Loop-Durchläufen die Pins 8, 7, und 6 auf OUTPUT gesetzt sind und dann zur Ausgabe der Informationen an das LCD verwendet werden können, im nächsten Loop werden diese dann auf INPUT gesetzt und die daran anliegenden Zustände abgefragt.

Dazu müssen natürlich die Pins gemultiplext werden mit einer geeigneten Schaltung, die wechselweise diese Pins an das LCD anschließt und dann wieder an die Eingangssignale und dieser wechsel muss natürlich mit dem Loop synchronisiert werden, wozu dann noch ein weiterer Digitaler Pin notwendig wäre (könnte eigentlich nur noch Pin 12 sein).

Hat jemand mal ein ähnliches Problem gelöst oder kennt jemand iregndeinen Link oder hat sonst einen Tipp?

Hi,

evtl. kannst Du Dioden verwenden. Das kann Uwe vermutlich am besten beantworten.
Aber was anderes. Brauchst Du die serielle Kommunikation während dem Betrieb? Wenn nicht, kannst Du die Pins verwenden. Ansonsten gibt es noch die Möglichkeit ein LCD über nur drei Pins anzuschließen...

Gruß

Sebastian

Du kannst auch die Analog-Ports als digitale Pins verwenden, falls diese nicht bereits für analoge Aufgaben verwendet wurden.

..While the main function of the analog pins for most Arduino users is to read analog sensors, the analog pins also have all the functionality of general purpose input/output (GPIO) pins (the same as digital pins 0 - 13).

Pin mapping
The analog pins can be used identically to the digital pins, using the aliases A0 (for analog input 0), A1, etc. For example, the code would look like this to set analog pin 0 to an output, and to set it HIGH:

pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);

...oder anstatt A0 geht auch 14. also pinMode(A0,OUTPUT) ist das gleiche wie pinMode(14,OUTPUT)

Genau und für alle analogen Ports heisst das dann:

A0-A5 ergibt das Port 14-19

Sehr schön, dann gibt es ja eine Reihe von möglichen Lösungen.
Herzlichen Dank für die Antworten!

Hallo Tomybyte
Obwohl schon Lösungen genannt wurden, da ich direkt gefragt wurde:
Ich würde das mit gleichzeitig als Eingang und Ausgang verwendete Pin nicht verwenden, da der Ausgang zeitweise vom ATmega definiert ist (wenn das Pin Ausgang ist und es muß garantiert werden, daß da 2 Ausgänge zusammengeschaltet sind kein Kurzschluß entsteht; Ausgang vom Arduino und Ausgang von der Schaltung die gelesen wird) und teilweise (wenn das Pin Eingang ist) vom Zustand des "Eingangssignals" das der Atmega lesen soll. Auf diese Weise hast Du unter Umständen ein schönes Rechtecksignal.
Meine Vorschläge:

  • Die Analogen Eingänge des Arduinos als digitale Eingänge bzw Ausgänge verwenden.
  • LCD display über ein Schieberegister 74hc595 (beispiele sind auf der Arduino Seite)
  • mit Schieberegister die Ausgänge/ Eingänge erweitern ( 74HC595 bzw 74HC165)
  • I2C Port Expander

Grüße Uwe

Hallo Uwe,

danke für die Anregungen. Habe hier etwas zur Porterweiterung mit Schieberegistern gefunden:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister
Ist zwar recht gut geschrieben, aber gibt es da auch direkt was für den Arduino?
Hab mal vor vielen jahren was mit Schieberegistern gemacht, muss mich nun aber ganz neu reindenken!

Gruß Tom

Ist zwar recht gut geschrieben, aber gibt es da auch direkt was für den Arduino?

Etwa so? http://www.arduino.cc/en/Tutorial/ShiftOut

Korman