Всё по DS1307 и прочим часам Dallas (Maxim)
Re: Проблема с часами на Atmega32 и DS1307(отстают)
TO Vov123: Да батарейка при выключенном питании 3.2В. Новую брал.
TO Eugene.Negrobov: Согласен сам подумывал делать проверку по иницилизации. Думаю придется.
TO Eugene.Negrobov: Согласен сам подумывал делать проверку по иницилизации. Думаю придется.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Проблема с часами на Atmega32 и DS1307(отстают)
Сюда перенёс.
Эммм... А чего там инициализировать? Питание подал — часы пошли. Единственный вопрос, в 12-ти или 24-х часовом формате.
kapitaneo писал(а):Хм только заметил, что в коде инициализация прописана rtc_init(3,1,0).
Эммм... А чего там инициализировать? Питание подал — часы пошли. Единственный вопрос, в 12-ти или 24-х часовом формате.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Йошъ Dizel
- Родился
- Сообщения: 6
- Зарегистрирован: Пт мар 05, 2010 20:22:50
- Откуда: Маяк
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
в даташите сказано, что напряжение батареи доллжно быть в диапазоне 2.0 ... 3.5 В и микруха доступна при напряжении Vcc=1.25 * VBAT. то есть теоретически, если VBAT=2 В, то я смогу работать с микрухой при 2,5 вольт? у меня питание схемы 2.8-3.7 вольт, вот боюсь, что микруха не захочет работать( кто что думает и запускал ли дс1307 при 3.3 вольтах?
(эта мысль запрещена к распространению законом о защите интеллектуальной собственности)
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
kapitaneo, что - же на самом деле имеем. Отстают? или иницилизация портит время?
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Парни помогите. Собрал девайс на DS1307 и он раз а то и 2 раза в сутки виснет. Вместо секунд показывает трёхзначное число и всё. Пока не перезапустишь. От чего такое может быть? Питание отличное , батарейка новая. Кварцы менял , микрухи менял. Схема классическая. Единственное ,что так это 7 нога DS1307 используется с частотой 1 гц и это идёт на МК. Как только часы виснут , виснет и всё устройство. Я уже замахался.
Я читал где то, что нужно какой то код обнуляющий 1 раз в минуту. Только я не знаю какой. Кто знает напишите плиз.
Я читал где то, что нужно какой то код обнуляющий 1 раз в минуту. Только я не знаю какой. Кто знает напишите плиз.
Re: Проблема с часами на Atmega32 и DS1307(отстают)
А ничего, что в даташите жирным выделено:Gudd-Head писал(а):Эммм... А чего там инициализировать? Питание подал — часы пошли. Единственный вопрос, в 12-ти или 24-х часовом формате.
состояние ВСЕХ регистров по включению НЕ ОПРЕДЕЛЕНО. Необходимо, по крайней мере, выключить CH (остановку часов), не говорю уже про то, что в регистрах времени и даты мусор будет.Please note that the initial power-on state of all registers is not defined. Therefore, it is important to
enable the oscillator (CH bit = 0) during initial configuration.
Исчерпывающий вопросgreentm писал(а):Собрал девайс на DS1307 и он раз а то и 2 раза в сутки виснет...
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Проблема с часами на Atmega32 и DS1307(отстают)
a_skr писал(а):А ничего, что в даташите жирным выделено
Значит, DS1337 в этом плане выгодно отличается от DS1307, там просто
Note: Unless otherwise specified, the state of the registers is not defined when power is first applied or VCC falls below the VOSC.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
-
Доренский Алексей
- Родился
- Сообщения: 3
- Зарегистрирован: Чт окт 20, 2011 11:34:35
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Согласен с Eugene.Negrobov - инициализация сбивает секунды, если генератор тикает. Соответственно делаем ее только если генератор не запущен. Двадцать устройств работало без этой приписочки в коде, т.е. инициализация не сбивала секунды, на двадцать первом (новая партия микрух 1307) - оказалось что инициализация сбивает секунды, если генератор уже работает...
Решил проблему так:
void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out)
{
unsigned char ss=rtc_read(0x00);
if((ss&0x80)==0x80)
{
// Инициализация сбивает время, поэтому делаем ее только если генератор стоит!!!
rs&=3;
if (sqwe) rs|=0x10;
if (out) rs|=0x80;
twi_start();
twi_write(0xd0);
twi_write(7);
twi_write(rs);
twi_stop();
//---
rtc_write(0x00,ss&~0x80); // если генератор стоиn - запускаем его
}
}
Решил проблему так:
void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out)
{
unsigned char ss=rtc_read(0x00);
if((ss&0x80)==0x80)
{
// Инициализация сбивает время, поэтому делаем ее только если генератор стоит!!!
rs&=3;
if (sqwe) rs|=0x10;
if (out) rs|=0x80;
twi_start();
twi_write(0xd0);
twi_write(7);
twi_write(rs);
twi_stop();
//---
rtc_write(0x00,ss&~0x80); // если генератор стоиn - запускаем его
}
}
- VHEMaster
- Потрогал лапой паяльник
- Сообщения: 374
- Зарегистрирован: Сб июл 14, 2012 09:20:09
- Откуда: Украина, город Полтава
DS1307 не работает
Доброго вам времени суток! Возникла проблема с часами на DS1307. Библиотека, которую я использую рабочая, делал часы с термометром другу, у него всё работает. Но у меня не работает... Плата несколько раз чистилась щёткой и ацетоном.. В какой-то прекрасный момент всё заработало, но после перепрошивки МК (пока-что прошивка в разработке) всё потухло( В чём может быть проблема?
Вот часть кода
Вот библиотека
Это был Header
Это был Source файл
Фрагмент кода, который должен запускать генератор часов
Фрагменты кода для вывода времени на экран
Помогите, пожалуйста( В протеусе всё работает безупречно..
И ещё. Постоянно, на железе, от часов в сегменте часов, минут и секунд получается не число, не ноли, а A5h.. Т.е. в дисплее (HD44780) показывает @A
Вот часть кода, которая показывает число на индикатор
Вот часть кода
Код: Выделить всё
while(RB1)
{
lcd_goto(0x41);
showtemp();
__delay_ms(50);
if(command == 0x36) { i = ReadHour()+1; if(i>23) i = 0; SetHour(i); SetSeconds(0); command = 255; }
if(command == 0x32) { i = ReadMin()+1; if(i>59) i = 0; SetMin(i); SetSeconds(0); command = 255; }
showtime();
__delay_ms(50);
}Код: Выделить всё
#include <htc.h>
#define _XTAL_FREQ 4000000
#define SCL1 TRISB3
#define SDA1 TRISB4
#define SCL1_IN RB3
#define SDA1_IN RB4
void i2c_delay (void);
void i2c_start(void);
void i2c_stop (void);
bit i2c_tx(unsigned char d);
unsigned char i2c_rx(unsigned char ack);
unsigned char BCDconv (unsigned char source);
unsigned char DCBconv (unsigned char source);
void SetMin(unsigned char minutes);
unsigned char ReadMin();
void SetHour(unsigned char hours);
unsigned char ReadHour();
void SetSeconds(unsigned char seconds);
unsigned char ReadSeconds();
Код: Выделить всё
#include <htc.h>
#include "softi2c.h"
void i2c_delay (void) //Задержка speed/18
{
__delay_us(5);
}
void i2c_start(void) //Старт передачи
{
SCL1 = 1;
SDA1 = 1;
i2c_delay();
SDA1 = 0;
i2c_delay();
SCL1 = 0;
}
void i2c_stop (void)
{
i2c_delay();
SDA1 = 0;
SCL1 = 0;
i2c_delay();
SCL1 = 1;
i2c_delay();
SDA1 = 1;
}
bit i2c_tx(unsigned char d)
{
char x;
static bit b;
for (x=0; x<8; x++) {
i2c_delay();
if (d&0x80) SDA1 = 1;
else SDA1 = 0;
i2c_delay();
SCL1 = 1;
d <<= 1;
i2c_delay();
SCL1 = 0;
}
i2c_delay();
i2c_delay();
SDA1 = 1;
SCL1 = 1;
i2c_delay();
b = SDA1_IN;
SCL1 = 0;
return b;
}
unsigned char i2c_rx(unsigned char ack)
{
unsigned char x,d=0;
SDA1 = 1;
for (x=0; x<8;x++) {
d <<= 1;
do {
i2c_delay();
SCL1 = 1;
} while (SCL1_IN==0);
i2c_delay();
if (SDA1_IN) d |= 1;
SCL1 = 0;
}
i2c_delay();
if (ack) SDA1 = 0;
else SDA1 = 1;
SCL1 = 1;
i2c_delay();
SCL1 = 0;
return d;
}
unsigned char BCDconv (unsigned char source) {
unsigned char temp_min=0;
unsigned char temp_maj=0;
temp_min = source&15;
temp_maj = source >> 4;
//printf("\r\n minor - %x", temp_min);
//printf("\r\n major - %x", temp_maj);
temp_maj *= 10;
//printf("\r\n major - %x", temp_maj);
return temp_maj+temp_min;
}
unsigned char DCBconv (unsigned char source) {
unsigned char temp_min=0;
unsigned char temp_maj=0;
temp_maj = source/10 ;
temp_min = source - temp_maj*10;
temp_maj <<= 4;
return temp_maj+temp_min;
}
void SetMin(unsigned char minutes) { //записываем значение в минуты
i2c_start();
i2c_tx(0b11010000);
i2c_tx(0x01);
i2c_tx(DCBconv(minutes));
i2c_stop();
}
unsigned char ReadMin() {
unsigned char clockreturn1 = 0;
i2c_start(); //читаем значение минут
i2c_tx(0b11010000);
i2c_tx(0x01);
i2c_start();
i2c_tx(0b11010001);
clockreturn1 = i2c_rx(0);
i2c_stop();
return BCDconv(clockreturn1);
}
void SetHour(unsigned char hours) { //записываем значение в часы
i2c_start();
i2c_tx(0b11010000);
i2c_tx(0x02);
i2c_tx(DCBconv(hours));
i2c_stop();
}
unsigned char ReadHour() {
unsigned char clockreturn2 = 0;
unsigned char clockreturn22 = 0;
i2c_start(); //читаем значение часов
i2c_tx(0b11010000);
i2c_tx(0x02);
i2c_start();
i2c_tx(0b11010001);
clockreturn2 = i2c_rx(0);
i2c_stop();
/*
temp2 = temp&0b00001111;
temp /= 10;
temp = temp >> 4;
temp = temp*10 + temp2;*/
return BCDconv(clockreturn2);
}
void SetSeconds(unsigned char seconds) { //записываем значение в секунды
i2c_start();
i2c_tx(0b11010000);
i2c_tx(0x00);
i2c_tx(DCBconv(seconds) & 0b01111111);
i2c_stop();
}
unsigned char ReadSeconds() {
unsigned char clockreturn = 0;
i2c_start(); //читаем значение минут
i2c_tx(0b11010000);
i2c_tx(0x00);
i2c_start();
i2c_tx(0b11010001);
clockreturn = i2c_rx(0);
i2c_stop();
return BCDconv(clockreturn);
}
Фрагмент кода, который должен запускать генератор часов
Код: Выделить всё
i = ReadSeconds();
if(i>60) i = 0;
SetSeconds(i & 0b01111111);
i = 0;
Код: Выделить всё
void showtime(void)
{
unsigned char sec;
unsigned char min;
unsigned char hur;
lcd_goto(0);
hur = ReadHour();
lcd_showno2(hur);
lcd_putch(':');
lcd_showno2(min);
min = ReadMin();
lcd_putch(':');
sec = ReadSeconds();
lcd_showno2(sec);
}
И ещё. Постоянно, на железе, от часов в сегменте часов, минут и секунд получается не число, не ноли, а A5h.. Т.е. в дисплее (HD44780) показывает @A
Вот часть кода, которая показывает число на индикатор
Код: Выделить всё
void lcd_showno2(unsigned char var)
{
if((var/10)>0)
{
unsigned char tmp = var;
lcd_putch(0x30 + (var/10));
while(tmp>=10) tmp = tmp-10;
lcd_putch(0x30 + tmp);
}
else
{
lcd_putch(0x30);
lcd_putch(0x30 + var);
}
}
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Кто-нибудь пробовал использовать микросхему без кварца в качестве энергонезависимой памяти?
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Отлично работала в проекте счетчика суммарного количества копий копира в копи-центрах. (По каждому клиенту раздельно А4/А4R/А3 с возможностью "вложенного клиента" + общая сумма за весь период эксплуатации по каждому формату и автокалибровка индивидуальной скорости протяжки листа по данному аппарату). Но вот с кварцем или нет не помню, надо архив покопать...

Кварца таки стояла однако...

Кварца таки стояла однако...
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
ks0 писал(а):в качестве энергонезависимой памяти?
Что-то я не нашёл упоминания о энергоНЕзависимой памяти.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Имеется ввиду использование области ОЗУ (батарейная энергонезависимка) с работой без циклов ожидания выполнения процесса записи в EEPROM как у "обычной" I2C EEPROMки. Некоторая хитрость для регистров накопителей с непрерывным многократным обращением к ячейкам.

- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Коли микра работает с I²С на скоростях до 400 кГц, у неё наверняка есть встроенный генератор. Не верю я в ФАПЧ от 32-х кГц.
Хотя в ДШ про это ни слова
Хотя в ДШ про это ни слова
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Дык зачем эксперементировать - возможно и часики на будущее сгодятся.
Кроме того 1307 не совсем I2C по протоколу побайтового доступа к ячейкам. В принципе, в былые времена вполне успешно работало, а дорабатывать до абсолюта как всегда "дело не дошло"

Кроме того 1307 не совсем I2C по протоколу побайтового доступа к ячейкам. В принципе, в былые времена вполне успешно работало, а дорабатывать до абсолюта как всегда "дело не дошло"
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
транзистор и на бОльших частотах работает, генератора в нем нет) ... шутка)Gudd-Head писал(а):Коли микра работает с I²С на скоростях до 400 кГц, у неё наверняка есть встроенный генератор.
I2C синхронный протокол, синхра идет от мастера, а DS1307 - слейв онли) В ней нет генератора.
Ставим плюсы: )
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Нельзя утверждать то, о чем абсолютно точной информации нету...
Даже "чистый" транзистор или диод как структура полупроводниковая ноне только у П4 узреть можно (или у Совковых до 85-го года выпуска). Чего там сейчас понапихано - ...
Для пользователя только гарантированный даташит. Все другое - и спецтесты и дополнительная скрытая начинка (да и в зависимости от партии выпуска "дифференциация штанов" имеется) нам практически недоступно, да в большинстве случаев и не требуется.

