| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
ATMega & TWI в режиме прерываний
17.04.2010, 19:57
|
|
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 482
Сказал спасибо: 18
Сказали Спасибо 106 раз(а) в 67 сообщении(ях)
|
ATMega & TWI в режиме прерываний
Пишу библиотеку для работы с TWI в режиме прерываний. Столкнулся с проблемой ожидания окончания передачи, то есть установки на шине STOP состояния. ожидание флага TWINT в регистре TWCR ни к чему не приводят.
Вот грабли, если дважды подряд вызвать функцию отсылки данных, первая пройдет успешно, вторая будет ждать окончания. Но максимум что можно узнать (IMHO), это получение последнего прерывания, что происходит за долго до установки состояния STOP, и как причину второе, ожидающее сообщение отослано корректно не будет.
Единственное что приходит на ум, проверять в ручную состояние пинов...
|
|
|
|
18.04.2010, 15:08
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
Re: ATMega & TWI в режиме прерываний
Сразу после СТОП можно давать СТАРТ - без всяких задержек, логика чипа сама все сделает. Именно поэтому СТОП и не вызывает прерывание - ибо незачем
|
|
|
|
18.04.2010, 15:44
|
|
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 482
Сказал спасибо: 18
Сказали Спасибо 106 раз(а) в 67 сообщении(ях)
|
Re: ATMega & TWI в режиме прерываний
Так именно в том-то проблема, что СТОП не передается, ибо на него залезает СТАРТ!!! Если сразу (дожидаясь TWINT конечно) инициировать новую транзакцию... Тоесть происходит вот что.
в основном потоке (main Proc) вызываеться функция которая устанавливает соответствующие переменные в нужное состояние, и устанавливает
|
Код:
|
twi_send()
{
while(_busyflag); //‹‹ Вот тут грабли,
// ... code...
// ‹‹ вот тут на них наступаю
TWCR = _BV(TWEN)|_BV(TWIE)|_BV(TWINT)| _BV(TWSTA);
} |
далее все обрабатываеться по приходу прерывания.
но как так сбросить флаг занятости чтоб не наехать стартом на стоп....?
Пока решил дожидаться состояния стоп проверяя пины SDA & SCL на наличие высокого уровня после завершения транзакции.
|
|
|
|
18.04.2010, 16:09
|
|
|
Гражданин KAZUS.RUN
Регистрация: 08.07.2006
Сообщений: 582
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: ATMega & TWI в режиме прерываний
Чип какой? Не ATmega8 ли случайно?
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
18.04.2010, 16:13
|
|
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 482
Сказал спасибо: 18
Сказали Спасибо 106 раз(а) в 67 сообщении(ях)
|
Re: ATMega & TWI в режиме прерываний
Сообщение от alberio
|
|
Чип какой? Не ATmega8 ли случайно?
|
А какая разница, у них на всех один TWI. и в меге 16, и в меге 8, одни грабли.
|
|
|
|
18.04.2010, 19:20
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
Re: ATMega & TWI в режиме прерываний
Ха-ха, вот и напоролись на наличие отсутствия атмеловских еррат))) В мега8 ТВИ глючный, особенно в слейве и особенно при работе от встроенного 8 МГц, поэтому и была в спешном порядке выпущена мега88. Могли бы погуглить этот вопрос
|
|
|
|
18.04.2010, 20:52
|
|
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 482
Сказал спасибо: 18
Сказали Спасибо 106 раз(а) в 67 сообщении(ях)
|
Re: ATMega & TWI в режиме прерываний
Сообщение от niXto
|
|
Ха-ха, вот и напоролись на наличие отсутствия атмеловских еррат))) В мега8 ТВИ глючный, особенно в слейве и особенно при работе от встроенного 8 МГц, поэтому и была в спешном порядке выпущена мега88. Могли бы погуглить этот вопрос
|
Хи-хи, читать внимательно, Slave не генерирует START и STOP. это мастер(можно было догадаться), и мега16, к тому-же от кварца. кстати, насчет меги8, делал, но с периодическим опросом но не в прерываниях, на встроенном генераторе, на максимальной частоте, то есть 8 МГц. Мастером кстати тоже была мега - Mega32, никаких пререканий.
|
|
|
|
18.04.2010, 21:30
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
Re: ATMega & TWI в режиме прерываний
Ну значит повезло - а я в свое время помню мучился с ним дня 3... За это время мог написать 3 раза подряд полностью софтовые модули, но хотелось разобраться с аппаратным. Пока в запарке не перепутал макетки с мега8 и мега88 - и о чудо! - все сразу заработало. Не знаю, может теперь в мега8 глюки пофиксили - но я принципиально ставлю на И2С только мега48-88-168, чего и всем рекомендую. Идеально работают и в мастере. и в слэйве, СТАРТ у них никогда не залазит на СТОП, посмотрите ассемблерный листинг - может компилятор думает что он самый умный
И давайте не будем играть в угадайку
|
|
|
|
18.04.2010, 22:22
|
|
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 482
Сказал спасибо: 18
Сказали Спасибо 106 раз(а) в 67 сообщении(ях)
|
Re: ATMega & TWI в режиме прерываний
Сообщение от niXto
|
|
И давайте не будем играть в угадайку
|
С радостью. Но только если не будете сразу отправлять на "погугивание", ото некрасиво получается...  ...
|
|
|
|
19.04.2010, 19:29
|
|
|
Прохожий
Регистрация: 24.11.2006
Сообщений: 6
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: ATMega & TWI в режиме прерываний
Сообщение от nerozero
|
Пишу библиотеку для работы с TWI в режиме прерываний. Столкнулся с проблемой ожидания окончания передачи, то есть установки на шине STOP состояния. ожидание флага TWINT в регистре TWCR ни к чему не приводят.
Вот грабли, если дважды подряд вызвать функцию отсылки данных, первая пройдет успешно, вторая будет ждать окончания. Но максимум что можно узнать (IMHO), это получение последнего прерывания, что происходит за долго до установки состояния STOP, и как причину второе, ожидающее сообщение отослано корректно не будет.
Единственное что приходит на ум, проверять в ручную состояние пинов...
|
Ну после СТОПА прерывания ждать не нужно(и незачем). И если был отправлен стоп(например TWCR = (1‹‹TWINT)|(1‹‹TWEN)|(1‹‹TWSTO))
то старт(например TWCR =(1‹‹TWINT)|(1‹‹TWSTA)|(1‹‹TWEN)|(1‹‹TWIE) ) можно делать ничего не дожидаясь. Кристалл сам аппаратно дождётся окончпния СТОПА и выполнит СТАРТ.
вот цитата из даташита:
• Bit 5 – TWSTA: TWI START Condition Bit
The application writes the TWSTA bit to one when it desires to become a Master on the
Two-wire Serial Bus. The TWI hardware checks if the bus is available, and generates a
START condition on the bus if it is free. However, if the bus is not free, the TWI waits
until a STOP condition is detected, and then generates a new START condition to claim
the bus Master status. TWSTA must be cleared by software when the START condition
has been transmitted.
Ну собственно что я уже и написал.
Проверенно не раз на разных кристалах, в том числе и на Мега8, да ещё и на внутреннем генераторе 8Мгц(в мастере естественно). Как и ожидалось, всё работает ГУТ.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:13.
|
|