Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

#Часы реального времени DS1307 от Dallas Semiconductor#

Сб дек 04, 2010 21:02:05

Предлагаю здесь разместить максимум информации об часах реального времени DS1307 от Dallas Semiconductor.

На данный момент меня интересует программый доступ к м/с в среде CodeVision AVR на примерах (тоесть примеры кодов программ установки времени/даты, считывание)

P.S. Спасибо за внимание, надеюсь на ваше активное участие! :)

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Сб дек 04, 2010 21:10:40

Хм, а F1 в CvAVR чем не устраивает?

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Сб дек 04, 2010 22:33:43

Fasterpast писал(а):Хм, а F1 в CvAVR чем не устраивает?


1. Если бы это было на русском... :cry:
Хотелось бы ваших более подробных примеров и с комментариями на русском.

2. Насколько я понял данный пример в F1 отражает только чтение из м\с ?
Мне непонятно как задать предустановку?

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Сб дек 04, 2010 22:48:51

Код:
void rtc_set_time(unsigned char hour, unsigned char min, unsigned char sec)


      this function sets the current time of the RTC.
The hour, min and sec parameters represent the values of hour, minutes and seconds.


void rtc_get_date(unsigned char *date, unsigned char *month, unsigned char *year)


      this function returns the current date measured by the RTC.
The *date, *month and *year pointers must point to the variables that must receive the values of date, month and year.


void rtc_set_date(unsigned char date, unsigned char month, unsigned char year)


      this function sets the current date of the RTC.

Из хелпа... Что тут может быть не понятно?
Функция rtc_set_time - установка времени. Часы минуты секунды.
rtc_set_date - установка даты. Число месяц год
rtc_get_date - получить дату... Вместо *date, *month итд, нужно подставить перменные в которых в вашей проге хранится дата.
ну и т.д.
По-моему в CvAVR всё элементарно как раз...

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вс дек 05, 2010 00:49:12

Написал пример для доступа к DS1307 на чтение, прошу проверить правильность и помощь в написание процедуры предустановки даты/времени путём кнопок подключённых к свободным линиям PORTD.

Код:
#include <tiny2313.h>

#asm
.equ __i2c_port=0x12     // подключил к порту PORTD
.equ __sda_bit=0
.equ __scl_bit=1
#endasm

#include <i2c.h>
#include <ds1307.h>

void main (void)
{
unsigned char  lcddate, lcdmonth, lcdyear;   // объявление переменных даты
unsigned char  lcdhour, lcdminute, lcdsecond;  // объявление переменных время
i2c_init();
rtc_init (0,1,0);  // инициализация часов, непонял о чём говорят значения в скобках?


rtc_get_date (&lcddate, &lcdmonth, &lcdyear); // читаем дату
rtc_get_time (&lcdhour, &lcdminute, &lcdsecond); // читаем время
}


P.S. сильно не пинайте, имхо незнаю ни одного языка программирования и только сегодня начал осваивать CvAVR.
Последний раз редактировалось Tom91 Вс дек 05, 2010 12:08:58, всего редактировалось 2 раз(а).

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вс дек 05, 2010 02:33:43

rtc_get_date (&lcddata, &lcdmonth, &lcdyear); // читаем дату
rtc_get_time (&lcdhour, &lcdminute, &lcdsecond); // читаем время

В процедуры чтения нужно передавать указатели на переменные - т.е. адрес переменной, чтобы функция записала по этому адресу число, и оно оказалось в Вашей переменной. И еще, у Вас очепятка в названии функции: "date".
Для процедур записи всё выглядело бы так, как Вы написали:

rtc_set_date (lcddata, lcdmonth, lcdyear);
И т.п.
----------
Кроме того, Вам лучше (даже нужно) изменить тип Ваших переменных с unsigned int на unsigned char (беззнаковое 8-битное целое), т.к. такой именно такой тип используют функции.
В случае установки даты (rtc_set_date) или времени, Ваша программа сама преобразует число из int в char, но при работе с указателями возникнут проблемы, поэтому тип нужно обязательно поменять.
----------
Что означают значения в скобках rtc_init(...) я Вам сказать не могу, т.к. у меня нет СVAVR и хелпа соответственно. Аналогично обстоят дела и с написанием обработки кнопок порта D.

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вс дек 05, 2010 02:45:45

А вот такая тема ?
viewtopic.php?f=20&t=5560

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вс дек 05, 2010 11:53:13

Foks, так если у вас нет СVAVR, чем вы пользуетесь?
P.S. Отредактировал код выше, по замечаниям Foks'а, за что ему спасибо. :)

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вс дек 05, 2010 14:22:05

