Перейти к содержанию
    

ATtiny + IAR

Вопрос в следующем:

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[j] = 0x12;

Казалось бы, в ячейки EEPROM 1 - 25 должны быть записаны 0x12.

А получается нечто типа:

:10000000FF1212FFFFFFFFFFFFFFFFFFFFFFFFFFDA

:10001000FFFFFFFFFF121212121212FFFFFFFFFF7E

:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0

:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0

:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0

:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0

:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0

:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90

:00000001FF

 

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

 

Причем в IAR 2.28 + AT90S2313 все работало нормально.

В чем может быть соль?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может, причина кроется в том, что я не настраивал OSCCAL?

Подскажите, плз, как его проще настраивать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

2 All: Помогите, плз, решить проблему!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите, плз, решить проблему!

 

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

 

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

 

#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[j] = 0x12;

}

}

 

:excl: ассемблерный листинг посмотреть не помешает. :excl:

и сравнить с листингом для 90S2313.

Может быть и ошибка в неадере ATtiny 2313 :blink:

 

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

попроще:

 

 

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[j] = 0x12; ofiget_nafik_kakoj_delay ();

}

}

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

#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[j] = 0x12;

}

}

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

 

:excl:  ассемблерный листинг посмотреть не помешает. :excl:

и сравнить с листингом для 90S2313.

Может быть и ошибка в неадере ATtiny 2313  :blink:

 

Посмотрим. Но в листинге для тини ничего криминального не нашел.

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

 

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

попроще:

 

 

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[j] = 0x12; ofiget_nafik_kakoj_delay ();

}

}

:)

 

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

 

Вариант

#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[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[j] = i * 0x10 +j;

}

}

 

 

в еепроме остается следующее:

:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00

:100010000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFED

:10002000FFFFFFFF303132333435FFFFFFFFFFFFAB

:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0

:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0

:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0

:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0

:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90

:00000001FF

 

 

Возникает ощущуние, что он как-то путает индексы и пишет все в одно и то же место в 3й строке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде разаобрался...

Дело в том, что IAR для этого контроллера использует инструкцию MUL A, B.

А семейство Tiny эту команду не поддерживает...

Вот и получается лажа в исполнении прораммы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде разаобрался...

Дело в том, что IAR для этого контроллера использует инструкцию MUL A, B.

А семейство Tiny эту команду не поддерживает...

Вот и получается лажа в исполнении прораммы.

В глобальных настройках выберите:

-v0, Max 256 byte data, 8 Kbyte code

и снимите флажок

Enhanced core.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

И еще вопрос: как в Вашем случае правильно объявить переменные в ЕЕПРОМ?

Он матерится:

Fatal Error[e72]: Segment EEPROM_N must be defined in a segment definition option (-Z, -b or -P)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Из диалога - нет, а как иначе не знаю.

И еще вопрос: как в Вашем случае правильно объявить переменные в ЕЕПРОМ?

Он матерится:

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

В среде надо, разумеется, указать путь к этому файлу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В файле *.xcl (и только таким способом, а не через диалог) вставить строки:

/* Internal eeprom memory */

-Z(XDATA)EEPROM_N,EEPROM_I=0-_..X_EEPROM_END

В среде надо, разумеется, указать путь к этому файлу.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 IgorKossak

 

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

 

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

 

2 All:

Поделитесь, уважаемые гуру, способами уменьшения объема кода, генерируемого ИАР. Есть код объемом 1300 Байт, который необходимо впихнуть в flash 1кБ. Включена оптимизация по объему, выкинуто все лишнее.

Как еще можно уменьшить код? Какие есть подходы к написанию оптимального кода в ИАР?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... Какие есть подходы к написанию оптимального кода в ИАР?

Это целая наука, но в кратце об этом можно почитать в EWAVR_CompilerReference в главе Programming hints.

Или поискать в этом руководстве слово efficient ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 IgorKossak

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

К большому сожалению, нет :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделитесь, уважаемые гуру, способами уменьшения объема кода, генерируемого ИАР. Есть код объемом 1300 Байт, который необходимо впихнуть в flash 1кБ.

 

Если речь идет о С - можно отрихтовать стартап.

Оставить только инициализацию стека, остальное выкинуть.

Будут некоторые ограничения...

Но если очень надо, то можно.

:huh:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...