Home › Forums › The libraries hosted on the site › PCF8574 i2c digital I/O expander › pcf8574 not work with multiple input pull up and output
- This topic has 1 reply, 1 voice, and was last updated 4 years, 3 months ago by
Renzo Mischianti.
-
AuthorPosts
-
-
1 February 2021 at 22:55 #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); }
-
1 February 2021 at 22:59 #9658
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
-
-
AuthorPosts
- You must be logged in to reply to this topic.