Технический форум по робототехнике.
Korbofos » 14 мар 2012, 19:35
Вот думаю как красивее сделать? Если нет ответа от i2c девайса чтобы не сгинуть в цикле, как от этого лучше защитится? Таймер отдать для этого? Или както так?
- Код: Выделить всё • Развернуть
unsigned char i2c_read_byte(void)
{
unsigned int wait =65535;
TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT))&&wait--);
return TWDR;
}
Radist » 15 мар 2012, 03:50
Давно с ним не работал, но вроде там просто. Мастер делает клоки, пишет адрес и прочее, и вот доходит дело до аска от ведомого. Как узнать что его нет? Речь идет видимо о программной реализации протокола. В апликухах атмела этот пример есть, рекомендую глянуть, наверняка там это все есть.
Korbofos » 15 мар 2012, 15:04
мне нужно выполнять программу дальше не зацикливаясь в while (!(TWCR & (1 << TWINT))) если не поступит ответ...
Dmitry__ » 15 мар 2012, 16:36
Так и делается как ты описал. Если проц очень шустрый и не хочется терять время на такие ожидалки, то такой обработчик делается через прерывание (например тик обработки i2c - каждые 10 мкс.), а основная программа опрашивает флаги статуса этого обработчика.
Сам обработчик будет конечным автоматом.
Влетел в прерывание, ушел на ветку текущего состояния, обработал кусок, изменил/оставил как есть состояние автомата, выставил флаги, свалил из прерывания...