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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт окт 08, 2010 15:43:55

Сообщение Tom91 »

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

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

P.S. Спасибо за внимание, надеюсь на ваше активное участие! :)
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва

Сообщение Fasterpast »

Хм, а F1 в CvAVR чем не устраивает?
Контактная информация:
Реклама
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт окт 08, 2010 15:43:55

Сообщение Tom91 »

Fasterpast писал(а):Хм, а F1 в CvAVR чем не устраивает?
1. Если бы это было на русском... :cry:
Хотелось бы ваших более подробных примеров и с комментариями на русском.

2. Насколько я понял данный пример в F1 отражает только чтение из м\с ?
Мне непонятно как задать предустановку?
Мучитель микросхем
Аватара пользователя
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва

Сообщение Fasterpast »

Код: Выделить всё

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 всё элементарно как раз...
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт окт 08, 2010 15:43:55

Сообщение Tom91 »

Написал пример для доступа к 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 раза.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Сообщение Foks »

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.
Giggity giggity goo!
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1122
Зарегистрирован: Чт мар 05, 2009 19:51:55
Откуда: Дырасполь

Сообщение Seal »

ученые долго думали,в чем измерять частоту.... С тех пор и пишут Hz
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт окт 08, 2010 15:43:55

Сообщение Tom91 »

Foks, так если у вас нет СVAVR, чем вы пользуетесь?
P.S. Отредактировал код выше, по замечаниям Foks'а, за что ему спасибо. :)
Вымогатель припоя
Аватара пользователя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Сообщение zhu4er »

Здаровенько котяры! Вот такая у меня проблемка вырисовалась. Сделал часы реального времени на DS1307 по даташиту, подключил к микроконтроллеру, инициализировал. Подключил выход частоты через транзисторный ключ к светодиоду. Выставил в программе частоту 1 Гц, но светодиод просто горит и не моргает с частотой 1 Гц. Выкладываю печатки часов и индикатора секунд в SL5. На основную плату и плату индикации можно не смотреть - они рабочие. Может где-то косячок? Или я что-то не учёл?
4asiki.lay
(167.66 КБ) 854 скачивания
И программа по инициализации и запуску генератора в CVAVR. Стандарт визарда.
4asiki.c
(2.84 КБ) 878 скачиваний
Даже у стен есть уши...
Вымогатель припоя
Аватара пользователя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Сообщение zhu4er »

Всё разобрался! Требовалось всёго-навсего установить начальное время!
Даже у стен есть уши...
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Подскажите как написать функцию считывания в переменную дня недели?
Для каких целей нужен вывод SQW/OUT?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

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

Код: Выделить всё

day = rtc_read(0x03);  // чтение

rtc_write(0x03, day);  // запись
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Может я тупой, но я так и не понял для чего нужен вывод SQW/OUT?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

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

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

Для настольных часов с будильником Вы просто проспите на работу, а для какого нибудь теплонагревателя это может быть катастрофой. Можете сами придумать страшный пример.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Спасибо за разъяснения!
Открыл глаза
Аватара пользователя
Сообщения: 79
Зарегистрирован: Ср дек 30, 2009 18:36:00
Откуда: БЕЛАРУСЬ

Сообщение tipoya »

Sounds писал(а):Может я тупой, но я так и не понял для чего нужен вывод SQW/OUT?
Я, например, с него вывел мигающее двоеточие.
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

Знатоки, подскажите: "У DS1307 день недели вычисляется автоматически или надо устанавливать вручную?"
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Нет это обычный счетчик от 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;
}//-----------------------------------------------------------------------------------------
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57

Сообщение O-LED »

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(воскресенье)
KIT
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

формула с википедии полная и по ней можно расчитать день недели для любого года. Я решил зачем мне дни недели 1917 года и я упростил формулу. Сокращенная формула работает с 2001 года и на ближайшие 100 лет.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Ответить

Вернуться в «Периферия»