Всё по DS1307 и прочим часам Dallas (Maxim)
- sphincs
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Вт сен 11, 2012 09:13:52
- Откуда: Брест, Беларусь
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
три мелких вопроса по часикам DS1307
1) мне нужно получить с SQW 4кГц, кварц по-любому цеплять часовой на 32768 Гц и программно задавать RS1..RS0 0 1? без кварца она не работает?
2) при тактовой частоте меги32 8 МГц и подключении обработчика прерываний INT1 к SQW DS1307 (на 4 кГц) протеус кряхтит и его отсчетная секунда в готовом коде превращается в 10-15 реальных секунд (там опрос кнопок, парсинг времени и вывод на дисплей). если поставить частоту 1 Гц, то работает норм. самих часиков еще нет, проверить не могу, но теоретически же в железе все должно быть ок, это протеус тормозит?
3) мне объективно не нужно 4 тысячи прерываний в секунду для секундомера, достаточно даже 128 (я так делал на таймер/каунтере2, но в протеусе все было ок, а в железе он не запустился почему-то, правда я случайно спалил контроллер раньше, чем добрался конкретно до отладки счетчика). можно ли как-то от этих часиков взять кратные частоты, с частотой не только 1гц, 4, 8 и 32 кгц?
1) мне нужно получить с SQW 4кГц, кварц по-любому цеплять часовой на 32768 Гц и программно задавать RS1..RS0 0 1? без кварца она не работает?
2) при тактовой частоте меги32 8 МГц и подключении обработчика прерываний INT1 к SQW DS1307 (на 4 кГц) протеус кряхтит и его отсчетная секунда в готовом коде превращается в 10-15 реальных секунд (там опрос кнопок, парсинг времени и вывод на дисплей). если поставить частоту 1 Гц, то работает норм. самих часиков еще нет, проверить не могу, но теоретически же в железе все должно быть ок, это протеус тормозит?
3) мне объективно не нужно 4 тысячи прерываний в секунду для секундомера, достаточно даже 128 (я так делал на таймер/каунтере2, но в протеусе все было ок, а в железе он не запустился почему-то, правда я случайно спалил контроллер раньше, чем добрался конкретно до отладки счетчика). можно ли как-то от этих часиков взять кратные частоты, с частотой не только 1гц, 4, 8 и 32 кгц?
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
1. да. нет.
2. да
3. напрямую нет.
2. да
3. напрямую нет.
Можно поставить делитель частоты на триггере(-рах).four square - wave frequencies (1Hz, 4kHz, 8kHz, 32kHz)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
А зачем завязывать опрос кнопок на внешнее тактирование от DS-ки и прерывание на INT1? Почему просто не делать опрос по прерываниям таймера, чтобы опрос кнопок не зависел от часов? А завязываться на внешние 4кГц - неправильно архитектурно, с точки зрения здравого смысла, да и сложнее в реализации.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Может, у человека все таймеры заняты 
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- sphincs
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Вт сен 11, 2012 09:13:52
- Откуда: Брест, Беларусь
- Контактная информация:
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
WiseLord писал(а):А зачем завязывать опрос кнопок на внешнее тактирование от DS-ки и прерывание на INT1?
ненене, ds-ка тикает только для реализации секундомера/таймера. внутренние таймеры не заняты. я ж описал в 3 вопросе ситуацию: изначально на T/C2 я и сделал, меня все устраивало при симуляции, но в железе не запустилось, а пока я других функции до ума доводил, случайно уронил плату на припой, замкнул видимо дорожки и все
Gudd-Head, спасибо за ответы. если в железе по быстродействию все ок (как и предполагается теорией), то частоту делить и не нужно мне
- 4elovek37
- Нашел транзистор. Понюхал.
- Сообщения: 157
- Зарегистрирован: Вс дек 08, 2013 14:57:33
- Откуда: Россия, Иваново
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Рано я обрадовался по поводу рабочих часиков
После полного цикла записи регистров провожу их чтнение - и получаю какой - то бред. Но часы идти видимо начинают (читаемый бред с течением времени изменяется). Пока покопаюсь в коде обмена по шине. Но не исключаю и электротехническую проблему. Паял все на коленке при практически полном отсутствии инструментов на отломаном куске от макетки
Где то тут видел сообщение о установке конденсатора по питанию, которая решила подобную проблему. Не подскажете, каким номиналом ставить кондер и куда?
Возник вопрос по поводу чтения, в двух разных источниках обнаружил различные инструкции:
1)После приёма и декодирования байта адреса, устройство выдаёт подтверждение на линию SDA. Затем DS1307 начинает передавать данные, начиная с указанного адреса, находящегося в регистровом указателе. Если перед началом чтения указатель регистра не записан, то первый читаемый адрес - это адрес, который был сохранён в нём последним. DS1307 должен принять "неподтверждение" для окончания чтения.
Судя по этому, что бы начать читать данные откуда мне нужно, я инициирую запись 1 байта в ds1307, этим байтом я устанавливаю указатель регистра. Потом я заканчиваю сеанс, и начинаю новый уже на чтение. Сейчас именно так делаю.
В другом источнике:
2)В отличии от станларта I2C данная ИС должна принять ACK=0 от ведущего в случае, когда ведущий передает заголовок чтения по заданному адресу

