Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Автономное программирование...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Panych
Собственно, делаю, конечно, не программатор, но одна из функций состоит в том, чтобы из Mega128 иметь возможность прошивать ATtiny, причем не одной прошивкой, а несколькими поочередно.
Работаю в IAR-4.20А.
Варианты, пришедшие в голову:
1) Поставить внешнюю flash, содержащую программы, и прошивать
2) Заливать файлы прошивки для ATtiny в Mega, используя "Raw binary image". Мне кажется этот способ более элегантным, но помимо основного вопроса всплывет еще один - как подключить два файла? Можно, конечно, ручками объединить файлы прошивок, но не хотелось бы это делать каждый раз при внесении изменений - программы еще будут отлаживаться и дорабатываться некоторое время. Есть ли пути как-то автоматизировать это?

И основной вопрос:
Какой именно файл указывать линкеру?
hex? но он содержит много лишней информации.

Прежде всего хотелось бы понять, каким путем правильней идти, потому как всех возможностей IAR не знаю. Да и опыта написания прог для программирования контроллеров нет...
Panych
готового решения не жду smile.gif
просто хотелось бы сразу пойти в правильном направлении smile.gif
IgorKossak
Xlink.ENU.pdf
--image_input Links pure binary files на стр. 24, 32
Должно помочь.
Panych
Нашел...
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.
Panych
Не могу понять, почему выходной файл формата raw-binary получается размером в мегабайты, причем полезной информацией занято начало и конец файла, а середина - сплошные 00. Это связано с присутствием массива __eeprom char matrix1[119] - при его удалении все приходит в норму.

Где искать ошибку?
Может, надо массив matrix1 оформить как внешний файл и подключить с помощью "Raw binary image"?
IgorKossak
Линкер в версии 4.20 формирует raw binary с ошибкой.
Поставьте 4.30 или загрузите более новый линкер.
Panych
Спасибо!
Чет, столько провозился...
IgorKossak
Насчёт возможности или невозможности подключения к выходному нескольких бинарных входных в документации ничего не сказано.
Определите в командном файле линкера несколько сегментов, в которых у Вас будут располагаться внешние бинарные образы и задайте несколько команд --image_input.
Лучше это делать именно в xcl файле, чтобы контролировать их расположение в памяти.
Непонятно как может влиять массив, расположенный в пространстве __eeprom на формирование бинарного образа пространства __flash (CODE).
Panych
Спасибо за советы, файл сгенерил, написал 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 )


Куда смотреть?
------------------------------------
нашел все-таки smile.gif
ответ на последний вопрос тут:
http://electronix.ru/forum/index.php?showtopic=27456&hl=

------------------------------------
несколько файлов таким способом так же удается подключить...
Panych
После вынужденного перерыва вернулся к проблеме, теперь даже этот топик нашел smile.gif
Вход в режим программирования проходит, но если не передать команду "Стирание", то память не очищается. Значит, вход не произошел?
Отдельной командой память очищается, но не удается записать ни одного байта в память программ.
Прошу помощи - в чем может быть проблема?

Запрограммировать пытаюсь 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
Panych
Подсказали ошибку - в последовательности действий:
1 - загружается младший байт слова (0x40)
2 - загружается старший байт слова (0x48)
3 - 1 и 2 повторяется пока не заполнена страница
4 - загружается страница (0x4C)
Panych
Далее...
При линковании кода программируемого устройства прописал в 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 - не соответствуют тому, что вижу при просмотре бинарника...
Panych
Ответ найден:
В программе надо объявлять как "extern __flash unsigned char"
Тема, которая помогла:
http://electronix.ru/forum/index.php?showtopic=18042&hl=
Panych
Опять возникла проблема.
В 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
IgorKossak
Цитата(Panych @ Feb 4 2008, 13:56) *
Как заполнить 0xFF?
При попытке это сделать с помощью опции линкера Linker/Processing выдается ошибка
Используются cfgtiny26.xcl и cfg0t.xcl, там нет опции -H

Эта опция неявно присутствует если установлена галочка General Options->System->Initialize unused interrupt vectors with RETI instructions (-H1895).
Уберите эту галочку и вставьте в файл линкера свою опцию заполнения.
При этом, если надо, команды возврата из незадействованых прерываний нужно обеспечить вручную написав обработчики прерываний с пустыми телами.
Panych
Спасобо, получилось
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.