Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR AVR отказывается применять SBI, CBI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
SZ0
Компилирую код для тини2313. Использую регистры GPIOR0,1,2 как флаговые. Компилятор ни в какую не хочет работать с ними командами SBI, CBI (пишу на С). Оптимизацией баловался, и отключал её. Ничего не даёт smile3046.gif Регистры находятся в адресном пространстве, где эти команды должны работать.

Ещё компилятор мне умудряется сделать следующее:
Если регистр флаговый описывают как ниже, то он вместо применения GPIOR0 использует GPIOR2. Я что-то видимо недопонимаю среди ночи cranky.gif laughing.gif

Код
__io union
{
unsigned char f1_b;    
struct
{            //
  unsigned char err:1;    
  unsigned char tst;        
  unsigned char :1;        
  unsigned char :1;        
  unsigned char :1;        
  unsigned char rl_scr:1;  
  unsigned char scr:1;    
  unsigned char :1;                 //
}f1;
}@ 0x13;                            // GPIOR0

SZ0
Как оказалось, ошибка содержалась в:

Код
unsigned char tst;


пропустил размер поля

Код
unsigned char tst:1;


после этого всё встало на свои места
Xenia
Цитата(SZ0 @ Jun 9 2011, 00:24) *
Компилирую код для тини2313. Использую регистры GPIOR0,1,2 как флаговые. Компилятор ни в какую не хочет работать с ними командами SBI, CBI (пишу на С). Оптимизацией баловался, и отключал её. Ничего не даёт smile3046.gif Регистры находятся в адресном пространстве, где эти команды должны работать.

Если объявить флаг, как адрес памяти, то IAR-компилятор и работать будет с ним, как с памятью, не применяя регистровые команды SBI, CBI, которые с памятью не работают. Т.е. компилятор не станет анализировать: "Ага! Эта память находится в регистровом пространстве. Дай-ка я к ней, как к регистру, обращусь".

Для того, чтобы компилятор понимал, что это регистр, надо с самого начала объявлять ваш флаг, как регистр. Т.е. пользоваться или явным именем GPIOR0 или дейфаном:
#define F1 GPIOR0
Тогда и команды SBI, CBI компилятор начнет применять, т.к. будет понимать, что имеет дело с регистром.

Советую попытаться определить биты в регистре подобно тому, как они используются в хидер-файлах старших AVR-контроллеров - через макрос SFR_B_N:
SFR_B_N(0x13, F1, Dummy7, scr, rlscr, Dummy4, Dummy3, Dummy2, Dummy1, err);
Такая запись по идее должна определять имя F1, как синоним GPIOR0, а к его битам позволяет обращаться по имени через подчеркивание:
F1_scr
F1_err
Только не забудьте подключить хидер iomacro.h, а то компилятор не будет знать, что такое SFR_B_N.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.