Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATtiny + IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Alex_St
Вопрос в следующем:
1. В IAR EWAVR 3.10 объявляю переменную
__no_init __eeprom uchar IR_Commands[IR_Max_Commands][IR_Max_Bytes];

Затем пробую в цикле в нее чего-нибудь записать. Например,
uchar i,j;
for (i = 0; i < 4; i++)
for (j = 0; j < 6; j++)
IR_Commands[i][j] = 0x12;
Казалось бы, в ячейки EEPROM 1 - 25 должны быть записаны 0x12.
А получается нечто типа:
:10000000FF1212FFFFFFFFFFFFFFFFFFFFFFFFFFDA
:10001000FFFFFFFFFF121212121212FFFFFFFFFF7E
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:00000001FF

Записанные программатором данные читаются нормально.

Причем в IAR 2.28 + AT90S2313 все работало нормально.
В чем может быть соль?
Alex_St
Может, причина кроется в том, что я не настраивал OSCCAL?
Подскажите, плз, как его проще настраивать.
Alex_St
Интересный факт - в опциях IAR ставлю Target device = AT90S2313 - все работает нормально. Но размер кода несколько больше. Ставлю Target = ATtiny2313 - появляются глюки с eeprom.

2 All: Помогите, плз, решить проблему!
-Tумблер-
Цитата(Alex_St @ Feb 11 2005, 15:20)
Помогите, плз, решить проблему!
*


Што тут посоветуешь - если хода нет, надо с бубей..

Хотя для начала я бы поостерегся и сделал так:

#define IR_Max_Commands xxx
#define IR_Max_Bytes yyy

__no_init __eeprom uchar IR_Commands[IR_Max_Commands][IR_Max_Bytes];

uchar i,j;
for (i = 0; i < IR_Max_Commands; i++)
{
for (j = 0; j < IR_Max_Bytes; j++)
{
IR_Commands[i][j] = 0x12;
}
}

excl.gif ассемблерный листинг посмотреть не помешает. excl.gif
и сравнить с листингом для 90S2313.
Может быть и ошибка в неадере ATtiny 2313 blink.gif

А вообще, если это глючит при смене процессора - начал бы с чего
попроще:


1.IR_Commands[0][0] = 0x12; // Так работает ?

2. а так ?
IR_Commands[0][0] = 0x12;
IR_Commands[0][1] = 0x12;
IR_Commands[5][5] = 0x12;

3. а так:
IR_Commands[0][0] = 0x12;
IR_Commands[0][1] = 0x12;
..
IR_Commands[3][5] = 0x12;

4. а так :
for (i = 0; i < IR_Max_Commands; i++)
{
for (j = 0; j < IR_Max_Bytes; j++)
{
IR_Commands[i][j] = 0x12; ofiget_nafik_kakoj_delay ();
}
}
smile.gif
Alex_St
Цитата(-Tумблер- @ Feb 11 2005, 15:10)
Што тут посоветуешь - если хода нет, надо с бубей..

Хотя для начала я бы поостерегся и сделал так:

#define IR_Max_Commands xxx
#define IR_Max_Bytes yyy

__no_init __eeprom uchar IR_Commands[IR_Max_Commands][IR_Max_Bytes];

uchar i,j;
for (i = 0; i < IR_Max_Commands; i++)
{
for (j = 0; j < IR_Max_Bytes; j++)
{
IR_Commands[i][j] = 0x12;
}
}

Результат тот же.

Цитата
excl.gif  ассемблерный листинг посмотреть не помешает. excl.gif
и сравнить с листингом для 90S2313.
Может быть и ошибка в неадере ATtiny 2313  blink.gif


Посмотрим. Но в листинге для тини ничего криминального не нашел.
Хотя он получился довольно путанный. Надо поподробнее посмотреть.

Цитата
А вообще, если это глючит при смене процессора - начал бы с чего
попроще:


1.IR_Commands[0][0] = 0x12;  // Так работает ?


Да.

Цитата
2. а так ?
IR_Commands[0][0] = 0x12; 
IR_Commands[0][1] = 0x12; 
IR_Commands[5][5] = 0x12; 

3. а так:
IR_Commands[0][0] = 0x12; 
IR_Commands[0][1] = 0x12; 
..
IR_Commands[3][5] = 0x12; 


Да.

Цитата
4. а так :
for (i = 0; i < IR_Max_Commands; i++)
{
for (j = 0; j < IR_Max_Bytes; j++)
{
IR_Commands[i][j] = 0x12; ofiget_nafik_kakoj_delay ();
}
}
smile.gif
*


А так не работает.

Вариант
#define IR_Max_Commands xxx
#define IR_Max_Bytes yyy

