Alex_St 0 10 февраля, 2005 Опубликовано 10 февраля, 2005 · Жалоба Вопрос в следующем: 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 все работало нормально. В чем может быть соль? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_St 0 11 февраля, 2005 Опубликовано 11 февраля, 2005 · Жалоба Может, причина кроется в том, что я не настраивал OSCCAL? Подскажите, плз, как его проще настраивать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_St 0 11 февраля, 2005 Опубликовано 11 февраля, 2005 · Жалоба Интересный факт - в опциях IAR ставлю Target device = AT90S2313 - все работает нормально. Но размер кода несколько больше. Ставлю Target = ATtiny2313 - появляются глюки с eeprom. 2 All: Помогите, плз, решить проблему! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-Tумблер- 0 11 февраля, 2005 Опубликовано 11 февраля, 2005 · Жалоба Помогите, плз, решить проблему! <{POST_SNAPBACK}> Што тут посоветуешь - если хода нет, надо с бубей.. Хотя для начала я бы поостерегся и сделал так: #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 (); } } :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_St 0 11 февраля, 2005 Опубликовано 11 февраля, 2005 · Жалоба Што тут посоветуешь - если хода нет, надо с бубей.. Хотя для начала я бы поостерегся и сделал так: #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 (); } } :) <{POST_SNAPBACK}> А так не работает. Вариант #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й строке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_St 0 12 февраля, 2005 Опубликовано 12 февраля, 2005 · Жалоба Вроде разаобрался... Дело в том, что IAR для этого контроллера использует инструкцию MUL A, B. А семейство Tiny эту команду не поддерживает... Вот и получается лажа в исполнении прораммы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 13 февраля, 2005 Опубликовано 13 февраля, 2005 · Жалоба Вроде разаобрался... Дело в том, что IAR для этого контроллера использует инструкцию MUL A, B. А семейство Tiny эту команду не поддерживает... Вот и получается лажа в исполнении прораммы. <{POST_SNAPBACK}> В глобальных настройках выберите: -v0, Max 256 byte data, 8 Kbyte code и снимите флажок Enhanced core. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_St 0 14 февраля, 2005 Опубликовано 14 февраля, 2005 · Жалоба А есть ли возможность убрать флажок "Enhanced core" (я так понимаю, это значит использовать расширенные команды от Mega), выбрав мой целевой процессор? И еще вопрос: как в Вашем случае правильно объявить переменные в ЕЕПРОМ? Он матерится: Fatal Error[e72]: Segment EEPROM_N must be defined in a segment definition option (-Z, -b or -P) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 19 февраля, 2005 Опубликовано 19 февраля, 2005 · Жалоба А есть ли возможность убрать флажок "Enhanced core" (я так понимаю, это значит использовать расширенные команды от Mega), выбрав мой целевой процессор? <{POST_SNAPBACK}> Из диалога - нет, а как иначе не знаю. И еще вопрос: как в Вашем случае правильно объявить переменные в ЕЕПРОМ? Он матерится: Fatal Error[e72]: Segment EEPROM_N must be defined in a segment definition option (-Z, -b or -P) <{POST_SNAPBACK}> В файле *.xcl (и только таким способом, а не через диалог) вставить строки: /* Internal eeprom memory */ -Z(XDATA)EEPROM_N,EEPROM_I=0-_..X_EEPROM_END В среде надо, разумеется, указать путь к этому файлу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_St 0 19 февраля, 2005 Опубликовано 19 февраля, 2005 · Жалоба В файле *.xcl (и только таким способом, а не через диалог) вставить строки: /* Internal eeprom memory */ -Z(XDATA)EEPROM_N,EEPROM_I=0-_..X_EEPROM_END В среде надо, разумеется, указать путь к этому файлу. <{POST_SNAPBACK}> Спасибо, попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_St 0 19 февраля, 2005 Опубликовано 19 февраля, 2005 · Жалоба 2 IgorKossak Большое спасибо! Работает! Интересно, а в следующих версиях ИАР этот глюк исправлен? 2 All: Поделитесь, уважаемые гуру, способами уменьшения объема кода, генерируемого ИАР. Есть код объемом 1300 Байт, который необходимо впихнуть в flash 1кБ. Включена оптимизация по объему, выкинуто все лишнее. Как еще можно уменьшить код? Какие есть подходы к написанию оптимального кода в ИАР? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 20 февраля, 2005 Опубликовано 20 февраля, 2005 · Жалоба ... Какие есть подходы к написанию оптимального кода в ИАР? <{POST_SNAPBACK}> Это целая наука, но в кратце об этом можно почитать в EWAVR_CompilerReference в главе Programming hints. Или поискать в этом руководстве слово efficient ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 20 февраля, 2005 Опубликовано 20 февраля, 2005 · Жалоба 2 IgorKossak Интересно, а в следующих версиях ИАР этот глюк исправлен? <{POST_SNAPBACK}> К большому сожалению, нет :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-Tумблер- 0 22 февраля, 2005 Опубликовано 22 февраля, 2005 · Жалоба Поделитесь, уважаемые гуру, способами уменьшения объема кода, генерируемого ИАР. Есть код объемом 1300 Байт, который необходимо впихнуть в flash 1кБ. <{POST_SNAPBACK}> Если речь идет о С - можно отрихтовать стартап. Оставить только инициализацию стека, остальное выкинуть. Будут некоторые ограничения... Но если очень надо, то можно. :huh: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться