DS 1307 и LCD

audel
Offline
Зарегистрирован: 01.03.2012

Господа, добрый день!!!

Столкнулся с проблемой, надеюсь на Вашу помощь.

По I2C шине подключил LCD, по этой инструкции jt5.ru/examples/oled-i2c , все хорошо и дисплей работает, проблема начинается когда я подключаю еще DS1307 соответственно так же по I2C, библиотеку для часов брал отсюда code.google.com/p/ds1307new/ .

Происходит следующее, часы начинают выводить не положеное и установленное на них время с датой, а 165:165:85 165-165-2165 MON, как только отключаю дисплей, часы вновь начинают ходить исправно, правда иногда бывает что после такого подключания сбивается время.  Причем так же пробывал следующее, отключал питание полностью на дисплей и PCF8574, но соединял их по шине, в итоге такая же ситуация со временем. Есть подозрение, что не хватает какой то обвязки, хотя подключал часы использую теже резисторы которые стоят на дисплее. Ниже привожу тестовый код
 

#include <LiquidCrystal_I2C.h>
#include <DS1307new.h> 
#include <Wire.h>     

LiquidCrystal_I2C lcd(0x20,16,2);


void setup()

{
  
  Serial.begin(9600);   соединение

lcd.init();


/*                      
RTC.stopClock();
RTC.fillByYMD(2012,5,3);
RTC.fillByHMS(03,48,0);
RTC.setTime();
RTC.startClock();
*/
}

void loop()

  {
  RTC.getTime();
  if (RTC.hour < 10)                    
  {
    Serial.println();
    Serial.print("0");
    Serial.print(RTC.hour, DEC);
  } 
  else
  {
    Serial.print(RTC.hour, DEC);
  }
  Serial.print(":");
  if (RTC.minute < 10)                  
  {
    Serial.print("0");
    Serial.print(RTC.minute, DEC);
  }
  else
  {
    Serial.print(RTC.minute, DEC);
  }
  Serial.print(":");
  if (RTC.second < 10)                  
  {
    Serial.print("0");
    Serial.print(RTC.second, DEC);
  }
  else
  {
    Serial.print(RTC.second, DEC);
  }
  Serial.print(" ");
  if (RTC.day < 10)                    
  {
    Serial.print("0");
    Serial.print(RTC.day, DEC);
  }
  else
  {
    Serial.print(RTC.day, DEC);
  }
  Serial.print("-");
  if (RTC.month < 10)                   
  {
    Serial.print("0");
    Serial.print(RTC.month, DEC);
  }
  else
  {
    Serial.print(RTC.month, DEC);
  }
  Serial.print("-");
  Serial.print(RTC.year, DEC);          
  Serial.print(" ");
  switch (RTC.dow)                      
  {
    case 1:
      Serial.print("MON");
      break;
    case 2:
      Serial.print("TUE");
      break;
    case 3:
      Serial.print("WED");
      break;
    case 4:
      Serial.print("THU");
      break;
    case 5:
      Serial.print("FRI");
      break;
    case 6:
      Serial.print("SAT");
      break;
    case 7:
      Serial.print("SUN");
      break;
  }
 { 
 lcd.setCursor(0, 0);  
 lcd.print(RTC.hour);
 } 
 delay(1000);
 
}

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

У Вас микросхема PCF8574 имеет 3-х битную адресацию, у часов адрес 68, у индикатора 20 - у этих адресов младшие 3 бита совпадают, вот они и конфликтуют. Подключите 1-ю ногу PCF8574 к +5 через резюк подтяжки и задайте адрес индикатора "0х21" - должно сработать.

audel
Offline
Зарегистрирован: 01.03.2012

Разобрался, дело было не в адресации, просто неправильно расчитал подтягивающие резисторы, т.к. минимальный будет 1,5к а максимальный 5к, на осцилографе хороший график примерно при 4,7, их и использовал, после чего все чудесно заработало.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Я тоже был неправ, микруха PCF8574 старшие биты адреса тоже отрабатывает, но они прошиты на постоянку. Три младших бита позволяют посадить на одну шину 8 таких микрух.

А с резисторами все просто - они принадлежат шине, а не устройству, т.е. подтягивающие резисторы общие для всех устройств.