Возник вопрос по поводу чтения, в двух разных источниках обнаружил различные инструкции:
1)После приёма и декодирования байта адреса, устройство выдаёт подтверждение на линию SDA. Затем DS1307 начинает передавать данные, начиная с указанного адреса, находящегося в регистровом указателе. Если перед началом чтения указатель регистра не записан, то первый читаемый адрес - это адрес, который был сохранён в нём последним. DS1307 должен принять "неподтверждение" для окончания чтения.
Судя по этому, что бы начать читать данные откуда мне нужно, я инициирую запись 1 байта в ds1307, этим байтом я устанавливаю указатель регистра. Потом я заканчиваю сеанс, и начинаю новый уже на чтение. Сейчас именно так делаю.
В другом источнике:
2)В отличии от станларта I2C данная ИС должна принять ACK=0 от ведущего в случае, когда ведущий передает заголовок чтения по заданному адресу
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
С "кольцевым чтением" проблем нету, а вот с чтением по заданному адресу - имеются. Это главное отличие 1307 от I2C...
На ассемблере образчик имеется.

На ассемблере образчик имеется.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
ACK всегда выставляет тот, кто принимает данные, а читает его всегда тот, кто передаёт. Дабы передающий знал, что приёмник принял данные и можно проводить дальнейшие действие.
"Непердавание" микроконтроллером АСК при чтении данных, соответственно, "рубит" DS'ку от передачи данных, и дальше она перестаёт что-либо передавать, до следующего старта и принятия адреса.
И с чтением по определённому адресу, так же, нет никаких проблем. Читаем один байт и всё.
"Непердавание" микроконтроллером АСК при чтении данных, соответственно, "рубит" DS'ку от передачи данных, и дальше она перестаёт что-либо передавать, до следующего старта и принятия адреса.
И с чтением по определённому адресу, так же, нет никаких проблем. Читаем один байт и всё.
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Это для стандартного I2C.
1307 такой функции как чтение по произвольно заданному адресу официально не знает (такой режим в даташите явно не указан).
Там есть только установка заданного адреса для записи байта - ежли применить таким образом - запись в последний байт ОЗУ фиктивного значения - последующее чтение будет выполнено с адреса 0х00 ( или установленный в предыдущей команде адрес записи +1) что чаще всего и делается...
Посему и "изголяж" дабы избавится от автоинкремента адреса внутри 1307.
Естественно там добавляется "повторный старт" - как в случае с обычным протоколом. Пользуюсь практически во всех своих конструкциях (особо удобно при выборке отдельных ячеек ОЗУ).
Хотя... как кому удобнее.

