|
Автономное программирование..., ATtiny из Mega... |
|
|
|
Nov 12 2007, 14:08
|
Местный
  
Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35

|
Собственно, делаю, конечно, не программатор, но одна из функций состоит в том, чтобы из Mega128 иметь возможность прошивать ATtiny, причем не одной прошивкой, а несколькими поочередно. Работаю в IAR-4.20А. Варианты, пришедшие в голову: 1) Поставить внешнюю flash, содержащую программы, и прошивать 2) Заливать файлы прошивки для ATtiny в Mega, используя "Raw binary image". Мне кажется этот способ более элегантным, но помимо основного вопроса всплывет еще один - как подключить два файла? Можно, конечно, ручками объединить файлы прошивок, но не хотелось бы это делать каждый раз при внесении изменений - программы еще будут отлаживаться и дорабатываться некоторое время. Есть ли пути как-то автоматизировать это?
И основной вопрос: Какой именно файл указывать линкеру? hex? но он содержит много лишней информации.
Прежде всего хотелось бы понять, каким путем правильней идти, потому как всех возможностей IAR не знаю. Да и опыта написания прог для программирования контроллеров нет...
--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Nov 13 2007, 07:58
|
Местный
  
Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35

|
Нашел... 1) Как сказано, "This option corresponds to the Raw binary image option in the linker category in the IAR Embedded Workbench IDE" - то есть подключить можно только один файл binary raw. Надо сшивать два файла или данную опцию можно повторить? Для повторения эта опция прописывается на вкладке Extra Option настроек линкера? 2) В настройках же линкера нашел установку выходного формата, получил выходной файл в папке ...\Debug\Exe\Board.d90 (см. рис), но файл получился размером в Мегабайты.
При этом полезной информацией занято начало и конец файла, а середина - сплошные 00. Это связано с присутствием массива __eeprom char matrix1[119] - при его удалении все приходит в норму, хотя размер выходного файла все равно чуть больше, чем сообщает IAR.
--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
|
|
|
|
|
Nov 14 2007, 09:14
|
Местный
  
Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35

|
Спасибо за советы, файл сгенерил, написал xcl-файл для проекта, вроде все компилируется правильно. Попробовал использовать имя, указанное мной в команде "--image_input" - и получил ошибку: Код Error[Pe020]: identifier "bin_code_1" is undefined ...\main.c 604 Попытался найти, как использовать массив и не нашел, только слова типа "Подключай, линкуй и обращайся по тому имени, которое записал в поле "Symbol". Наверное, нужно еще какое-то подключение, кроме указания в команде "--image_input". Попытался объявить Код __flash char bin_code_1[2048]; получил законное: Код Error[e27]: Entry "bin_code_1" in module main ( main.r90 ) redefined in module Image file 0 ( debug.d90 ) Куда смотреть? ------------------------------------ нашел все-таки  ответ на последний вопрос тут: http://electronix.ru/forum/index.php?showtopic=27456&hl=------------------------------------ несколько файлов таким способом так же удается подключить...
--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
|
|
|
|
|
Jan 21 2008, 11:04
|
Местный
  
Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35

