Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 5 of 5

Thread: PCF8574P Port Expander and Teensy 3.2

  1. #1
    Member dimitre's Avatar
    Join Date
    Aug 2016
    Location
    São Paulo
    Posts
    75

    PCF8574P Port Expander and Teensy 3.2

    I'm trying to use the PCF8574P port expander with Teensy 3.2 but I can't receive the transmission yet.
    I'm posting the wiring and the code.
    interrupt seems to be working, but no transmission yet.

    If I use pullup resistors in i2c ports the interrupt stops working.
    I've tried different chips, different teensies and checked continuity for all connections.

    Tried a i2c port scanner too and it doesn't find i2c device in any address.

    Ideas are very welcome

    Click image for larger version. 

Name:	IMG_4917.jpg 
Views:	5 
Size:	165.6 KB 
ID:	17571
    Click image for larger version. 

Name:	PCF8574P.png 
Views:	0 
Size:	46.3 KB 
ID:	17572

    Code:
    //PCF8574P
    
    #include <Wire.h>
    //Thanks for your help, my IC is a PCF8574AF, so the correct address was 0x38 (decimal 56)
    //B00100000 //B00111000
    #define EXPANDER 0x20  //expander address
    
    void setup() {
      Serial.begin(9600);
      Wire.begin();
      delay(300);
      expanderWrite(B11111111);
      attachInterrupt(5, expanderInterrupt, CHANGE);
      Serial.println("begin ");
      Serial.println(EXPANDER);
    }
    
    void loop() {
      Wire.requestFrom(EXPANDER, 1);
      if (Wire.available()) {
        byte _data = Wire.read();
        Serial.print("DATA :: ");
        Serial.println(_data, BIN);
    
        Serial.println(_data, BIN);
        Serial.println(_data);
        byte inpBuff = _data & 0x01;
        Serial.println(inpBuff, HEX);
      }
    }
    
    void expanderInterrupt() {
      Serial.print("interrupt :: ");
    
      Wire.requestFrom(EXPANDER, 1);
      if (Wire.available()) {
        byte _data = 0;
        _data = Wire.read();
        Serial.print("DATA :: ");
        Serial.println(_data, BIN);
    
        Serial.println(_data, BIN);
        Serial.println(_data);
        byte inpBuff = _data & 0x01;
        Serial.println(inpBuff, HEX);
      }
      Serial.println("------------------------");
    }
    
    void expanderWrite(byte _data ) {
      Wire.beginTransmission(EXPANDER);
      Wire.write(_data);
      Wire.endTransmission();
    }
    
    //byte expanderRead() {
    //  byte _data = 0;
    //  Wire.requestFrom(EXPANDER, 1);
    //  if (Wire.available()) {
    //    _data = Wire.read();
    //    Serial.println(_data, BIN);
    //  }
    //  return _data;
    //}

    and scanner code

    Code:
    // --------------------------------------
    // i2c_scanner
    //
    // Version 1
    //    This program (or code that looks like it)
    //    can be found in many places.
    //    For example on the Arduino.cc forum.
    //    The original author is not known.
    // Version 2, Juni 2012, Using Arduino 1.0.1
    //     Adapted to be as simple as possible by Arduino.cc user Krodal
    // Version 3, Feb 26  2013
    //    V3 by louarnold
    // Version 4, March 3, 2013, Using Arduino 1.0.3
    //    by Arduino.cc user Krodal.
    //    Changes by louarnold removed.
    //    Scanning addresses changed from 0...127 to 1...119,
    //    according to the i2c scanner by Nick Gammon
    //    http://www.gammon.com.au/forum/?id=10896
    // Version 5, March 28, 2013
    //    As version 4, but address scans now to 127.
    //    A sensor seems to use address 120.
    // 
    //
    // This sketch tests the standard 7-bit addresses
    // Devices with higher bit address might not be seen properly.
    //
    
    #include <Wire.h>
    
    
    void setup()
    {
      Wire.begin();
    
      Serial.begin(9600);
      Serial.println("\nI2C Scanner");
    }
    
    
    void loop()
    {
      byte error, address;
      int nDevices;
    
      Serial.println("Scanning...");
    
      nDevices = 0;
      for(address = 1; address < 127; address++ ) 
      {
        // The i2c_scanner uses the return value of
        // the Write.endTransmisstion to see if
        // a device did acknowledge to the address.
        Wire.beginTransmission(address);
        error = Wire.endTransmission();
    
        if (error == 0)
        {
          Serial.print("I2C device found at address 0x");
          if (address<16) 
            Serial.print("0");
          Serial.print(address,HEX);
          Serial.println("  !");
    
          nDevices++;
        }
        else if (error==4) 
        {
          Serial.print("Unknow error at address 0x");
          if (address<16) 
            Serial.print("0");
          Serial.println(address,HEX);
        }    
      }
      if (nDevices == 0)
        Serial.println("No I2C devices found\n");
      else
        Serial.println("done\n");
    
      delay(5000);           // wait 5 seconds for next scan
    }

  2. #2
    Senior Member
    Join Date
    Dec 2016
    Location
    Montreal, Canada
    Posts
    3,070
    I don’t see any pullups on I2C. You absolutely need them

  3. #3
    Member dimitre's Avatar
    Join Date
    Aug 2016
    Location
    São Paulo
    Posts
    75
    Thanks @tonton81.
    I've updated with some pullups and data is transmitting but interrupt pin stopped working. should I do something in that pin too?
    I've changed IC VCC to 3.3v now so I use pullups on the protoboard.
    Click image for larger version. 

Name:	pullups.jpg 
Views:	2 
Size:	214.1 KB 
ID:	17580

    which range of resistors should I use for i2c pullup?

  4. #4
    Senior Member
    Join Date
    Nov 2017
    Location
    Belgium
    Posts
    102
    @dimitre
    The PCF8574 INT pin is open drain, so it also needs a pullup resistor. Any value between 4k7 & 10k should do it.

  5. #5
    Member dimitre's Avatar
    Join Date
    Aug 2016
    Location
    São Paulo
    Posts
    75
    outstanding. everything working now

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •