Evgeniy 285 Report post Posted November 28, 2017 Пример работы с часами реального времени '*******************************************************************************@ device pic16f628a, HS_OSC, CPD_OFF, PROTECT_OFF, MCLR_OFF, PWRT_ON, WDT_Off'*******************************************************************************'*******************************************************************************define LCD_DREG PORTA 'Порт данных ЖКИ '*define LCD_DBIT 0 'Вывод порта Бит данных ЖКИ '*define LCD_RSREG PORTB 'Управление линией RS '*define LCD_RSBIT 0 'Вывод порта линией RS '*define LCD_EREG PORTB 'Управление линией E '*define LCD_EBIT 1 'Вывод порта линией E '*define LCD_BITS 4 'Разрядность шины данных '*define LCD_LINES 2 'Количество строк ЖКИ '*define LCD_COMMANDUS 2000 'Задержка перед посылкой данных '*define LCD_DATAUS 50 'Задержка перед посылкой данных '*SCL var PORTB.2 '*SDA var PORTB.3 '*'*******************************************************************************trisA = %00000000 '*trisB = %11101000 '*OPTION_REG = %10000000 '*'*******************************************************************************Sec var BYTE '*Sec1 var BYTE '*Mins var BYTE '*Mins1 var BYTE '*Hr var BYTE '*Hr1 var BYTE '*Day var BYTE '*Date var BYTE '*Date1 var BYTE '*Mon var BYTE '*Mon1 var BYTE '*Yr var BYTE '*Yr1 var BYTE '*'*******************************************************************************Tmp var BYTE '*Tmp1 var BYTE '*'*******************************************************************************Hour var portb.7 '*Minut var portb.6 '*'*******************************************************************************'****************************** Приветствие ************************************Privet: '*LCDOUT $FE,1," Welcome!" '*pause 2000 '*'*******************************************************************************'******* Основной цикл (опрос кнопок, запрос времени, вывод на дисплей) ********Main: '*gosub read_time 'Запрос времени '*LCDOUT $FE,1," ", DEC2 Hr1,":",DEC2 Mins1,":",DEC2 Sec1 '*if hour = 0 then UpHour 'Нажата кнопка "Часы" '*if minut = 0 then UpMinut 'Нажата кнопка "Минуты" '*pause 1000 '*goto main '*'*******************************************************************************'*******************************************************************************UpHour: '*Hr1 = Hr1 + 1 '*if Hr1 > 24 then Hr1 = 0 '*gosub Write_time 'Записываем новое время '*pause 500 '*goto main '*'*******************************************************************************'*******************************************************************************UpMinut: '*Mins1 = Mins1 + 1 '*if Mins1 > 60 then Mins1 = 0 '*gosub Write_time 'Записываем новое время '*pause 500 '*goto main '*'*******************************************************************************'*******************************************************************************Read_time: '*i2cread sda, scl, $D0, 0, [sec,Mins,Hr,Day,Date,Mon,Yr] '*Tmp = Sec '*GOSUB Fix_bcd_in '*Sec1 = Tmp '*Tmp = Mins '*GOSUB Fix_bcd_in '*Mins1 = Tmp '*Tmp = Hr '*GOSUB Fix_bcd_in '*Hr1 = Tmp '*Tmp = Date '*GOSUB Fix_bcd_in '*Date1 = Tmp '*Tmp = Mon '*GOSUB Fix_bcd_in '*Mon1 = Tmp '*Tmp = Yr '*GOSUB Fix_bcd_in '*Yr1 = Tmp '*RETURN '*'*******************************************************************************'*******************************************************************************Write_time: '*Tmp = Mins1 '*GOSUB Fix_bcd_out '*Mins = Tmp '*Tmp = Hr1 '*GOSUB Fix_bcd_out '*Hr = Tmp '*Tmp = Date1 '*GOSUB Fix_bcd_out '*Date = Tmp '*Tmp = Mon1 '*GOSUB Fix_bcd_out '*Mon = Tmp '*Tmp = Yr1 '*GOSUB Fix_bcd_out '*Yr = Tmp '*Sec = 0 '*i2cwrite sda, scl, $D1, 0, [sec,Mins,Hr,Day,Date,Mon,Yr] '*RETURN '*'*******************************************************************************'*******************************************************************************Fix_bcd_in: '*Tmp1 = Tmp & 15 '*Tmp = Tmp >> 4 '*Tmp = Tmp1 + 10 * Tmp '*RETURN '*'*******************************************************************************'*******************************************************************************Fix_bcd_out: '*Tmp1 = Tmp / $A '*Tmp = Tmp - (Tmp1 * $A) '*Tmp = Tmp + (Tmp1 << 4) '*RETURN '*'******************************************************************************* ds1307.rar 3 Ridgecler, VitalForce and le_shef reacted to this Share this post Link to post Share on other sites
VitalForce 67 Report post Posted December 11, 2017 Привет Жень. Случайно не завалялась формула вычисления температуры с датчика DS3231? Все что находил в тырнете не работает. Проект скинул на почту. Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted December 11, 2017 Вина работе завтра посмотрю. Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted December 12, 2017 Посмотрел, там температуру вообще декодировать не надо! Считываем 2 байта с 11 адреса. В первом байте целое значение температуры, во втором одно из четырёх значений (0, 1, 2, 3). Это дело умножаем на 25, получим десятые и сотые доли градусов. Цена деления датчика 0,25 градусов. '*******************************************************************************ReadTemp: '*i2cread sda, scl, $D0, $11, [tempcel,tempdes] '*znak = tempcel.7 'Знак температуры берём из 7 бита целого значения '*if znak = 1 then tempcel = ~ tempcel 'Если отрицательная, инвертируем биты '*if znak = 0 then znak = "+" 'Знак + '*if znak = 1 then znak = "-" 'Знак - '*tempdes = (tempdes >> 6) * 25 'Сдвигаем старшие биты в младшие и умножаем на '*return '25, так как цена деления 25 соток. '*'******************************************************************************* В общем, код очень простой ds3232.zip 1 VitalForce reacted to this Share this post Link to post Share on other sites
VitalForce 67 Report post Posted December 12, 2017 Спасибо Жень. Не обратил внимания на деления по 0,25. Share this post Link to post Share on other sites
YUF 0 Report post Posted April 15, 2019 Евгений приветствую! Возникла потребность использовать часы реального времени. Нашел Вашу статью, все сделал как описано, но в результате на дисплее получаю - 02:02:02 Не могу понять в чем проблема? Подскажите пожалуйста. Использую PIC16F876 и китайскую сборочку с DS1307 Я написал часть проги только для считывания (без установки времени), я так понимаю, что при подаче питания часы должны запуститься и начать отчет времени с 0:0:0, или им обязательно нужно сделать установку времени? Я с I2C работаю впервые, пожалуйста помогите разобраться. Share this post Link to post Share on other sites
YUF 0 Report post Posted April 15, 2019 И еще забыл сказать, что при смене портов для SCL и SDA показания меняются - либо 02:02:02 либо 04:04:04 Пробовал вешать на все порты, везде одно и то же. Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted April 15, 2019 Добрый день! Порты ввода вывода правильно настроены? Тактовая частота, внутренние регистры микроконтроллера...? Можно попробовать в протэусе посмотреть работу прошивки. А сам код где? Share this post Link to post Share on other sites
YUF 0 Report post Posted April 15, 2019 Если я правильно понимаю, то SCL - порт должен быть на передачу, а SDA на прием. Тактовая 4 MHz - внешний кварц А код работы I2C взят Ваш один в один. Один вопрос, в даташите указано, что для чтения данных из DS1307 бит RW должен быть установлен в 1. Вот тут мне не понятно, для чтения должна быть команда: i2cread sda, scl, $D0, 0, [sec,Mins,Hr,Day,Date,Mon,Yr] или ...........................$D1............ У Вас $D1 используется для записи данных в часы. Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted April 15, 2019 Часы то хоть идут или постоянно отображается одна и та же информация? Мой код рабочий на 100%, я его как есть использовал в другом проекте, проверено в железе. Скинь хотя бы схему устройства (pic, индикатор, rtc), попробую написать код. Share this post Link to post Share on other sites