|
После вынужденного перерыва вернулся к проблеме, теперь даже этот топик нашел  Вход в режим программирования проходит, но если не передать команду "Стирание", то память не очищается. Значит, вход не произошел? Отдельной командой память очищается, но не удается записать ни одного байта в память программ. Прошу помощи - в чем может быть проблема? Запрограммировать пытаюсь Tiny26... Код char mark = 0; char temp = 0; char low_abyte = 0; char high_abyte = 0;
DELAYMS( 20 ); while ( mark == 0 ) // будем добиваться входа в синхронизацию { // вход в режим программирования CLEARBIT( DDRE, 6 ); // Reset = High DELAYMS( 1 ); // Reset = Low CLEARBIT( PORTE,6 ); SETBIT( DDRE, 6 ); CLEARBIT( PORTE,6 ); DELAYMS( 20 ); // вход в синхронизацию SEND_SPI( 0xAC ); SEND_SPI( 0x53 ); temp = SEND_SPI( 0xAA ); // любое значение if( temp == 0x53 ) { SEND_SPI( 0xAA ); // любое значение mark = 1; } } // стирание кристалла SEND_SPI( 0xAC ); SEND_SPI( 0x80 ); SEND_SPI( 0x00 ); SEND_SPI( 0x00 ); DELAYMS( 20 ); // задежка
// Команда «Запись страницы памяти программ» SEND_SPI( 0x4C ); SEND_SPI( high_abyte ); SEND_SPI( low_abyte ); SEND_SPI( 0x00 ); temp = 0xAA; if( temp != 0xFF ) { // Команда «Загрузка страницы памяти программ - младший байт» SEND_SPI( 0x40 ); SEND_SPI( high_abyte ); SEND_SPI( low_abyte ); SEND_SPI( temp ); } DELAYMS( 20 ); // задежка между байтами temp = 0xBB; if( temp != 0xFF ) { // Команда «Загрузка страницы памяти программ - старший байт» SEND_SPI( 0x48 ); SEND_SPI( high_abyte ); SEND_SPI( low_abyte ); SEND_SPI( temp ); }
DELAYMS( 20 ); // задежка между страницами SETBIT( PORTC, 3 );// откл. разр. прогр. Tiny CLEARBIT( DDRE, 6 ); // Reset = High
--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
|
|
|
|
|
Jan 22 2008, 08:00
|
Местный
  
Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35

|
Далее... При линковании кода программируемого устройства прописал в Extra Option: Код -Ompds-code,(CODE)=Z:\AVR_Project\Humidity_Work_Code.bin[code] Несколько скорректировал родной файл .xcl, изменив 1 строку и вставив 2: [code]-Z(CODE)CODE,EXTCODE1,EXTCODE2=_..X_INTVEC_SIZE-_..X_FLASH_END // измененная --image_input=Z:\AVR_Project\Humidity_Work_Code.bin,bin_code_1,EXTCODE1,1 // вставленная в конец --image_input=Z:\AVR_Project\Humidity_Debug_Code.bin,bin_code_2,EXTCODE2,1 // вставленная в конец в коде программы прописано следующее: Код unsigned short bn = 0; extern char bin_code_1[]; extern char bin_code_2[]; ... temp = bin_code_2[ bn ]; ... bn перебирается в диапазоне 0...2047 В результате пишется не то, что в бинарнике. Код в бинарнике небольшой, 126 байт, остальное занимают 0х00, но память программируемого устройства оказывается заполненной полностью какими-то символами. Если записывать в память не из бинарника, то что пишем - то и считываем программатором. Чего я недопонимаю? Попробовал выводить на дисплей первые значения массива bin_code_2 - не соответствуют тому, что вижу при просмотре бинарника...
--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
|
|
|
|
|
Jan 22 2008, 09:00
|
Местный
  
Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35

|
Ответ найден:В программе надо объявлять как "extern __flash unsigned char" Тема, которая помогла: http://electronix.ru/forum/index.php?showtopic=18042&hl=
--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
|
|
|
|
|
Feb 4 2008, 11:56
|
Местный
  
Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35

|
Опять возникла проблема. В Extra Option при компиляции малой программы (та, которая должна быть залита с помощью основной программы из Mega в Tiny) указал: Код -Oraw-binary,(CODE)=Z:\AVR_Project\Work_Code.bin -Oraw-binary,(XDATA)=Z:\AVR_Project\Work_Xdata.bin В xcl-файле основной программы указал: Код --image_input=Z:\AVR_Project\Work_Code.bin,bin_code_work,CODE,1 --image_input=Z:\AVR_Project\Work_Xdata.bin,bin_xdata_work,CODE,1 При сравнении прошивок программатор выдает ошибку: Цитата WARNING: FLASH byte address 0x009D is 0x00 (should be 0xFF).. FAILED! Смотрю Work_Code.hex - там на этом адресе - обрыв строки. В bin-файлах его нет, но заполнение ведется не 0xFF, а 0x00, на что судя по всему и идет ругань при сравнении. Как заполнить 0xFF? При попытке это сделать с помощью опции линкера Linker/Processing выдается ошибка Цитата Fatal Error[e38]: Option -H must not be defined more than once: -H1895 Используются cfgtiny26.xcl и cfg0t.xcl, там нет опции -H
--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|