Site icon Renzo Mischianti

pcf8574 not work with multiple input pull up and output

Hello, Thanks for a quick reply. I just wanted to inform that your library does not work if you have a mix of input and output pins. As soon as you try to write to an output pin, the input pins is stucked to 0. I have attached a simple diagram and code to show this. You may use this setup to find out what is wrong. Pcf8574-test I switched to a different library and then everything in my code work as expected.  


#include 

PCF8574 *unit = NULL;

/*
 * Delay function for debugging.
 * Give me time to move the pins on the multimeter to the proper pin for measuring.
 */
void countdown(const int cnt)
{
  Serial.print(F("Counting down... "));
  for (int i = 0; cnt > i; i++) {
    delay(1000);
    Serial.print(i);
    Serial.print(' ');
  }
  Serial.println();
}

void setup() 
{
  Serial.begin(9600);
  Serial.println(F("\n\nInitializing"));

  // Initialize the powerboard.
  Serial.println(F("Countdown to initialization of the PCF8574A"));
  countdown(10);
  Serial.println(F("\nInitializing the PFC8574A"));

  unit = new PCF8574(0x38);
  unit->begin();

  Serial.println(F("Configuring P0"));
  unit->pinMode(0, OUTPUT);
  
  countdown(10);
  Serial.println(F("Configuring P1"));
  unit->pinMode(1, OUTPUT);

  countdown(10);
  Serial.println(F("Configuring P2"));
  unit->pinMode(2, OUTPUT);

  countdown(10);
  Serial.println(F("Configuring P3"));
  unit->pinMode(3, INPUT);

  countdown(10);
  Serial.println(F("Configuring P4"));
  unit->pinMode(4, INPUT);

  countdown(10);
  Serial.println(F("Configuring P5"));
  unit->pinMode(5, INPUT);

  countdown(10);
  Serial.println(F("Configuring P6"));
  unit->pinMode(6, INPUT);

  countdown(10);
  Serial.println(F("Configuring P7"));
  unit->pinMode(7, INPUT);

  Serial.println(F("PCF8574A tester ready"));
}

void loop() 
{
  bool    stat;
  char    str[10];

  // Turn on outputs
  for (uint8_t p = 0; 3 > p; p++) {
    unit->digitalWrite(p, HIGH);
  }

  // Scan inputs.
  Serial.print(F("Inputs: "));
  for (uint8_t p = 3; 8 > p; p++) {
    stat = unit->digitalRead(p);
    sprintf_P(str, PSTR("P%d=%d  "), p, stat);
    Serial.print(str);
  }
  Serial.println();

  delay(1000);

  // Turn off outputs
  for (uint8_t p = 0; 3 > p; p++) {
    unit->digitalWrite(p, LOW);
  }

  delay(1000);
}


Exit mobile version