| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
DS1307 и глюки при чтении
03.12.2008, 20:29
|
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,693
Сказал спасибо: 28
Сказали Спасибо 4,526 раз(а) в 956 сообщении(ях)
|
2_Stealth_
Че-то я пропустил эту тему, слишком занят был. В "прынцыпе" процедуры для DS1307 в CAVR работают нормально, если пользутетесь ими корректно, т.е. в соответствии с разделом хелпа "Maxim/Dallas Semiconductor DS1307 Real Time Clock Functions".
Кстати при компиляции CAVR формирует и файл .asm, если в нем порыться (лучше с конца),то найдете много интересного и про I2C и про RTC. Правда разбираться муторно. А еще хотел бы обратить ваше внимание на бит 7 (CH) регистра 0 RTC. Всякая операция записи МК с 1307, особенно после выключения питания (ИМХО МК) должна начинаться с проверки сего бита. Если он 1, значит остановлен тактовый генератор DS, т.е. - вынималась евойная бабарейка и необходимо утановить дату и время, если он 0, то не надо в RTC ничего писать (если конечно вы не собрались корректировать часы) оно тикало на батарейке и сбиться в нем ничего не могло.
ЗЫ В качестве презента вот здесь нормальный перевод даташита на DS1307:
http://piclist.ru/D-DS-DS1307-RUS/D-DS-DS1307-RUS.html
|
|
|
|
04.12.2008, 00:23
|
|
|
Частый гость
Регистрация: 12.11.2007
Сообщений: 24
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
2 Halex07
Апасибо большое за инфу. Буду просвещаться. 
Нарыл кучу исходников по i2c, сижу, вкуриваю. Вопросов возникло еще больше.
Например, выяснил, что (к своему стыду не знал об этом) CVAVR для DS-ки генерит программную реализацию i2c, а аппаратную нужно ручками писать. В связи с этим вопрос: насколько аппаратная реализация этого интерфейса лучшестабильнейнадежней программаной?
Еще, по поводу самого RTC, он тикает, в принципе, правильно и с большой вероятностью НЕ глючит. Глюки возникают с чтением данных из него. Перезапуская весь девайс раз через 7-9 дата и время выведутся корректно. Это при том, что контроллер ТОЛЬКО читает данные, никаких записей туда не делает...
Про бит 7 регистра CH вычитал в даташите на железяку. Удивительно, что о нем мало кто знает, судя по обсуждениям 1307 в тырнете.
P.S. какие еще буду размышления на тему первого вопроса?
|
|
|
|
04.12.2008, 08:39
|
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,693
Сказал спасибо: 28
Сказали Спасибо 4,526 раз(а) в 956 сообщении(ях)
|
К сожалению нет времени подробно ответить. Могу только дать наметки.
1. В качестве аппаратного I2C используется модуль TWI контроллера. По этому поводу найдите русский перевод (HTML)апноута AVR315 здесь:
http://www.gaw.ru/html.cgi/txt/app/micros/avr/index.htm
там же есть и англ. оригинал и СИ код для IAR.
2. Еще вчера предположил, что у Вас нестабильность связана со времянкой. При 16Мгц частота SCL может быть 400 или 100 кГц (таблица 1) апноута.
3. Не стоит смешивать в одном флаконе програмный и аппаратный вариант I2C, т.к. в програмном все задержки (ИМХО времянка) формируются в коде при компиляции. Посмотрите .asm после компиляции -там любая функция работы с I2C имеет "call" на задержки. В аппаратном варианте вся времянка формируется модулем TWI МК (см. выше).
4. Это уже из области предположений:
- На момент чтения/записи по I2С блокируйте прерывания.
- Если позволяет объем кода попробуйте в CAVR отрубить оптимизацию.
- Проверьте установки собачника.
УДАЧИ!!!
|
|
|
|
04.12.2008, 10:40
|
|
|
Частый гость
Регистрация: 12.11.2007
Сообщений: 24
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Картина проясняется!
Вчера обнаружил, что одна из функций управления дисплеем переключает ноги программного TWI в режим вывода. Поправил. Стало гораздо лучше!!!
Но все равно глюки проскакивают.
С i2c потихоньку разбираюсь, прикрутил библиотеку (аппаратную), нужно подогнать немного, но в протеусе уже работает. В контроллер, правда, еще не шил.
Сейчас в TWBR указываю, что интерфейс пашет на 100 кГц. Как он работал до этого - хер его знает.
Смотрел, что генерит компилятор в .asm. Там черт со шпагой голову свернет. 
Из последнего:
- собачник в отрубе.
- оптимизация выключена.
- прерывания запрещать не пробовал. сегодня буду эксперементировать. У меня работают два таймера и АЦП. Кто-нить из них может мешать...
СПАСИБО!!!
|
|
|
|
04.12.2008, 19:18
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Stealth
А все же , что стоит на подтяжке шины ?
__________________
Осторожно , злой кот
|
|
|
|
06.12.2008, 01:21
|
|
|
Частый гость
Регистрация: 12.11.2007
Сообщений: 24
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
dosikus
В мануале на DS-ку про пулап ничего не сказано. В даташите на мегу, в разделе TWI есть сноска: Pull-up resistor values should be selected according to the SCL frequency and the capacitive bus line load. See Table 119 on page 290 for value of pull-up resistor.
В таблице формула: f SCL ≤100 kHz ---›› Vcc-0.4V/3mA.
Вроде 4.8 кОм получается. Апнот по TWI грит, что 4.5 кОм - нормально. Полазил по сети, нашел опроект, в котором дядька 10кОм ставил. Уверяет, что все работает.
Я 4.5 вкорячил. Нашел библиотеку с аппаратной реализацией i2c, подогнал под себя, родную ds1307.lib из cvavr тоже подогнал как надо, но все безуспешно!
Короче, маялся я, маялся и проблема решилась... вроде... Еще буду делать полномасштабные испытания. 
Оказалось, что виновата процедура itoa(). Родная, из cvavr.
У меня на дисплей выводится время, которое преобразуется в строку с помощью этой функции, и напряжение из АЦП. Значение напряжения преобразовывалось в строку процедурой sprintf и выводилось корректно, пока я не стал конвертить его в строку процедуркой itoa. Тут и начались косяки.
В общем, хер знает, где собака порылась, но теперь и напряжение и время конвертит процедурка:
|
Код:
|
void int2str(char *buf, unsigned long num, char nl)
{
char str[7] = "000000";
char *ptr = &str[6];
int tmp;
int pos = 0;
*ptr = 0;
if((nl==1) & num ‹ 10) *buf++ = '0';
do
{
if (++ pos == 3) *--ptr = '.';
tmp = num / 10;
*--ptr = '0' + (num - tmp * 10);
num = tmp;
} while (num != 0);
while ((*buf++ = *ptr++) != 0);
} |
и все пашет нормально. Так обрадовался, что даже не стал разбираться в чем была проблема.
|
|
|
|
06.12.2008, 02:40
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Дело не в ds , в проте нужно ставить не резисторы
а pullup .
Иначе чревато глюками.
__________________
Осторожно , злой кот
|
|
|
|
21.12.2011, 02:14
|
|
|
Прохожий
Регистрация: 20.12.2005
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: DS1307 и глюки при чтении
оккупант, лови:
// I also had these problems. 
// I was searching for solutions in the datasheet, in the books, in the forums, familiar and unfamiliar .... is even.
// After months of anguish, ..."Eureka" ;D - read once again battered pile of papers, I discovered "America",
//
// ...." Data valid: The state of the data line represents valid data when, after a START condition, the data
// line is stable for the duration of the HIGH period of the clock signal. The data on the line must be
// changed during the LOW period of the clock signal. There is one clock pulse per bit of data .".........
// And here is my "Newton solution":
void clock (void)
{
//================================================== =====================
// for the time to add
//two line below:
//================================================== =====================
while (PORTC.5 == 1) //this is "my" SDA = PORTC.5
{delay_us (1);} // delay time is chosen at your discretion
//================================================== =====================
i2c_start ();
i2c_read (0);
rtc_get_time (& RTC_Hour, & RTC_Mins, & RTC_Sec);
//================================================== =====================
/ / And repeat the same thing for date
//================================================== =====================
while (PORTC.5 == 1)
{delay_us (1);} // delay time is chosen at your discretion
//================================================== =====================
rtc_get_date (& RTC_Day, & RTC_Month, & RTC_Year);
i2c_stop ();
if (RTC_Sec == 0) {SecT = 0;}
}
// Enjoy. And do not suffer anymore. 
// Please only say, "Thank you uncle Demuri."  ))
// [email protected]
Последний раз редактировалось demuri; 21.12.2011 в 02:59.
|
|
|
|
21.12.2011, 08:38
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
|
Re: DS1307 и глюки при чтении
У вас наверно разное питание, мега 5v а ds1307 3v (батарейка) вот и глючит.
Запитайте всё от 5ти вольт, и посмотрите на результат, может поможет.
|
|
|
|
21.12.2011, 09:08
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: DS1307 и глюки при чтении
demuri, sdsrem, На даты постов внимание иногда обращаем....
__________________
Осторожно , злой кот
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:24.
|
|