pcf8574 not work with multiple input pull up and output

Home Forums The libraries hosted on the site PCF8574 i2c digital I/O expander pcf8574 not work with multiple input pull up and output

Tagged: ,

Viewing 1 reply thread
  • Author
    Posts
    • #9656
      Jørn

        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.

        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);
        }
        
        
        
      • #9658
        Renzo Mischianti
        Keymaster

          Hi Jorn,
          to manage pull up and pull down change in debounce, you must specify (like the Arduino pin) if the initial state is in pull up or pull down.

          By default It’s pull down.

          The library has an internal state that memorizes the value change, and though you don’t use an interrupt you can read the button change.

          So initialization of your pin to work must be

          
          unit->pinMode(3, INPUT_PULLUP);
          

          Bye Renzo

      Viewing 1 reply thread
      • You must be logged in to reply to this topic.
      Exit mobile version