Преобразователь интерфейса, PCF8574

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

http://www.nxp.com/documents/data_sheet/PCF8574.pdf

посмотри 5 и 9 страницы. выводы которыми устанавливать адрес устройства. сделай разные, запиши адреса и используй в своей программе

i2cScanner используй. так проще

Grigory
Offline
Зарегистрирован: 29.03.2014

проверил сканером - результат зависание на моменте посылки данных на порт, при ломании головы об стену заметил что у меня в схеме используются pcf8574t, pcf8574at согласно даташитам у них разная адресация. Но вот вопрос почему происходит зависание при отправке байта по адресу(с i2cscaner). контакт сда с микросхемы уходит на А4, сцл уходлит на А5 на ардуине. Куда копать?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

как определил что на момент посылки данных происходит зависание? 

Radjah
Offline
Зарегистрирован: 06.08.2014

На форуме советовали обе линии подтянуть к 3,3 вольта.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

почему 3.3В а не 5В?

потяжка резистороми надеюсь

так как узнал про зависание в момент передачи?

Grigory
Offline
Зарегистрирован: 29.03.2014

Сейчас при себе нет скеча, но смысл в том что при каждой отправке на порт пытаюсь вывести текст на сериал порт, один раз или два ардуинка отправляет и все тишина, хотя по условию стоит что сообщений должно быть 8 штук. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

что значит отправка в порт? 

это

PCF.toggle(i);

или это

Wire.beginTransmission(address);
Wire.write(data);
Wire.endTransmission();

 

Grigory
Offline
Зарегистрирован: 29.03.2014
Wire.beginTransmission(address);
2 Wire.write(data);
3

Wire.endTransmission();

вот на этом

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

странно

код приложи

Grigory
Offline
Зарегистрирован: 29.03.2014

/**
* I2CScanner.ino -- I2C bus scanner for Arduino
*
* 2009,2014, Tod E. Kurt, http://todbot.com/blog/
*
*/
#include "Wire.h"
extern "C" {
#include "utility/twi.h" // from Wire library, so we can do bus scanning
}
// Scan the I2C bus between addresses from_addr and to_addr.
// On each address, call the callback function with the address and result.
// If result==0, address was found, otherwise, address wasn't found
// (can use result to potentially get other status on the I2C bus, see twi.c)
// Assumes Wire.begin() has already been called
void scanI2CBus(byte from_addr, byte to_addr,
void(*callback)(byte address, byte result) )
{
byte rc;
byte data = 0; // not used, just an address to feed to twi_writeTo()
for( byte addr = from_addr; addr <= to_addr; addr++ ) {
rc = twi_writeTo(addr, &data, 0, 1, 0);
callback( addr, rc );
}
}
// Called when address is found in scanI2CBus()
// Feel free to change this as needed
// (like adding I2C comm code to figure out what kind of I2C device is there)
void scanFunc( byte addr, byte result ) {
Serial.print("addr: ");
Serial.print(addr,DEC);
Serial.print( (result==0) ? " found!":" ");
Serial.print( (addr%4) ? "\t":"\n");
}
byte start_address = 1;
byte end_address = 100;
// standard Arduino setup()
void setup()
{
Wire.begin();
Serial.begin(19200);
Serial.println("\nI2CScanner ready!");
Serial.print("starting scanning of I2C bus from ");
Serial.print(start_address,DEC);
Serial.print(" to ");
Serial.print(end_address,DEC);
Serial.println("...");
// start the scan, will call "scanFunc()" on result from each address
scanI2CBus( start_address, end_address, scanFunc );
Serial.println("\ndone");
}
// standard Arduino loop()
void loop()
{
// Nothing to do here, so we'll just blink the built-in LED
digitalWrite(13,HIGH);
delay(300);
digitalWrite(13,LOW);
delay(300);
}

Скетчкоторый пытаюсь запустить

#include "PCF8574.h"
//#include <pcf8574.h>
#include <Wire.h>

// adjust addresses if needed
PCF8574 PCF_20 (0x27);
 //PCF8574 PCF_21(0x38);
// PCF8574 PCF_22(0x22);
//PCF8574 PCF_23(0x23);
//PCF8574 PCF_24(0x24);
//PCF8574 PCF_25(0x25);
//PCF8574 PCF_26(0x26);
//PCF8574 PCF_27(0x27);  // add switches to lines  (used as input)
//PCF8574 PCF_28(0x28);
//PCF8574 PCF_39(0x39);  // add leds to lines      (used as output)

void setup(){
  Serial.begin(9600);
  Wire.begin();
}

void loop(){
 // Serial.print(1);  
  for (int i=0;i<=7;i++)
  {
    Serial.print(i);
   PCF_20.write(i,LOW);
     
   delay(10);
     PCF_20.write(i,HIGH);
   delay(10);
  }
/*    for (int i=0;i<=7;i++)
  {
   PCF_21.write(i,LOW);
   delay(10);
     PCF_21.write(i,HIGH);
   delay(10);
  }
 
      for (int i=0;i<=7;i++)
  {
   PCF_22.write(i,LOW);
   delay(10);
     PCF_22.write(i,HIGH);
   delay(10);
  }

 for (int i=0;i<=7;i++)
  {
   PCF_23.write(i,LOW);
   delay(10);
     PCF_23.write(i,HIGH);
   delay(10);
  }
 
 
   for (int i=0;i<=7;i++)
  {
   PCF_24.write(i,LOW);
   delay(10);
     PCF_24.write(i,HIGH);
   delay(10);
  }
 
   for (int i=0;i<=7;i++)
  {
   PCF_25.write(i,LOW);
   delay(10);
     PCF_25.write(i,HIGH);
   delay(10);
  }
 
   for (int i=0;i<=7;i++)
  {
   PCF_26.write(i,LOW);
   delay(10);
     PCF_26.write(i,HIGH);
   delay(10);
  }
 
   for (int i=0;i<=7;i++)
  {
   PCF_27.write(i,LOW);
   delay(10);
     PCF_27.write(i,HIGH);
   delay(10);
  }
 
   for (int i=0;i<=7;i++)
  {
   PCF_28.write(i,LOW);
   delay(10);
     PCF_28.write(i,HIGH);
   delay(10);
  }*/
 
}

Grigory
Offline
Зарегистрирован: 29.03.2014

Но и предыдущие варианты тоже висли

Grigory
Offline
Зарегистрирован: 29.03.2014

Вот тут не понял, зачем подтягивать на 3 если брать одну микруху то она спокойно работает на 5