Um einen PCF8574 als Eingang zu benutzen musst Du zuerst schreibend alle Pins auf HIGH setzen. Die externe Beschaltung zieht die Pegel dann auf LOW indem sie die Pins auf Masse schaltet. Diesen Low-Pegel kannst Du dann beim Einlesen des Portexpanders erkennen.
Hier ein Beispiel, wie man das mit C z. B. für einen Arduiono machen kann: http://cboden.de/mikro-controller/di.../45-pin-finder Dabei wird ein PCF8574 so angesteuert, dass seine Pins als Eingänge fungieren. Wenn Du die ganzen lcd Aufrufe weg lässt, bleibt nicht mehr viel Code für den PCF8574 übrig. Der Code sollte mehr oder weniger selbsterklärend sein. Bei Fragen dazu kann ich Dir aber gerne helfen. Anpassen auf Deine Programmierumgebung musst Du ihn aber selbst
- - - Aktualisiert - - -
hier mal der zusammengekürzte Programmcode, der nur noch die für den PCF8574 relevanten Teile beinhaltet:
Code:
// --------------------------------
// Benötigte Bibliotheken einbinden
// --------------------------------
#include <TinyWireM.h> // I2C
// ---------------------
// Konstanten definieren
// ---------------------
#define PORT_ADDR 0x20 // I2C-Adresse für Port-Expander
// -------------------------
// globale Variablen anlegen
// -------------------------
boolean data_received = false; // Flag zum erkennen, ob Daten gelesen werden konnten
// --------------------------------------------------------
// Setup-Routine (wird automatisch beim Starten ausgeführt)
// --------------------------------------------------------
void setup(){
// I2C Schnittstelle initialisieren
TinyWireM.begin();
// Port-Expander initialisieren
writePort(PORT_ADDR, 0xff);
}
// ------------------------------------------------------------
// Haupt-Routine (wird kontinuierlich als Schleife durchlaufen)
// ------------------------------------------------------------
void loop(){
byte data;
// Eingänge lesen
data=readPort(PORT_ADDR);
// prüfen, ob valide Ergebnisse geliefert wurden
if (data_received){
// Ab hier stehen die Stati des Portexpanders in der Variable
// data zur Verfügung
}
}
// --------------------------------------------
// Routinen zur Kommunikation mit dem Expander
// --------------------------------------------
byte readPort(int address) {
byte data=0xff;
TinyWireM.requestFrom(address,1);
if(TinyWireM.available()){
data=TinyWireM.receive();
data_received=true;
}
else {
data_received=false;
}
return data;
}
void writePort(int address, byte data) {
TinyWireM.beginTransmission(address);
TinyWireM.send(data);
TinyWireM.endTransmission();
delay(5);
}
Lesezeichen