реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ATtiny + IAR, Проблемы с записью в EEPROM
Alex_St
сообщение Feb 10 2005, 22:28
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 26-11-04
Из: Одесса, Украина
Пользователь №: 1 240



Вопрос в следующем:
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 все работало нормально.
В чем может быть соль?
Go to the top of the page
 
+Quote Post
Alex_St
сообщение Feb 11 2005, 10:24
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 26-11-04
Из: Одесса, Украина
Пользователь №: 1 240



Может, причина кроется в том, что я не настраивал OSCCAL?
Подскажите, плз, как его проще настраивать.
Go to the top of the page
 
+Quote Post
Alex_St
сообщение Feb 11 2005, 12:20
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 26-11-04
Из: Одесса, Украина
Пользователь №: 1 240



Интересный факт - в опциях IAR ставлю Target device = AT90S2313 - все работает нормально. Но размер кода несколько больше. Ставлю Target = ATtiny2313 - появляются глюки с eeprom.

2 All: Помогите, плз, решить проблему!
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Feb 11 2005, 13:10
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



Цитата(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


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post
Alex_St
сообщение Feb 11 2005, 13:39
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 26-11-04
Из: Одесса, Украина
Пользователь №: 1 240



Цитата(-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й строке.
Go to the top of the page
 
+Quote Post
Alex_St
сообщение Feb 12 2005, 12:42
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 26-11-04
Из: Одесса, Украина
Пользователь №: 1 240



Вроде разаобрался...
Дело в том, что IAR для этого контроллера использует инструкцию MUL A, B.
А семейство Tiny эту команду не поддерживает...
Вот и получается лажа в исполнении прораммы.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 13 2005, 10:29
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

В глобальных настройках выберите:
-v0, Max 256 byte data, 8 Kbyte code
и снимите флажок
Enhanced core.
Go to the top of the page
 
+Quote Post
Alex_St
сообщение Feb 14 2005, 19:05
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 26-11-04
Из: Одесса, Украина
Пользователь №: 1 240



А есть ли возможность убрать флажок "Enhanced core" (я так понимаю, это значит использовать расширенные команды от Mega), выбрав мой целевой процессор?

И еще вопрос: как в Вашем случае правильно объявить переменные в ЕЕПРОМ?
Он матерится:
Fatal Error[e72]: Segment EEPROM_N must be defined in a segment definition option (-Z, -b or -P)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 19 2005, 11:37
Сообщение #9


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(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
В среде надо, разумеется, указать путь к этому файлу.
Go to the top of the page
 
+Quote Post
Alex_St
сообщение Feb 19 2005, 20:01
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 26-11-04
Из: Одесса, Украина
Пользователь №: 1 240



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


Спасибо, попробую.
Go to the top of the page
 
+Quote Post
Alex_St
сообщение Feb 19 2005, 21:22
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 26-11-04
Из: Одесса, Украина
Пользователь №: 1 240



2 IgorKossak

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

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

2 All:
Поделитесь, уважаемые гуру, способами уменьшения объема кода, генерируемого ИАР. Есть код объемом 1300 Байт, который необходимо впихнуть в flash 1кБ. Включена оптимизация по объему, выкинуто все лишнее.
Как еще можно уменьшить код? Какие есть подходы к написанию оптимального кода в ИАР?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 20 2005, 11:09
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Alex_St @ Feb 20 2005, 00:22)
... Какие есть подходы к написанию оптимального кода в ИАР?
*

Это целая наука, но в кратце об этом можно почитать в EWAVR_CompilerReference в главе Programming hints.
Или поискать в этом руководстве слово efficient wink.gif
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 20 2005, 12:25
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Alex_St @ Feb 20 2005, 00:22)
2 IgorKossak
Интересно, а в следующих версиях ИАР этот глюк исправлен?
*

К большому сожалению, нет sad.gif
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Feb 22 2005, 12:02
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



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


Если речь идет о С - можно отрихтовать стартап.
Оставить только инициализацию стека, остальное выкинуть.
Будут некоторые ограничения...
Но если очень надо, то можно.
huh.gif


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 02:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01474 секунд с 7
ELECTRONIX ©2004-2016