1307 такой функции как чтение по произвольно заданному адресу официально не знает (такой режим в даташите явно не указан).
Там есть только установка заданного адреса для записи байта - ежли применить таким образом - запись в последний байт ОЗУ фиктивного значения - последующее чтение будет выполнено с адреса 0х00 ( или установленный в предыдущей команде адрес записи +1) что чаще всего и делается...
Посему и "изголяж" дабы избавится от автоинкремента адреса внутри 1307.
Естественно там добавляется "повторный старт" - как в случае с обычным протоколом. Пользуюсь практически во всех своих конструкциях (особо удобно при выборке отдельных ячеек ОЗУ).
Хотя... как кому удобнее.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Ну и какие это проблемы ?
Старт -> Передача адреса -> Рестарт -> Читаем байт -> Стоп
Ровно как и с чтением нескольких байтов :
Старт -> Передача адреса -> Рестарт -> Читаем байты -> Стоп
Рестарт в любом случае необходим, т.к. бит "R/W" нужно сменить на "read".
ПыСы: Рабочие функции по-байтного чтения и записи:
Старт -> Передача адреса -> Рестарт -> Читаем байт -> Стоп
Ровно как и с чтением нескольких байтов :
Старт -> Передача адреса -> Рестарт -> Читаем байты -> Стоп
Рестарт в любом случае необходим, т.к. бит "R/W" нужно сменить на "read".
ПыСы: Рабочие функции по-байтного чтения и записи:
Спойлер
Код: Выделить всё
/****************************************************************/
static unsigned char Read_Byte(unsigned char addr){
unsigned char ret=0;
I2C_Start();
I2C_Write(0xD0);
I2C_Write(addr);
I2C_Stop();
I2C_Start();
I2C_Write(0xD1);
ret=I2C_Read(0);
I2C_Stop();
return ret;
}
/****************************************************************/
static char Write_Byte(unsigned char addr, unsigned char d){
I2C_Start();
if(!I2C_Write(0xD0)){
I2C_Stop();
return 0;
}
I2C_Write(addr);
I2C_Write(d);
I2C_Stop();
return 1;
}
/****************************************************************/
- 4elovek37
- Нашел транзистор. Понюхал.
- Сообщения: 157
- Зарегистрирован: Вс дек 08, 2013 14:57:33
- Откуда: Россия, Иваново
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Старт -> Передача адреса -> Рестарт -> Читаем байты -> Стоп
Делаю почти так же: Старт->Передача адреса->Стоп; Старт->Читаем байты->Стоп
Немного переделал код, в общем добился кое-какого результата. Записываем данный массив:
На SMB_ARRAY_OUT[0] внимания особо не обращайте - в ней хранится адрес первой записываемой ячейки.
После окончания записи сразу производим чтение, и о чудо:
Далее небольшая задержка - на паузе пока делал скриншоты, плюс программно 500мс. Производим повторное чтение, и рыдаем
Ну как же так
И еще - может все таки поставить конденсаторы по питанию? А то мне никто так и не подсказал. На руках есть на 100мкф и 0,1мкф. Хотя, по идее, питание просидать не должно, так как стоит стабилизатор LM, в цепи которого уже употребляются конденсаторы.
upd:
Ошибка обнаружена. Видимо, не правильно понял ДШ на микроконтроллер. Начал перед любой записью сбрасывать бит STO вручную, все заработало. До этого в начале второй итерации записи оставался поднятым бит STO после окончания предыдущей записи. Таким образом получали STA = 1 & STO = 1, SMBus фиксировал нестандартную ситуацию и благополучно сбрасывался, запись не производилась. Теперь все проде бы работает, спасибо за помощь!!!
Последний раз редактировалось 4elovek37 Сб мар 07, 2015 19:22:31, всего редактировалось 3 раза.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Скорее всего, Вы на последнем читающем байте посылаете АСК. А нужно его пропускать.
Рабочие функции чтения и записи нескольких байтов:
В функцию I2C_Read передаётся АСК.
Рабочие функции чтения и записи нескольких байтов:
Спойлер
Код: Выделить всё
/****************************************************************/
void DS1307_Read_Struct(void){
unsigned char i, *p=(unsigned char*)&ds1307;
I2C_Start();
I2C_Write(0xD0);
I2C_Write(0x00);
I2C_Stop();
I2C_Start();
I2C_Write(0xD1);
for(i=0;i<8;i++){
*p++=I2C_Read(1);
}
*p=I2C_Read(0);
I2C_Stop();
}
/****************************************************************/
void DS1307_Write_Struct(void){
unsigned char i, *p=(unsigned char*)&ds1307;
I2C_Start();
I2C_Write(0xD0);
I2C_Write(0x00);
for(i=0;i<8;i++){
I2C_Write(*p++);
}
I2C_Stop();
}
/****************************************************************/
В функцию I2C_Read передаётся АСК.
- 4elovek37
- Нашел транзистор. Понюхал.
- Сообщения: 157
- Зарегистрирован: Вс дек 08, 2013 14:57:33
- Откуда: Россия, Иваново
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Пока редактировал предыдущий пост, проглядел Ваш. Как написано выше, проблема решена.
Спасибо, но у меня аппаратный smbus (он же i2c с примочками), и часть операций делается аппаратно, при этом большинство действий у меня производится в прерывании). Поэтому очень сложно брать что то из чужого кода.
Рабочие функции чтения и записи нескольких байтов:
Спасибо, но у меня аппаратный smbus (он же i2c с примочками), и часть операций делается аппаратно, при этом большинство действий у меня производится в прерывании). Поэтому очень сложно брать что то из чужого кода.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Ну код я выложил для наглядности, не обязательно его использовать. Хотя и можно, т.к. в нём ничего, связанного с низким уровнем I2C, нет. Только вызовы его функций.
Ну мож кому и пригодится
То, что Вы разобрались - хорошо. Мои поздравления
Ну мож кому и пригодится
То, что Вы разобрались - хорошо. Мои поздравления

Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Я так понимаю что и DS1338Z то же в эту ветку.
Может кому пригодиться.
Беда: счёт убегает на несколько секунд в минуту! Это не ошибка! Со всеми доступными (5-6 шт. перепробовал) кварцами 32768 Гц.
Искал решение по форумам, но ничего подходящего.
Оказалась проблема с питанием. У меня LM317 питает ATmega8A и сами RTC.
Навесил кондёр 0,1 Мкф на ножки DS1338Z и точность (с адекватной погрешностью) пришла в норму.
Может кому пригодиться.
Беда: счёт убегает на несколько секунд в минуту! Это не ошибка! Со всеми доступными (5-6 шт. перепробовал) кварцами 32768 Гц.
Искал решение по форумам, но ничего подходящего.
Оказалась проблема с питанием. У меня LM317 питает ATmega8A и сами RTC.
Навесил кондёр 0,1 Мкф на ножки DS1338Z и точность (с адекватной погрешностью) пришла в норму.
Если в голове каша, значит ваш котелок варит!
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Дык, куда ж без кондёров по питанию у (цифровых) микросхем???
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- sphincs
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Вт сен 11, 2012 09:13:52
- Откуда: Брест, Беларусь
- Контактная информация:
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
для часового кварца нужны кондеры при использовании его с DS или на входах TOSC МК? кто-то пишет, что они нужны только для основного высокочастотного кварца. но без них часы не запускаются ни на T/C2, ни через DS1307 нет генерации импульсов на SQW (даже диодик не моргает раз в секунду в железе). то ли кондеры решают, то ли кварц мертвый. сегодня докуплю еще парочку для чистоты эксперимента и пару кондеров на 22пФ (пойдут такие?)
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Для DS-ки не нужны (при этом хорошо бы кварц с указанной в ДШ нагрузочной ёмкостью), у МК AVR при настраивании асинхронного таймера на работу от часового кварца они подключаются внутренние.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- sphincs
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Вт сен 11, 2012 09:13:52
- Откуда: Брест, Беларусь
- Контактная информация:
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
боюсь что у меня один вариант выбора кварца: "бери любой из этого пакетика с одинаковыми" 
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Предпочтение маленькому цилиндрику диаметром под 3 милиметра и длиной милиметров под 8 с выводами "в торец". Примерно такой (жаль отдельной фотки нету...):
http://img.radiokot.ru/files/20529/dtg3kkk1v.jpg

http://img.radiokot.ru/files/20529/dtg3kkk1v.jpg
