Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Вот автомат

Отправлено 1111 22 декабря 2007 г. 14:15
В ответ на: Mega64 + 24C256 - подпрограмма разового пользования (+) отправлено AZ 22 декабря 2007 г. 13:53


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// TWI interrupt routine
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
#pragma vector=TWI_vect
__interrupt void TWI_interrupt( void )
{
switch(TWSR & 0xF8) // Read result code and switch to next action
{
//---- Start and TRANSMIT conditions -------
case 0x08:
// A START condition has been transmitted
case 0x10:
// A repated START condition has been transmitted
if(twi.err_cnt < TWI_MAX_ERR)
{
twi.err_cnt++;
TWDR = twi.dsel; // Send (Resend) Selector and RW bit
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWINT);
}
else
{
twi.err_code = TWI_ERR;
twi.flags |= (1 << TWI_FLAG_READY); // Signal end of TWI activity
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWSTO)|(1 << TWINT);
}
break;

case 0x20:
// Salve Selector+WR, Not ACK
case 0x48:
// Slave Selector+RD, Not Ack
// Предполагается при неготовности при продолжении цикла записи
// посылается старт заново
if(twi.err_cnt < TWI_MAX_ERR)
{
twi.err_cnt++;
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWSTA)|(1 << TWINT);
}
else
{
twi.err_code = TWI_ERR;
twi.flags |= (1<<TWI_FLAG_READY); // Signal end of TWI activity
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWSTO)|(1 << TWINT);
}
break;

case 0x18:
// Slave Selector+WR has been transmitted, ACK
twi.err_cnt = 0;
TWDR = *(twi.ptr_to_data + twi.bcnt); // Write to TX register first DATA byte
twi.bcnt++;
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWINT);
break;

case 0x28:
// Data byte has been transmitted; ACK has been received

if(twi.bcnt < twi.bsize) // Data sent, Ack
{
TWDR = *(twi.ptr_to_data + twi.bcnt); // Write data to TX register
twi.bcnt++;
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWINT);
}
else
{
twi.flags |= (1<<TWI_FLAG_READY); // Signal end of TWI activity
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWSTO)|(1 << TWINT);
}
twi.err_cnt = 0;
break;

case 0x30:
// Data sent, NOT Ack
if(twi.err_cnt < TWI_MAX_ERR)
{
TWDR = *(twi.ptr_to_data + twi.bcnt); // Resent Data
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWINT);
}
else
{
twi.err_code = TWI_ERR;
twi.flags |= (1<<TWI_FLAG_READY); // Signal end of TWI activity
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWSTO)|(1 << TWINT);
}
break;

//------------------------------------------
case 0x38:
// Arbitration Lost
if(twi.err_cnt < TWI_MAX_ERR)
{
twi.err_cnt++;
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWSTA)|(1 << TWINT);
}
else
{
twi.err_code = TWI_ERR;
twi.flags |= (1<<TWI_FLAG_READY); // Signal end of TWI activity
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWSTO)|(1 << TWINT);
}
break;

//---- RECEIVE conditions ------------------
case 0x40:
// Slave Selector+RD, ACK
twi.err_cnt = 0;
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWEA)|(1 << TWINT);
break;

case 0x50:
// Data Received, ACK has been returned
if(twi.bcnt < twi.bsize)
{
*(twi.ptr_to_data + twi.bcnt) = TWDR;
twi.bcnt++;
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWEA)|(1 << TWINT);
}
else
{
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWINT);
}
twi.err_cnt = 0;
break;

case 0x58:
// Data Received, Not Ack
if(twi.bcnt < twi.bsize)
{
twi.err_code = TWI_ERR;
twi.flags |= (1 << TWI_FLAG_READY); // Signal end of TWI activity
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWSTO)|(1 << TWINT);
}
else
{
twi.flags |= (1 << TWI_FLAG_READY); // Signal end of TWI activity
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWSTO)|(1 << TWINT);
}
break;

default:
// Unknown code
if(twi.err_cnt < TWI_MAX_ERR)
{
twi.err_cnt++;
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWSTA)|(1 << TWINT);
}
else
{
twi.err_code = TWI_ERR;
twi.flags |= (1 << TWI_FLAG_READY); // Signal end of TWI activity
TWCR = (1 << TWEN)|(1 << TWIE)|(1 << TWINT);
}
}
}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
сложите 2 и 3:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru