реклама на сайте
подробности

 
 
> Как маскировать прерывания I2C в atmega128?, Нужно запрещать и разрешать прерывания I2C без изменения состояния FSM
Pechka
сообщение Jun 5 2013, 15:03
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 144
Регистрация: 25-03-10
Из: Москва
Пользователь №: 56 210



Каким способом можно не меняя состояния конечного автомата I2C запретить или разрешить прерывание по I2C? Например, в одной из функций программы нужно на время запретить прерывание I2C (и только его!) а затем включить, но чтобы при этом не портить состояние конечного автомата? Через регистр TWCR портится состояние и обмен происходит с ошибками. Глобальным cli, sei не подходит - другие функции должны работать.
P.S. контроллер atmega128
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение Jun 5 2013, 15:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Pechka @ Jun 5 2013, 18:03) *
Каким способом можно не меняя состояния конечного автомата I2C запретить или разрешить прерывание по I2C?

Код
void disableTwiInterrupt()
{
TWCR=(1<<TWEN) | (1<<TWEA) |(0<<TWIE);
}



Цитата(Pechka @ Jun 5 2013, 18:03) *
Через регистр TWCR портится состояние и обмен происходит с ошибками.

Что именно портится? Каким образом меняете TWCR?
Go to the top of the page
 
+Quote Post
Pechka
сообщение Jun 5 2013, 15:40
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 144
Регистрация: 25-03-10
Из: Москва
Пользователь №: 56 210



Цитата(_Артём_ @ Jun 5 2013, 18:24) *
Что именно портится? Каким образом меняете TWCR?

Через регистр TWCR происходит передача команд в аппаратный блок (в зависимости от значения TWSR в TWCR кладутся разные значения для обеспечения обмена). Таким образом, меняя значение TWCR в процессе обмена не ясно, что именно будет передано в линию: команда из только что обработанного прерывания I2C либо данные, обновленные в приведенной процедуре. Если TWINT=1 то, понятно, проблем нет - машина состояния ждет действий от приложения, а вот если TWINT=0 и штука обменивается данными - тогда не понятно. Например, я ведущий и посылаю стоп, а после этого делаю отключение прерывания указанным способом, то стоп дойдёт до ведомого или же потеряется?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 5 2013, 16:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Pechka @ Jun 5 2013, 18:40) *
Таким образом, меняя значение TWCR в процессе обмена не ясно, что именно будет передано в линию: команда из только что обработанного прерывания I2C либо данные, обновленные в приведенной процедуре.

Запись в регистр TWCR запускает генерацию START, STOP и тп. Для запуска нужного действия нужно в соответствующий бит записать 1.
Запись 0 никаких действий не вызывает.

Цитата(Pechka @ Jun 5 2013, 18:40) *
если TWINT=0 и штука обменивается данными - тогда не понятно. Например, я ведущий и посылаю стоп, а после этого делаю отключение прерывания указанным способом, то стоп дойдёт до ведомого или же потеряется?

Вроде нет указаний что STOP не дойдёт, но тут надо проверять.

Цитата(Pechka @ Jun 5 2013, 18:40) *
после этого делаю отключение прерывания указанным способом, то стоп дойдёт до ведомого или же потеряется?

Нельзя одновременно запретить прерывание и запустить нужное действие?
Код
void TwiSendStop()
{
TWCR=0
| (1<<TWEN)
| (1<<TWEA)
| (0<<TWIE)
| (1<<TWSTO)
| (1<<TWINT)
;
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016