Проблема. Перевел DS на TWI частота 10,4кГц. Иногда индикация останавливается, на кнопки не реагирует. То ли контроллер виснет, то ли шина. После сброса(выключения питания) все работает. У кого-нибудь было что-то подобное?
Волосатый писал(а):
Возможно и виснет шина. Просмотрел код с приведенной ссылки, там везде где ждем установки бита готовности шины, там стоит тупой while что не есть хорошо. Если этот бит не будет установлен, программа так и будет там висеть. Но. Замирание индикации (правильно я вас понял, что на динамике начинает гореть только один индикатор?) можно объяснить только тем что этот while у вас висит в прерывании, и прерывание индикации по таймеру не срабатывает. Как этого избежать, добавить во все while цикл for со счетчиком и по совпадению делать оператор brake, что выкинет из последнего while. Но потом скорее всего придется переинициализировать шину.
Скорее всего шина виснет т.к. индикация просто останавливается т.е. значения не меняются. Значит динамика отрабатывает. А как можно исправить чтобы не через WHILE при работе с шиной?
Чтобы восстановить работу шины, можно со стороны мастера отключить аппаратную TWI, затем программно подрыгать с не большой скоростью (импульсов 8 можно и больше), тактовой ножкой шины, Пере инициализируем шину запускаем опрос по новой. Для контроля за работой шины можно использовать обработчик прерывания таймера.
crazzian писал(а):
А как можно исправить чтобы не через WHILE при работе с шиной?
Разбираться с событиями на шине в обработчике прерывания TWI.
Код:
void IRQ_TWI(void){ switch(TWSR){ // Стадия работы TWI. case 0x40: // Адрес прошел. Пришла квитанция. case ... и тд
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
А как можно исправить чтобы не через WHILE при работе с шиной?
Нужно ждать ответа не в цикле, а писать что то типа такого. Также как вариант удобно использовать сторожевой таймер если зависоны не частые, то зброс почти не заметен.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: DS1307 используя аппаратный I2C
Добавлено: Вт окт 23, 2012 23:40:53
Сверлит текстолит когтями
Карма: 12
Рейтинг сообщений: 252
Зарегистрирован: Пн апр 14, 2008 12:54:35 Сообщений: 1289 Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения:0
Это по науке. В свое время для быстроты запуска, т.к. по науке лень было разбиратся, я запилил стандартные функции из даташита вот с такими изменениями. В теле каждого
Код:
while (!(TWCR & (1<<TWINT)))
прописать эту конструкцию и определить переменную к
Код:
k++; if (k==1000) return;
И в теле где получаем данные с микрушки сделать проверку на получаемые данные типа такого
Код:
if (tmp==0xff){ twi_stop(); return 0; }
После этого можно сразу запускать новую передачу. Такая же проблема у меня возникала в симуляторе когда я делал свои первые часы. Эти доработки позволили от зависаний избавится. Но вам же я советую сразу сделать как надо и применить систему кодов состояний со ссылки выше постом.
_________________ Опыт приходит сразу после того, как он был нужен...
Народ хелп. Собираю девайс для авто, типа Бортового компа. Делал работу поэтапно, сначала один блок, потом второй и тд. Дошел до подключения часов на DS1307. Сделал платку отдельную, развел как надо, учитывая землю под кварцем. Подключил к аппаратному TWI. Написал прогу и понеслась. Часы запускались, то остонавливались, на дисплее (HD44780) выдалавалсь фигня вместо нужных цифр...Начал думал. Переделал прогу - толку 0, заменил кварц (думал перегрел при пайке), еще раз все пропаял, промыл от флюса - толку 0. Заменил тактирующий кварц МК, сам МК - опять тоже самое. Достал осциллограф - сигналы (SDA, SCL) шли. Потом меня осенило, пошел с макеткой в машину и там запитал от 12 В и о чудо!!! все заработало как надо. Вот теперь думаю - что за источник помех у меня дома, что от них шина i2c сходит с ума и как с этим бороться? всем заранее спасибо за советы
UP: проблема не исчезла... перепробовал 3 блока питания (два адаптера + блок от компа) Везде глюки. Глюки исчезают если питать устройство в ванной (хотя там работает, но стоит девайс переместить на полметра - сраз глючит) стабильно работает вне квартиры. Т.е. в машине например. Дома из источников сильных могут быть - кабель и электроплита им подключенная (на момент тестов плита была выключена, роутер с вайфаем (включен всегда). Народ, подскажите как можно осциллографом посмотреть, какие искажения могут быть на шине i2c.
Выводы шины (SDA, SCL) подтянуты к + питания через резисторы 5-10к? Может скорость шины высокая. Там ни схемы ни исходного кода.
схема стандартная, подтяжки SDA, SCL через 4.7 к на +5 в. Паралльельно питанию кондер 0.1 мкф. Скорость шины 100 КГц.Код могу выложить, ведь в машине и частично в квартире часы работают исправно
Нужно ждать ответа не в цикле, а писать что то типа такого. Также как вариант удобно использовать сторожевой таймер если зависоны не частые, то зброс почти не заметен.
Пожалуй ограничусь WDT, а то переделывать код из статьи пока желания нет. Разбираться нужно, тяжко это непрограммистам.
программном i2c ты пишешь "...выставить на ноге 5, лог."1"..." подразумевая например бит передаваемых данных или тактовый импульс, таким образом передавая данные согласно протоколу. в аппартном i2c(почти TWI, но не совсем) ты просто записываешь регистр данных, которые нужно отправить и даешь команду "старт", аппаратный i2c уже сам дергает ножками после команды. тебе можно занять контроллер чем-то другим.
а можно вот сдесь чуток разяснить поглубже ? раньше, для себя, я понимал так, что аппаратный должен как-бы работать "независимо" от основной проги......, ведь на то он и аппаратный, а потом я заметил что и в одном и во втором случае мы подключаем библиотеки где есть сишные файлы, а это уже как-бы выходит за рамки моего понимания. уж очень хочется нащупать разницу
это уже вопрос "чем отличается TWI от i2c?" тут в даташит AVR и стандарт i2c Вас отсылаю.
Цитата:
я заметил что и в одном и во втором случае мы подключаем библиотеки где есть сишные файлы
Странный вопрос. А что мешает аппаратному модулю работать "независимо" от основной проги, в случае подключения Сишных файлов?)))) Сам факт подключения файлов мешает?))))) Вы хоть посмотрели, что в этих файлах?)))) Никто не мешает ничего не подключать и писать все ручками в одном файле. Просто в этом всем потом будет сложно разобраться. Основной алгоритм нужно писать по возможности платформонезависимым, а все платформозависимое выносить в отдельные файлы. Написали Вы к примеру реализацию очень сложного протокола информационного обмена верхнего уровня, используя при этом функции: void send_byte(byte); uint8_t get_byte(); использующие программный ногодрыг, притворяющийся i2c (программный i2c) Этой программе неважно, как эти функции реализованы, функции описаны в другом файле. Так вот, если изменятся исходные условия задачи, например нужно реализовать не программный i2c, а аппаратный. В этом случае просто подключаются другие одноименные функции для работы с аппаратным i2c (или любым другим протоколом: SPI, UART, и т.д....), а не переписывается вся программа.
да почему же он странный, вполне логичный. в моем понимании аппаратный это как, например, реализован таймер Т0 в Atmege8 мы же там не подключаем никаких сишных файлов......, мы просто его конфигурируем и все....., вуаля....., он идет в свободное плавание....., тикает он сам посебе, не задействовав при этом никаой програмной части для своей работы, а прога крутится сама по себе....., дает он нам только прерывания
ibiza11 писал(а):
Вы хоть посмотрели, что в этих файлах?))))
разного рода ф-ции: старт, стоп и тому подобное вот для меня и непонятка как это аппаратный может использовать програмный код, когда он должен быть жостко реализован на железе(транзисторы и т.п.) надеюсь ясно изложился ?
файлы, это только средство. Сами же говорите, таймер нужно конфигурировать, так же нужно конфигурировать любой аппаратный модуль. Просто функции конфигурации вынесены в отдельный файл. А то что при работе с таймером Атмега не подключется сишный файл - не правило. Посмотрите библиотеки STM или LPC, увидите там файл с функциями для работы с таймером.
Цитата:
вот для меня и непонятка как это аппаратный может использовать програмный код, когда он должен быть жостко реализован на железе
Вы думаете в аппартном модуле сидят маленькие гномики-телепаты, которые определяют что именно в данный момент нужно сделать? протокол i2c содержит кучу состояний в которых может находится приемо/передатчик, что подразумевает под собой кучу команд, которые понимает модуль
старт
ACK
повторный старт
стоп
.... да что я рассказываю. Если Вы читали бы даташит на модуль TWI AVR, таких вопросов не возникало бы. Очередной халявщик.
в моем понимании аппаратный это как, например, реализован таймер Т0 в Atmege8 мы же там не подключаем никаких сишных файлов......, мы просто его конфигурируем и все.....,
А кто мешает эту самую конфигурацию написать в другом файле и подключить его? это раз, сконфигурирова его раз и больше нетрогать, это разве что в часах, а вот если например яркость регулировать или обороты двигателя - постоянно нужно менять значение регистра совпадения, выходит мы всеже вмешиваемся, но таймер не перестает быть аппаратным!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения