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 таких микрух.
А с резисторами все просто - они принадлежат шине, а не устройству, т.е. подтягивающие резисторы общие для всех устройств.