|
|
  |
Проблема с TWI |
|
|
|
Nov 7 2005, 12:53
|

Местный
  
Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466

|
У меня временная индикация сделана на светодиодах.
Приемник (В этом случае - диод D,0 горит, а D,1 нет):
From_MT:ldi temp,$04 ;Инициализация режима "Приемник" out TWAR,temp
TWINT_n:ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
cbi PORTD,0
wait1n: in temp,TWCR ;Ожидаем вызова от MT контроллера sbrs temp,TWINT rjmp wait1n
cbi PORTD,1
in temp,TWSR andi temp,$F8 cpi temp,$60 ;Проверка принятого адреса от MT brne TWINT_n
cbi PORTD,2 . . .
Передатчик (здесь С,2; C,3; C,4 и C,5 - горят, а С,6 - уже не горит):
To_SR:
ldi temp,$00 ;Установка скорости передачи= 10 kHz out TWSR,temp ldi temp,192 out TWBR,temp
Pusk_Sr:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR,temp ;Посылка сигнала "START"
cbi PORTC,2
wait1r: in temp,TWCR ;Ожидаем ответа от SR контроллера sbrs temp,TWINT rjmp wait1r
cbi PORTC,3
in temp,TWSR andi temp,$F8 cpi temp,$08 ;Проверка подтверждения приема от SR (START) brne Pusk_Sr
cbi PORTC,4
SLA_Wr: ldi temp,$04 ;Загрузка адреса SR-контроллера + "WRITE" out TWDR,temp ldi temp,(1<<TWINT)|(1<<TWEN) out TWCR,temp
wait2r: in temp,TWCR ;Ожидаем ответа от SR контроллера sbrs temp,TWINT rjmp wait2r
cbi PORTC,5
in temp,TWSR andi temp,$F8 cpi temp,$18 brne SLA_Wr ;Переход, если ответ от SR неверный
cbi PORTC,6 . . .
|
|
|
|
|
Nov 8 2005, 08:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата(James D. @ Nov 7 2005, 23:08)  To beer_warrior: а как проверить инициализацию м16 как slave? Приемник (m16) cтопорит на начальном этапе ожидания связи с передатчиком - бит TWINT не устанавливается. Передатчик (m32) после передачи SLA+W не принимает ACK - судя по-всему код в TWSR не $18. Я имею в виду нет ли различий в коде м16 и м32. Возможно даже не относящихся непосредственно к TWI. (прерывания, ватчдог) Далее, проясните вопрос с передачей: клинит на первом обращении или на последующих, не требуеться ли repeated start? Далее, проверяем прошел ли нормально start condition, если нет то что в статусе у мастера. Бит TWINT должен устанавливаться в любом случае, если посылка проехала физически, проверьте это. Далее проверяем все-таки что твориться в TWSR слэйва, он возвращает ACK, NACK, arbitration lost, что-то другое? Для блезиру можно попробовать SLA+R, general call возможно это что-то прояснит.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Nov 8 2005, 10:51
|

Местный
  
Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466

|
Различия в коде, конечно есть. Система у меня такая: два m32 + m16, все три соединены по TWI. Обе меги32 работают нормально (у каждой свой код), регулярно одна мега (мастер передат.) передает данные на другую (подчинен. приемник) приблиз. 30 раз в сек. Мега 16 имеет функцию часов реального времени - внеш. кварц 32768 Гц. По нажатию спец. кнопочки, m32 (мастер передат.) связывается с m16 (подчинен. приемник), передает пару байт, и должен принять текущее значение времени. Так вот, при первом же нажатии этой кнопки связи не получается, оба контроллера зависают, а третий - m32 (подчинен. приемник), продолжает работать. То есть клинит на первом обращении.
Сделал еще два пробных проекта - первый m16 - мастер приемник, второй - m32 - подчин. передатчик. Ничего лишнего, только у m16 оставил часы реал. врем. Работают оба МК по прерываниям таймеров по переполнению или совпадению (в принципе неважно, главное связь по TWI проходит одним циклом, т.е. сработало прерывание - идет передача, закончилась передача - reti) После многочисленных неудачных попыток, заработало - пришлось только у обоих МК в самом конце передачи вставить команду ldi temp,(0<<TWEN) out TWCR,temp потому как все зависало при ВТОРОМ соединении, первое полностью проходило нормально.
Вставил эти рабочие куски кода в свою 3-х контроллерную систему, все проверил, но опять та же фигня - клинит на первом же обращении m32 к m16.
Может соединить все это хозяйство по USART? Как думаете? Беда только в том, что с USART я никогда не работал, как там со сложностью и стабильностью?
|
|
|
|
|
Nov 8 2005, 11:42
|

Местный
  
Группа: Участник
Сообщений: 315
Регистрация: 10-10-05
Пользователь №: 9 466

|
Еще кое-что удалось выяснить: убрал я передачу данных на вторую m32 (приемник), заработала связь m16 - мастер приемник, с m32 - подчинен. передатчик. По нажатию кнопочки, все как положено. У меня уже крыша едет.
У меня сделано так: первая m32 - это мастер-передатчик, когда связывается со второй m32, и подчиненный передатчик, когда связывается с m16. Видно что-то происходит со связью после соединения m32-m32, так как после этого не получается соединение первой m32 с m16. Как же правильно завершать работу TWI, и переходить с мастера-передатчика на подчиненный передатчик? В даташите про это ничерта не написано! Мудрецы!
P.S. Связь m32-m32 и m32-m16 осуществляется в пределах одного обработчика прерывания. Сначала идет передача на один МК, потом на второй. По следующему прерыванию опять тоже самое.
|
|
|
|
|
Nov 8 2005, 12:42
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Батенька, с арбитражем у вас проблемы. И с отработкой нештатных ситуаций. К изучению: ATMega16 ->TWI ->Multi-master Systems and Arbitration http://www.semiconductors.philips.com/acro...98/39340011.pdfМогу закинуть свой исходник на С и по непонятным местам прокомментировать
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Nov 8 2005, 12:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Батенька, с арбитражем у вас проблемы. И с отработкой нештатных ситуаций. К изучению: ATMega16 ->TWI ->Multi-master Systems and Arbitration http://www.semiconductors.philips.com/acro...98/39340011.pdfМогу закинуть свой исходник на С и по непонятным местам прокомментировать
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|