Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
03.12.2008, 20:29
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 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
Апасибо большое за инфу. Буду просвещаться. ![Улыбка](images/smilies/icon_smile.gif)
Нарыл кучу исходников по i2c, сижу, вкуриваю. Вопросов возникло еще больше.
Например, выяснил, что (к своему стыду не знал об этом) CVAVR для DS-ки генерит программную реализацию i2c, а аппаратную нужно ручками писать. В связи с этим вопрос: насколько аппаратная реализация этого интерфейса лучшестабильнейнадежней программаной?
Еще, по поводу самого RTC, он тикает, в принципе, правильно и с большой вероятностью НЕ глючит. Глюки возникают с чтением данных из него. Перезапуская весь девайс раз через 7-9 дата и время выведутся корректно. Это при том, что контроллер ТОЛЬКО читает данные, никаких записей туда не делает...
Про бит 7 регистра CH вычитал в даташите на железяку. Удивительно, что о нем мало кто знает, судя по обсуждениям 1307 в тырнете.
P.S. какие еще буду размышления на тему первого вопроса?
|
|
|
|
04.12.2008, 08:39
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 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. Там черт со шпагой голову свернет. ![Обижен](images/smilies/icon_beee.gif)
Из последнего:
- собачник в отрубе.
- оптимизация выключена.
- прерывания запрещать не пробовал. сегодня буду эксперементировать. У меня работают два таймера и АЦП. Кто-нить из них может мешать...
СПАСИБО!!!
|
|
|
|
04.12.2008, 19:18
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
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 тоже подогнал как надо, но все безуспешно!
Короче, маялся я, маялся и проблема решилась... вроде... Еще буду делать полномасштабные испытания. ![Улыбка](images/smilies/icon_smile.gif)
Оказалось, что виновата процедура 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
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Дело не в ds , в проте нужно ставить не резисторы
а pullup .
Иначе чревато глюками.
__________________
Осторожно , злой кот
|
|
|
|
21.12.2011, 02:14
|
|
Прохожий
Регистрация: 20.12.2005
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: DS1307 и глюки при чтении
оккупант, лови:
// I also had these problems. ![Обижен](images/smilies/icon_beee.gif)
// 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. ![Валяюсь от смеха](images/smilies/icon_biggrin.gif)
// Please only say, "Thank you uncle Demuri." ![Валяюсь от смеха](images/smilies/icon_biggrin.gif) ))
// demuri@hotmail.com
Последний раз редактировалось demuri; 21.12.2011 в 02:59.
|
|
|
|
21.12.2011, 08:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
|
Re: DS1307 и глюки при чтении
У вас наверно разное питание, мега 5v а ds1307 3v (батарейка) вот и глючит.
Запитайте всё от 5ти вольт, и посмотрите на результат, может поможет.
|
|
|
|
21.12.2011, 09:08
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: DS1307 и глюки при чтении
demuri, sdsrem, На даты постов внимание иногда обращаем....
__________________
Осторожно , злой кот
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:50.
|
|