Перейти к содержанию

Evgeniy

Часы реального времени ds1307

Рекомендуемые сообщения

Пример работы с часами реального времени

time.JPG

 

'*******************************************************************************
@ 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Привет Жень. Случайно не завалялась формула вычисления температуры с датчика DS3231? Все что находил в тырнете не работает.

 

Проект скинул на почту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
 

Посмотрел, там температуру вообще декодировать не надо! 

Считываем 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
 

Евгений приветствую!

 

Возникла потребность использовать часы реального времени.

Нашел Вашу статью, все сделал как описано, но в результате на дисплее получаю - 02:02:02

Не могу понять в чем проблема?

Подскажите пожалуйста.

 

Использую PIC16F876  и китайскую сборочку с DS1307

 

Я написал часть проги только для считывания (без установки времени), я так понимаю, что при подаче питания часы должны запуститься и начать отчет времени с 0:0:0, или им обязательно нужно сделать установку времени?

 

Я с I2C работаю впервые, пожалуйста помогите разобраться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

И еще забыл сказать, что при смене портов для SCL и SDA  показания меняются - либо 02:02:02 либо 04:04:04

Пробовал вешать на все порты, везде одно и то же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Добрый день!

Порты ввода вывода правильно настроены? Тактовая частота, внутренние регистры микроконтроллера...? Можно попробовать в протэусе посмотреть работу прошивки.

А сам код где?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Если я правильно понимаю, то SCL - порт должен быть на передачу, а SDA на прием.

Тактовая 4 MHz - внешний кварц

А код работы I2C взят Ваш один в один.

 Один вопрос, в даташите указано, что для чтения данных из DS1307 бит RW должен быть установлен в 1. Вот тут мне не понятно, для чтения должна быть команда:

i2cread sda, scl, $D0, 0, [sec,Mins,Hr,Day,Date,Mon,Yr]  или

...........................$D1............

 

У Вас $D1 используется для записи данных в часы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Часы то хоть идут или постоянно отображается одна и та же информация?

 

Мой код рабочий на 100%, я его как есть использовал в другом проекте, проверено в железе.

Скинь хотя бы схему устройства (pic, индикатор, rtc), попробую написать код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти



×
  • Создать...