__no_init __eeprom uchar IR_Commands[IR_Max_Commands][IR_Max_Bytes];

uchar i,j;
for (i = 0; i < IR_Max_Commands; i++)
{
IR_Commands[i][j] = i * 0x10;
}

работает отлично, а на вариант

#define IR_Max_Commands xxx
#define IR_Max_Bytes yyy

__no_init __eeprom uchar IR_Commands[IR_Max_Commands][IR_Max_Bytes];

uchar i,j;
for (i = 0; i < IR_Max_Commands; i++)
{
for (j = 0; j < IR_Max_Bytes; j++)
{
IR_Commands[i][j] = i * 0x10 +j;
}
}


в еепроме остается следующее:
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:100010000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFED
:10002000FFFFFFFF303132333435FFFFFFFFFFFFAB
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:00000001FF


Возникает ощущуние, что он как-то путает индексы и пишет все в одно и то же место в 3й строке.
Alex_St
Вроде разаобрался...
Дело в том, что IAR для этого контроллера использует инструкцию MUL A, B.
А семейство Tiny эту команду не поддерживает...
Вот и получается лажа в исполнении прораммы.
IgorKossak
Цитата(Alex_St @ Feb 12 2005, 15:42)
Вроде разаобрался...
Дело в том, что IAR для этого контроллера использует инструкцию MUL A, B.
А семейство Tiny эту команду не поддерживает...
Вот и получается лажа в исполнении прораммы.
*

В глобальных настройках выберите:
-v0, Max 256 byte data, 8 Kbyte code
и снимите флажок
Enhanced core.
Alex_St
А есть ли возможность убрать флажок "Enhanced core" (я так понимаю, это значит использовать расширенные команды от Mega), выбрав мой целевой процессор?

И еще вопрос: как в Вашем случае правильно объявить переменные в ЕЕПРОМ?
Он матерится:
Fatal Error[e72]: Segment EEPROM_N must be defined in a segment definition option (-Z, -b or -P)
IgorKossak
Цитата(Alex_St @ Feb 14 2005, 22:05)
А есть ли возможность убрать флажок "Enhanced core" (я так понимаю, это значит использовать расширенные команды от Mega), выбрав мой целевой процессор?
*

Из диалога - нет, а как иначе не знаю.
Цитата(Alex_St @ Feb 14 2005, 22:05)
И еще вопрос: как в Вашем случае правильно объявить переменные в ЕЕПРОМ?
Он матерится:
Fatal Error[e72]: Segment EEPROM_N must be defined in a segment definition option (-Z, -b or -P)
*

В файле *.xcl (и только таким способом, а не через диалог) вставить строки:
/* Internal eeprom memory */
-Z(XDATA)EEPROM_N,EEPROM_I=0-_..X_EEPROM_END
В среде надо, разумеется, указать путь к этому файлу.
Alex_St
Цитата(IgorKossak @ Feb 19 2005, 13:37)
В файле *.xcl (и только таким способом, а не через диалог) вставить строки:
/* Internal eeprom memory */
-Z(XDATA)EEPROM_N,EEPROM_I=0-_..X_EEPROM_END
В среде надо, разумеется, указать путь к этому файлу.
*


Спасибо, попробую.
Alex_St
2 IgorKossak

Большое спасибо! Работает!

Интересно, а в следующих версиях ИАР этот глюк исправлен?

2 All:
Поделитесь, уважаемые гуру, способами уменьшения объема кода, генерируемого ИАР. Есть код объемом 1300 Байт, который необходимо впихнуть в flash 1кБ. Включена оптимизация по объему, выкинуто все лишнее.
Как еще можно уменьшить код? Какие есть подходы к написанию оптимального кода в ИАР?
IgorKossak
Цитата(Alex_St @ Feb 20 2005, 00:22)
... Какие есть подходы к написанию оптимального кода в ИАР?
*

Это целая наука, но в кратце об этом можно почитать в EWAVR_CompilerReference в главе Programming hints.
Или поискать в этом руководстве слово efficient wink.gif
IgorKossak
Цитата(Alex_St @ Feb 20 2005, 00:22)
2 IgorKossak
Интересно, а в следующих версиях ИАР этот глюк исправлен?
*

К большому сожалению, нет sad.gif
-Tумблер-
Цитата(Alex_St @ Feb 20 2005, 00:22)
Поделитесь, уважаемые гуру, способами уменьшения объема кода, генерируемого ИАР. Есть код объемом 1300 Байт, который необходимо впихнуть в flash 1кБ.
*


Если речь идет о С - можно отрихтовать стартап.
Оставить только инициализацию стека, остальное выкинуть.
Будут некоторые ограничения...
Но если очень надо, то можно.
huh.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.