Не могу запустить RTC DS1307 на Atmega8
Не могу запустить RTC DS1307 на Atmega8
Доброго дня всем. Контроллеры AVR изучаю пару месяцев. Застрял на модуле TWI. Написал программу (WinAVR GCC) для работы с ds1307 и вывод данных на четырех сегментный индикатор. Создал модель в протеусе. Запускаю - все работает отменно (пока нужны только азы - инициализация и чтение времени), кроме кнопки выбора индикации (часы-минуты или минуты-секунды), но проблема в другом - прошиваю мегу и в итоге на индикаторах 2.1.2.1 Экспериментально выяснил, что причина в фунции read_rtc () (проверяю - на ноге SDA - 0) если убрать эту функцию, после init_rtc() на SDA высокий уровень. Интуитивно чувствую что проблема в задержках, но опыта не достаточно, что бы определить где конкретно "собака порылась". Посему надеюсь на Вашу помощь.
Заранее благодарен.
Заранее благодарен.
- Вложения
-
- i2c.rar
- Архив проекта. Компилятор - WinAVR
- (86.22 КБ) 1700 скачиваний
Резисторы есть. Сегодня достал осц и немного поигрался. Получил кучу вопросов:
1. Кто может, померяйте осцилограмму на ногах кварца (на rtc). У меня в упор там постоянка порядка вольта, может меньше (на второй ноге). Должны ли присутствовать импульсы на первом, втором выводах rtc?
2. Отключил rtc вообще от контроллера и тут у меня начались чудеса...Инициализация проходит нормально, а вот когда программа заходит в основной цикл (я для простоты добавил задержку в 500 мс между функциями read_rtc и shou_clock:
read_rtc ();
_delay_ms (500);
shou_clock ();
)
При этом на осцилограмме наблюдаеться следующая картина:
Если развертку сузить около секунды - то на SDA и SCL просто меандр с периодом около секунды!!! Если растянуть до значения порядка сотни мкс - тогда видно что при спаде имульса идет передача байта, потом линия лежит все время приблизительно те же 500 мс, потом снова передача и линия прыгает в единицу...снова заержка (где-то около 500 мс и в это время sda и scl = "1") и все повторяеться занова.
3. Когда я убрал из фунции read_rtc все после первого стопа (передача sla_r и чтение данных), то осцилограмма преодбрела нормальных вид - передача байта - лини в "1" - снова передача и сразу в единицу.
Кто-что может посоветовать??? Рисунков нету (мерял на работе) если что не понятно, постараюсь обьяснить.
1. Кто может, померяйте осцилограмму на ногах кварца (на rtc). У меня в упор там постоянка порядка вольта, может меньше (на второй ноге). Должны ли присутствовать импульсы на первом, втором выводах rtc?
2. Отключил rtc вообще от контроллера и тут у меня начались чудеса...Инициализация проходит нормально, а вот когда программа заходит в основной цикл (я для простоты добавил задержку в 500 мс между функциями read_rtc и shou_clock:
read_rtc ();
_delay_ms (500);
shou_clock ();
)
При этом на осцилограмме наблюдаеться следующая картина:
Если развертку сузить около секунды - то на SDA и SCL просто меандр с периодом около секунды!!! Если растянуть до значения порядка сотни мкс - тогда видно что при спаде имульса идет передача байта, потом линия лежит все время приблизительно те же 500 мс, потом снова передача и линия прыгает в единицу...снова заержка (где-то около 500 мс и в это время sda и scl = "1") и все повторяеться занова.
3. Когда я убрал из фунции read_rtc все после первого стопа (передача sla_r и чтение данных), то осцилограмма преодбрела нормальных вид - передача байта - лини в "1" - снова передача и сразу в единицу.
Кто-что может посоветовать??? Рисунков нету (мерял на работе) если что не понятно, постараюсь обьяснить.
На одной ноге кварца постоянка порядка 0,8...1 В, на второй синусоида 32768 Гц размах порядка 100мВ с постоянной составляющей 0,8...1 В. Для запуска генератора бит СН регистра SECONDS должен быть равен 0. Хоть и пишут в даташите что значения регистров при включении питания может быть любым, у меня в 90% случаев требовалось запустить генератор.
NiceMAN писал(а): Для запуска генератора бит СН регистра SECONDS должен быть равен 0. Хоть и пишут в даташите что значения регистров при включении питания может быть любым, у меня в 90% случаев требовалось запустить генератор.
Это точно. Долго я перечитывал DataSheet и на русском и на английском. Вся фишка в том, что надо сначала прочесть нулевой байт, а потом обнулить старший бит. Вот мой кусочек кода в CAVR:
// Ds1307 Real Time Clock initialization
// Squre wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);
a=rtc_read(0); // прочесть нулевой байт
rtc_write(0,(a&=0b01111111)); // обнулить старший бит(СН) и запустить внутренний генератор
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Ivanchik писал(а):без батарейки тоже работать не будет
Откуда это, интересно, такая уверенность. Вы хоть попробовали бы перед тем как строчить пост, а то дезинформация получается, не хорошо!
Это вот если питание ниже, чем 1,25*Vbat (по моему), тогда виснуть будет на опросе, т.к. при этом DSка переключается на питание от батарейки, и шина не активна, работает только схема счёта времени.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Во первых, убедительно прошу Вас не хамить.
По сути:
Я ни в коем разе не сужу о человеке по "кол-ву сообщений в профиле", я сужу по его конкретному посту, да и вообще, я не сужу, не судья я, просто читаю пост, вижу чушь, нет, ПОЛНУЮ НЕ ОБОСНОВАННУЮ ЧУШЬ, и знаете, так хочется рассказать миру правду, прям не могу...
Вам я посоветовал бы почаще не читать форумы, плодя чушь и распространяя мнения ничего не имеющие с реальной жизнью, а раз уж Вы так часто сталкиваетесь с подобными вещами, просто попробовать в "железе", а не просто пересказывать чужие утверждения, этим Вы показываете не самые лучшие свои стороны (хотя, как знать).
Да, и по поводу "навыков". Я думаю, что Вам о них судить не стоит. Мы с Вами за руку не знакомы, да честно говоря и не хотелось бы.
По сути:
Я ни в коем разе не сужу о человеке по "кол-ву сообщений в профиле", я сужу по его конкретному посту, да и вообще, я не сужу, не судья я, просто читаю пост, вижу чушь, нет, ПОЛНУЮ НЕ ОБОСНОВАННУЮ ЧУШЬ, и знаете, так хочется рассказать миру правду, прям не могу...
Вам я посоветовал бы почаще не читать форумы, плодя чушь и распространяя мнения ничего не имеющие с реальной жизнью, а раз уж Вы так часто сталкиваетесь с подобными вещами, просто попробовать в "железе", а не просто пересказывать чужие утверждения, этим Вы показываете не самые лучшие свои стороны (хотя, как знать).
Да, и по поводу "навыков". Я думаю, что Вам о них судить не стоит. Мы с Вами за руку не знакомы, да честно говоря и не хотелось бы.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- Danko
- Сверлит текстолит когтями
- Сообщения: 1287
- Зарегистрирован: Пн окт 13, 2008 11:45:54
- Откуда: РФ, Крым, г.Бахчисарай
- Контактная информация:
Прикольно получилось с 25 декабря файл с проектом скачали больше 1000 раз, а ответов по делу не больше ... (лень считать).
Прикол №2: при этом ветку просмотрели не более 500 раз.
По делу:
В апреле 2008 я под CVAVR писал TWI библиотеку для DS1308. Так вот в железе она работает, а в протеусе нет.
По поводу библиотеки автора поста:
у меня на компе программа автора запускается но через время комп вылетает (перезагружается), а такое у меня происходит при симуляции программы с ошибкой т.е. могу сказать, что и в протеусе программа работает некорректно. При этом моя программа со стандартной библиотекой из CVAVR работает и протеус не вылетает.
Небольшое замечание автору поста: к проекту в протеусе параллельно выкладывайте схему ту которую вы собираете в железе это упростит задачу желающим Вам помочь и избавит от пустой помощи (типа "без батарейки работать не будет", "подтягивающие резисторы поставь"), а ведь это все в железе имеется.
В протеусе много чего работает, то что в железе не работает и наоборот.
Например у автора кварц стоит на 32768kHz и ничего в протеусе работает.
Прикол №2: при этом ветку просмотрели не более 500 раз.
По делу:
В апреле 2008 я под CVAVR писал TWI библиотеку для DS1308. Так вот в железе она работает, а в протеусе нет.
По поводу библиотеки автора поста:
у меня на компе программа автора запускается но через время комп вылетает (перезагружается), а такое у меня происходит при симуляции программы с ошибкой т.е. могу сказать, что и в протеусе программа работает некорректно. При этом моя программа со стандартной библиотекой из CVAVR работает и протеус не вылетает.
Небольшое замечание автору поста: к проекту в протеусе параллельно выкладывайте схему ту которую вы собираете в железе это упростит задачу желающим Вам помочь и избавит от пустой помощи (типа "без батарейки работать не будет", "подтягивающие резисторы поставь"), а ведь это все в железе имеется.
В протеусе много чего работает, то что в железе не работает и наоборот.
Например у автора кварц стоит на 32768kHz и ничего в протеусе работает.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
----------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
----------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Если еще актуально могу скинуть исходники для работы с i2c для gcc avr (winavr) (icq/skype в профиле)
с DS1307 наступил на грабли с резервной батарейкой - вход батарейки сравнивается со входом питания и если на батарейке больше скольких-то процентов (в даташите есть, оклоко 75%) интерфейсы отключаются и часы на внешние раздражители реагировать перестают.
Короче, если оставить болтаться или притянуть к питанию - работать не будет, выход или притягивать к земле или вешать батарейку.
с DS1307 наступил на грабли с резервной батарейкой - вход батарейки сравнивается со входом питания и если на батарейке больше скольких-то процентов (в даташите есть, оклоко 75%) интерфейсы отключаются и часы на внешние раздражители реагировать перестают.
Короче, если оставить болтаться или притянуть к питанию - работать не будет, выход или притягивать к земле или вешать батарейку.
После нас - хоть потоп (с) Лойсо
Так чем дальше в лес...
Сами часики вроде в норме. Проблема с контроллером (точнее с программой). Я отключил контроллер от часиков, далее запускаю и проверяю осцом что у меня на SDA и SCL. В итоге вообще запутался - идет передача данных, а в перерывах шина лежит в нуле. Почему проц может не отпускать шину???? (чтение данных спецом отрубил, а также индикацию и прерывания - контроллер в режиме мастер-передатчик). Может кто-то что-то поможет…А то беда - контроллер весь учу всего пару месяцев, а тут на одной шине i2c зависнул уже на две недели.
Сами часики вроде в норме. Проблема с контроллером (точнее с программой). Я отключил контроллер от часиков, далее запускаю и проверяю осцом что у меня на SDA и SCL. В итоге вообще запутался - идет передача данных, а в перерывах шина лежит в нуле. Почему проц может не отпускать шину???? (чтение данных спецом отрубил, а также индикацию и прерывания - контроллер в режиме мастер-передатчик). Может кто-то что-то поможет…А то беда - контроллер весь учу всего пару месяцев, а тут на одной шине i2c зависнул уже на две недели.