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

 
 
> Автономное программирование..., ATtiny из Mega...
Panych
сообщение Nov 12 2007, 14:08
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



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

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

Прежде всего хотелось бы понять, каким путем правильней идти, потому как всех возможностей IAR не знаю. Да и опыта написания прог для программирования контроллеров нет...


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Panych
сообщение Nov 13 2007, 07:06
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



готового решения не жду smile.gif
просто хотелось бы сразу пойти в правильном направлении smile.gif


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 13 2007, 07:17
Сообщение #3


Шаман
******

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



Xlink.ENU.pdf
--image_input Links pure binary files на стр. 24, 32
Должно помочь.
Go to the top of the page
 
+Quote Post
Panych
сообщение Nov 13 2007, 07:58
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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.


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
Panych
сообщение Nov 13 2007, 09:38
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



Не могу понять, почему выходной файл формата raw-binary получается размером в мегабайты, причем полезной информацией занято начало и конец файла, а середина - сплошные 00. Это связано с присутствием массива __eeprom char matrix1[119] - при его удалении все приходит в норму.

Где искать ошибку?
Может, надо массив matrix1 оформить как внешний файл и подключить с помощью "Raw binary image"?


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 13 2007, 10:04
Сообщение #6


Шаман
******

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



Линкер в версии 4.20 формирует raw binary с ошибкой.
Поставьте 4.30 или загрузите более новый линкер.
Go to the top of the page
 
+Quote Post
Panych
сообщение Nov 13 2007, 10:14
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



Спасибо!
Чет, столько провозился...


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 13 2007, 10:14
Сообщение #8


Шаман
******

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



Насчёт возможности или невозможности подключения к выходному нескольких бинарных входных в документации ничего не сказано.
Определите в командном файле линкера несколько сегментов, в которых у Вас будут располагаться внешние бинарные образы и задайте несколько команд --image_input.
Лучше это делать именно в xcl файле, чтобы контролировать их расположение в памяти.
Непонятно как может влиять массив, расположенный в пространстве __eeprom на формирование бинарного образа пространства __flash (CODE).
Go to the top of the page
 
+Quote Post
Panych
сообщение Nov 14 2007, 09:14
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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 )


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

------------------------------------
несколько файлов таким способом так же удается подключить...


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
Panych
сообщение Jan 21 2008, 11:04
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



После вынужденного перерыва вернулся к проблеме, теперь даже этот топик нашел 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


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
Panych
сообщение Jan 21 2008, 14:27
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



Подсказали ошибку - в последовательности действий:
1 - загружается младший байт слова (0x40)
2 - загружается старший байт слова (0x48)
3 - 1 и 2 повторяется пока не заполнена страница
4 - загружается страница (0x4C)


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
Panych
сообщение Jan 22 2008, 08:00
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 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 - не соответствуют тому, что вижу при просмотре бинарника...


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
Panych
сообщение Jan 22 2008, 09:00
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



Ответ найден:
В программе надо объявлять как "extern __flash unsigned char"
Тема, которая помогла:
http://electronix.ru/forum/index.php?showtopic=18042&hl=


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
Panych
сообщение Feb 4 2008, 11:56
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  hex_bin.zip ( 4.09 килобайт ) Кол-во скачиваний: 23
 


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 4 2008, 12:37
Сообщение #15


Шаман
******

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



Цитата(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).
Уберите эту галочку и вставьте в файл линкера свою опцию заполнения.
При этом, если надо, команды возврата из незадействованых прерываний нужно обеспечить вручную написав обработчики прерываний с пустыми телами.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:52
Рейтинг@Mail.ru


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