Страница 1 из 1
Mega8 I2C проблема...
Добавлено: Вс фев 01, 2009 23:40:24
Pooher
Настраиваю TWI:
Код: Выделить всё
ldi tmp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ;start
out TWCR, tmp
Бит TWINT ни в какую не хочет устанавливаться.
Что в VMLAB, что в железе.
Добавлено: Пн фев 02, 2009 01:51:30
asteroid7
А зачем Вам его устанавливать?
Это флаг. Он устанавливается только аппаратно. Сбрасывается программно записью в этот бит "1", что Вы и делаете.
Добавлено: Пн фев 02, 2009 09:25:27
Pooher
Он сбрасывается аппаратно, когда модуль TWI выполнил очередное действие. Устанавливается прогаммно. По умолчанию он сброшен, и по этому невозможно изменить состояние TWDR. Для этого его сначала надо установить.
Добавлено: Пн фев 02, 2009 11:42:11
smac
Pooher писал(а):Он сбрасывается аппаратно, когда модуль TWI выполнил очередное действие. Устанавливается прогаммно. По умолчанию он сброшен, и по этому невозможно изменить состояние TWDR. Для этого его сначала надо установить.
Вы неправы, читайте внимательней описание регистра TWCR и его бит.
Добавлено: Пн фев 02, 2009 12:40:20
Pooher
Может я и не прав, но вот что выдаёт VMLAB:
Код: Выделить всё
TWI: Attempt to write TWDR register while TWINT flag is low
Добавлено: Пн фев 02, 2009 21:08:58
asteroid7
Из оф. ДШ атмела:
• Bit 7 – TWINT: TWI Interrupt Flag
This bit is set by hardware when the TWI has finished...
"TWI: Attempt to write TWDR register while TWINT flag is low" -
Попытка записи в регистр TWDR, когда его флаг TWINT установлен в низкий уровень.
Если не секрет, Вы каким справочником пользуетесь?
Добавлено: Пн фев 02, 2009 22:45:09
smac
Pooher писал(а):Может я и не прав, но вот что выдаёт VMLAB:
Код: Выделить всё
TWI: Attempt to write TWDR register while TWINT flag is low
Я ни разу не пользовался VMLAB, но думаю, что он хочет вас предупредить о том, что если вы пишете в TWDR когда TWINT равен 0, то это может привести к ошибке, поскольку возможно не выполнилась предыдущая операция на шине (старт, рестарт, передача байта или стоп). Т.е. пока флаг TWINT не установится (аппаратно) не стоит записывать в TWDR данные.
Запись же в TWCR
Код: Выделить всё
ldi tmp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ;start
out TWCR, tmp
вы делаете правильно т. е. с одновременным сбросом TWINT, как и рекомендует атмел.
Добавлено: Пн фев 02, 2009 23:29:28
Pooher
Спасибо огромное всем за ответы!
Разобрался. Теперь VMLABу доверия нет:)
Добавлено: Ср фев 04, 2009 00:38:12
Spy1313
Всем добрый день когда-то, давно приходилось разбираться с аппаратным I2C (TWI) в микроконтроллерах AVR. Хочу выложить готовые, рабочие подпрограммы для работы с ним, написанные на Ассемблере. Если кому пригодится буду только рад.
Добавлено: Пт фев 06, 2009 10:54:58
Pooher
Если не секрет, Вы каким справочником пользуетесь?
Даташитом на м8
"TWI: Attempt to write TWDR register while TWINT flag is low" -
Попытка записи в регистр TWDR, когда его флаг TWINT установлен в низкий уровень.
Вопрос был не в том "ЧТО ЭТО ЗНАЧИТ?" а "ПОЧЕМУ ЭТО ТАК?"
This bit is set by hardware when the TWI has finished...
Ну я так и писал. Только вот сбрасывается он исключительно программно.