Даже "чистый" транзистор или диод как структура полупроводниковая ноне только у П4 узреть можно (или у Совковых до 85-го года выпуска). Чего там сейчас понапихано - ...
Для пользователя только гарантированный даташит. Все другое - и спецтесты и дополнительная скрытая начинка (да и в зависимости от партии выпуска "дифференциация штанов" имеется) нам практически недоступно, да в большинстве случаев и не требуется.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
ibiza11 писал(а):I2C синхронный протокол, синхра идет от мастера, а DS1307 - слейв онли) В ней нет генератора.
Следовательно, без часового кварца будет работать как внешняя ОЗУ. Так?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Опять неправильный вывод.
Следовательно без часового кварца I2C будет работать.
Исходя из функциональной схемы часов, можно сделать вывод, что кварцевый резонатор используется встроенным генератором, который в свою очередь, используется для формирования секундных импульсов для блока RTC и еще имеет программируемый выход ипульсов с частотами 1Hz/4.096kHz/8.192kHz/32.768kHz.
Исходя из даташита невозможно ясно понять, будет ли работать DS1307 без кварца в качестве быстрой внешней ОЗУ. Я думаю, что будет. Но лучше будет, если кто-нибудь из заинтересованных это проверит.
К чему я все это пишу: к тому, что нет никакой логической связи между высокой частотой I2C и наличием внутреннего генератора.
Еще мысль: поскольку в модуле приема из памяти есть только регистр адреса (нет промежуточного буфера для хранения данных), а принимать данные по I2C все же куда-то надо, то I2C использует ОЗУ напрямую. Следовательно модуль I2C совместно с модулем ОЗУ должны работать синхронно, а это говорит о том, что ОЗУ тактируется от I2C.
Следовательно без часового кварца I2C будет работать.
Исходя из функциональной схемы часов, можно сделать вывод, что кварцевый резонатор используется встроенным генератором, который в свою очередь, используется для формирования секундных импульсов для блока RTC и еще имеет программируемый выход ипульсов с частотами 1Hz/4.096kHz/8.192kHz/32.768kHz.
Исходя из даташита невозможно ясно понять, будет ли работать DS1307 без кварца в качестве быстрой внешней ОЗУ. Я думаю, что будет. Но лучше будет, если кто-нибудь из заинтересованных это проверит.
К чему я все это пишу: к тому, что нет никакой логической связи между высокой частотой I2C и наличием внутреннего генератора.
Еще мысль: поскольку в модуле приема из памяти есть только регистр адреса (нет промежуточного буфера для хранения данных), а принимать данные по I2C все же куда-то надо, то I2C использует ОЗУ напрямую. Следовательно модуль I2C совместно с модулем ОЗУ должны работать синхронно, а это говорит о том, что ОЗУ тактируется от I2C.
Ставим плюсы: )
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Всё по DS1307 и прочим часам Dallas (Maxim)
Казалось бы, без кварца работать как ОЗУ микросхема должна уметь.
Но по факту, у меня, например, почему-то не выходило вычитать или изменить данные при выпаянном кварце.
Но по факту, у меня, например, почему-то не выходило вычитать или изменить данные при выпаянном кварце.