Доброго времени суток. программирую AVR на любительском уровне, в среде IAR. Вот понадобилось реализовать TWI интерфейс. Поскольку в МК уже есть данный модуль связи, решил делать аппаратно. С принципом протокола разобрался, суть как бы уловил. Но тут наткнулся на аппноут AVR 315, в котором есть "драйвер" для данной функции, и якобы написан под ИАР (Compiler: IAR EWAAVR 2.28a/3.10c). Так вот, закачанный мною драйвер был подключен в проект (.c и .h файлы), в мейне прописан инклюд... но вор при попытке компиляции я получаю ряд ругательств, что у меня не определены имена, или переменные, которые используются при установке битов. В подключенных файлах проекта есть некий iom8.inc где как я вижу это все определяется:
/* Timer/Counter Interrupt MaSK register */
#define OCIE2 7
#define TOIE2 6
#define TICIE1 5
#define OCIE1A 4
#define OCIE1B 3
#define TOIE1 2 и т.д.
но вот почему-то компиляция не проходит, и ИАР упорно не видит этих дефайнов, даже когда я копирую этот код непосредственно в мейн или файл драйвера...
Просьба не предлагать програмный вариант TWI или сменить среду програмирования. Кстати ИАР пробовал 5,5 и 6,1 версий, одинаковая ситуация.
Вагон вот таких ошибок
Error[Pe020]: identifier "TWEN" is undefined M:\TWI\TWI_Master.c 421
Error[Pe020]: identifier "TWIE" is undefined M:\TWI\TWI_Master.c 422
Error[Pe020]: identifier "TWINT" is undefined M:\TWI\TWI_Master.c 422
Error[Pe020]: identifier "TWEA" is undefined M:\TWI\TWI_Master.c 423...
при клике по ошибке выводит на строчку где это имя встречается.
вот код из драйвера
void TWI_Master_Initialise(void)
{
TWBR = TWI_TWBR; // Set bit rate register (Baudrate). Defined in header file.
// TWSR = TWI_TWPS; // Not used. Driver presumes prescaler to be 00.
TWDR = 0xFF; // Default content = SDA released.
TWCR = (1<<TWEN)| // Enable TWI-interface and release TWI pins.
(0<<TWIE)|(0<<TWINT)| // Disable Interupt.
(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // No Signal requests.
(0<<TWWC); //
}
/****************************************************************************
Call this function to test if the TWI_ISR is busy transmitting.
****************************************************************************/
unsigned char TWI_Transceiver_Busy( void )
{
return ( TWCR & (1<<TWIE) ); // IF TWI Interrupt is enabled then the Transceiver is busy
}
как видно, эти дефайны заюзаны при настройке регистров...
Да, можно сесть, потратить минут 15 и заменить эти дефайны циферками вручную, но если менять камень - опять переделывать. Да и разобраться хочется))
Думается, дело в том, что в новых версиях IAR'а, не помню с какой начиная, эти константы были изменены для соответствия с AVR GCC компилятором. Теперь код на Си для этих двух компиляторов практически совместим, но в старом IAR коде нужно изменить все такие константы. Они отличаются несколькими буквами в каждом случае, нужно заглянуть в заголовочник мк и сделать замены.
Не нужно определять эти константы вручную или копировать из старого проекта, нужно подключить стандартный заголовочник и использовать их из него.
Можете прикрепить тестовый проект на iar6, исправим как надо.
не всегда правильно работает.
Оно конечно быстро удобно,но потом люди начинают искать пути устранения внешних помех или клять компилятор,якобы он код кривой выдаёт.