Здаровенько котяры! Вот такая у меня проблемка вырисовалась. Сделал часы реального времени на DS1307 по даташиту, подключил к микроконтроллеру, инициализировал. Подключил выход частоты через транзисторный ключ к светодиоду. Выставил в программе частоту 1 Гц, но светодиод просто горит и не моргает с частотой 1 Гц. Выкладываю печатки часов и индикатора секунд в SL5. На основную плату и плату индикации можно не смотреть - они рабочие. Может где-то косячок? Или я что-то не учёл?
4asiki.lay
(167.66 KiB) Скачиваний: 789

И программа по инициализации и запуску генератора в CVAVR. Стандарт визарда.
4asiki.c
(2.84 KiB) Скачиваний: 823

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вс дек 05, 2010 16:33:57

Всё разобрался! Требовалось всёго-навсего установить начальное время!

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Пт янв 07, 2011 01:10:32

Подскажите как написать функцию считывания в переменную дня недели?
Для каких целей нужен вывод SQW/OUT?

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Пт янв 07, 2011 10:21:52

Sounds писал(а):Для каких целей нужен вывод SQW/OUT?
ответ здесь http://piclist.ru/D-DS-DS1307-RUS/D-DS-DS1307-RUS.html

Sounds писал(а):Подскажите как написать функцию считывания в переменную дня недели?
Код:
day = rtc_read(0x03);  // чтение

rtc_write(0x03, day);  // запись

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Сб янв 08, 2011 00:21:01

Может я тупой, но я так и не понял для чего нужен вывод SQW/OUT?

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Сб янв 08, 2011 00:34:10

В обычном исполнении не зачем. Просто оставьте в воздухе.

Вы наверняка вытянули даташник на русском и видели какие частоты на нем можно получить.

Sounds писал(а):я так и не понял для чего нужен вывод SQW/OUT?
для контроля частоты например. Или скажем Вы собрали устройство у которого очень важно чтобы часы шли, а как определить работает ли генератор в часах т.е. попросту идут часы или стоят ?

Для настольных часов с будильником Вы просто проспите на работу, а для какого нибудь теплонагревателя это может быть катастрофой. Можете сами придумать страшный пример.

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Сб янв 08, 2011 00:51:29

Спасибо за разъяснения!

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Сб янв 08, 2011 12:44:15

Sounds писал(а):Может я тупой, но я так и не понял для чего нужен вывод SQW/OUT?

Я, например, с него вывел мигающее двоеточие.

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Сб янв 08, 2011 22:36:37

Знатоки, подскажите: "У DS1307 день недели вычисляется автоматически или надо устанавливать вручную?"

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вс янв 09, 2011 11:27:46

Нет это обычный счетчик от 1 до 7. То что выставишь то и будет считать.

Я в своих часах его вообще не использую, а вычисляю.

Формула есть на Википедии.

Кусок кода из моих часов (Си CVAVR):
Код:
// в данной версии данные хранятся не в двоичной, а в двоично-десятичной системе
unsigned char
myhour, mymin, mysec,    // текушее время
mydate, mymonth, myyear, // текущий календарь
myday;                   // день недели


// ---------- вычислить день недели по дате ----------
void date2day(void) {
unsigned int y, m;

   y = bcd2bin(myyear);
   m = bcd2bin(mymonth);

   if (m > 2) { m -= 2;       }
   else       { m += 10; y--; }

   myday = (unsigned char)((bcd2bin(mydate) + y + (y>>2) + ((31 * m) / 12)) % 7);
   
   if (myday == 0) myday = 7;
}//----------

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вс янв 09, 2011 13:07:43

Danko Ты не поверишь, но по твоей вине, до вчерашнего дня, считал что в 1307 нет "дня недели". :)))

а чем хуже формула которую раньше применял?
// формула для вычисления дня недели по дате (ru.wikipedia.org)
// a = (14 - месяц) / 12
// y = год - a
// m = месяц + 12 * a - 2
//ДеньНедели = (7000 + (день + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) ОСТАТОК 7

Вот еще одна формула вычисления дня недели.
dayOfWeek = (year+(int)(year4)+ mounth + day) % 7;

где - dayOfWeek - число от нуля до 7, соответсвует дню недели
(0 - вс,1-пн, ...)
year - год
(int)(year/4) - целая часть от четверти года(математики, простите за int)
mounth - число, соответствующее месяцу
январь - 4(високосный) 5(невисокосный)
февраль - 0(високосный) 1(невисокосный)
март - 1
апрель - 4
май - 6
июнь - 2
июль - 4
август - 0
сентябрь - 3
октябрь - 5
ноябрь - 1
декабрь - 3
day - число дня в месяце

Итак, в моем примере
dayOfWeek = (1980 + 495 + 0 + 17 ) % 7 = 0(воскресенье)

Re: #Часы реального времени DS1307 от Dallas Semiconductor#

Вс янв 09, 2011 14:44:33

формула с википедии полная и по ней можно расчитать день недели для любого года. Я решил зачем мне дни недели 1917 года и я упростил формулу. Сокращенная формула работает с 2001 года и на ближайшие 100 лет.
Ответить