|
|
  |
Проблема с TWI |
|
|
|
Nov 9 2005, 16:32
|

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

|
Неа, я имел в виду прерывание по TWI т.е. гарантированую хардварную проверку срабатывания TWINT. Но в любом случае это показало, что девайс работоспособен и проблема вероятнее всего состоит в неправильном отлове TWINT Прерывания не зря придумали. Вот пример проверенный. switсh это проверка условия, case это то, что делаеться по условию. Обрабатываються все возможные ситуации. Изучайте логику перекладывайте на асм.
Прикрепленные файлы
twi.zip ( 2 килобайт )
Кол-во скачиваний: 100
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Nov 10 2005, 08:38
|

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

|
По прерыванию TWI что-то не работает... Прошу не бить меня ногами, но пинание в нужном направлении приветствуется. При инициализации я сделал так:
1. Настроил прерывания:
.CSEG .org $000 rjmp RESET ;Сброс вектор .org $022 rjmp From_м32 ;Обработчик TWI ATmega16
2. Настроил TWI:
ldi temp,$04 ;Инициализация режима "Приемник" out TWAR,temp ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE) out TWCR,temp
потом разрешил общие прерывания:
sei
;******************** Обработчик TWI:
From_м32: in temp,TWSR andi temp,$F8 cpi temp,$60 ;Проверка принятого адреса от м32 breq Pr_data ;Если адрес совпал - прием данных, иначе - выход из прерывания
ldi temp,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) out TWCR,temp
reti
Pr_data: здесь идет прием данных
|
|
|
|
|
Nov 10 2005, 12:35
|

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

|
Артем, запись 1 в TWINT сбрасывает триггер, а прервывание его взводит. James, если м16 слэйв работает нормально, при отключенном м32слэйв. Значит предыдущая сессия обмена не закрывалась. Вообще в отличии от большинства меговской перефирии TWI живет как конечный автомат с кучей состояний. Внимательно просмотрите таблицы с кодами TWSTA, в последней колонке список предлагаемых дествий после каждого этапа передачи. Т.е. тупая линейная программа - дали команду ждем завершения не катит, особенно если на линии больше двух устройств. Т.е. мы отлавливаем каждый код возврата и ждем не только ожидаемого исхода, но и обрабатываем возможные Nack, arbitration lost итд. По этому коду принимаем решение о продолжении обмена, рестарте, аварийном завершении итп. Насколько я вижу картину, автомат сейчас заносит в какоето состояние которое не обрабатываеться. После чего невозврат ACK и вечный цикл в ожидании TWINT который уже не придет.
Попробую скомпилировать вышеприведенный С код и кинуть листинг для наглядности.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Nov 10 2005, 16:34
|

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

|
Хорошо, если можно запустить программу обработки ошибок (знать бы еще как ее сделать), а если зацикливается в цикле ожидания wait1 (такое иногда бывает, только сейчас не вспомню при каких условиях - я их столько перебрал, вспомнить страшно)? Как тогда быть?
ldi temp,$00 ;Установка скорости передачи = 100 kHz out TWSR,temp ldi temp,12 out TWBR,temp
Pusk_St:ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR,temp ;Посылка сигнала "START"
wait1: in temp,TWCR ;Ожидаем ответа от слэйв контроллера sbrs temp,TWINT rjmp wait1
|
|
|
|
|
Nov 10 2005, 18:41
|

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

|
to artem:
• Bit 7 – TWINT: TWI Interrupt Flag This bit is set by hardware when the TWI has finished its current job and expects application software response. If the I-bit in SREG and TWIE in TWCR are set, the MCU will jump to the TWI Interrupt Vector. While the TWINT Flag is set, the SCL low period is stretched. The TWINT Flag must be cleared by software by writing a logic one to it.
Страница 179 описание TWCR
to James: Не хочеться раздувать топик, на выходных склепаю заметочку с подробным разбором этой темы и выложу у себя на страничке. Я тоже очень долго воевал c TWI, в моем случае был multimaster да еще на очень кривом железе, поэтому опыта поднабрался немало <_<
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Nov 11 2005, 17:23
|
Участник

Группа: Свой
Сообщений: 63
Регистрация: 25-06-04
Пользователь №: 179

|
Цитата(James D. @ Nov 11 2005, 12:46)  Попробую применить этот С для написания прог для МК... Весьма похвально. Но имейте ввиду, что CVAVR-овский компайлер, так сказать, имеет много гитик, то есть девиаций, иногда полезных, от стандартного C. Да и кто их не имеет.. Но все равно могу предсказать вам радость от сокращения в десятки разов, если не в сотни, времени разработки. Я вас даже зауважал, писать для 32-й меги на авээровском асме - это да!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|