DS 1307 и LCD
- Войдите на сайт для отправки комментариев
Господа, добрый день!!!
Столкнулся с проблемой, надеюсь на Вашу помощь.
По 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);
}
У Вас микросхема PCF8574 имеет 3-х битную адресацию, у часов адрес 68, у индикатора 20 - у этих адресов младшие 3 бита совпадают, вот они и конфликтуют. Подключите 1-ю ногу PCF8574 к +5 через резюк подтяжки и задайте адрес индикатора "0х21" - должно сработать.
Разобрался, дело было не в адресации, просто неправильно расчитал подтягивающие резисторы, т.к. минимальный будет 1,5к а максимальный 5к, на осцилографе хороший график примерно при 4,7, их и использовал, после чего все чудесно заработало.
Я тоже был неправ, микруха PCF8574 старшие биты адреса тоже отрабатывает, но они прошиты на постоянку. Три младших бита позволяют посадить на одну шину 8 таких микрух.
А с резисторами все просто - они принадлежат шине, а не устройству, т.е. подтягивающие резисторы общие для всех устройств.