|
mega48 и INT0, Не пойму в чем дело! |
|
|
|
 |
Ответов
(1 - 12)
|
Jun 27 2006, 08:20
|
Местный
  
Группа: Новичок
Сообщений: 232
Регистрация: 24-06-06
Пользователь №: 18 332

|
Цитата(alux @ Jun 27 2006, 12:08)  в симуляторе (AVRStudio) все работает как положено. Не могу понять в чем дело. В обработчике ничего не делаю! Исчерпал все варианты. Помогите, пожалуйста. проверьте в симуляторе VMLAB.
|
|
|
|
|
Jun 27 2006, 09:18
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Как может вставка вектора прерывания ИНТ0 повлиять на программу? При определенных условиях, но это маловероятно. На чем пишите? И плз критичные места кода в студию( в т.ч. инит и обработчик прерывания).
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 27 2006, 09:46
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(beer_warrior @ Jun 27 2006, 12:18)  Цитата Как может вставка вектора прерывания ИНТ0 повлиять на программу? При определенных условиях, но это маловероятно. На чем пишите? И плз критичные места кода в студию( в т.ч. инит и обработчик прерывания). Прилагаю код
Прикрепленные файлы
boot48.txt ( 19.01 килобайт )
Кол-во скачиваний: 163
|
|
|
|
|
Jun 27 2006, 10:26
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 21-12-04
Из: Киев
Пользователь №: 1 593

|
Цитата(alux @ Jun 27 2006, 11:08)  ... Указал вектор .org INT0addr rjmp metka . Сталкивался с тем, что RJMP-у не хватает адресных возможностей перескочить доступную память Команде "jmp" (она дальше "прыгает") тоже может возможностей не хватить. "Развесьте" метки по пространству адресов через малые промежутки, вместо "rjmp metka" сделайте "rjmp m1", оттуда "rjmp m2"..."rjmp metka" и посмотрите - не заработает ли. Или вспоминайте команду перехода на физический конкретный адрес в начало, а оттуда "rjmp", но в любом случает почитайте в ПОЛНОМ даташите про команды переходов Удачи
--------------------
На "нет" и "нах" :)
|
|
|
|
|
Jun 27 2006, 12:41
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(alux @ Jun 27 2006, 15:55)  Цитата(Sergio66 @ Jun 27 2006, 13:30)  Была аналогичная проблема. Дело оказалось в том, что случайно переключил формат выходного hex файлв в Intel Exdended вместо Intel Standard. Разница в том, что в перы=вом случае в начале файла присутствуют доп. 2 байта. А загрузчик этого не учитывал. Вот все вектора и сдвигались. Проверьте формат выходного файла.
Интересная мысль! Но почему тогда обработчик по совпадению таймера работает без проблем? Обработчик таймера (точнее JAMP) может попадать на пространство, заполненное 0 (NOP) и "добегать" по ним до нужного кода.
|
|
|
|
|
Jun 27 2006, 15:04
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288

|
Цитата(alux @ Jun 27 2006, 16:13)  И кстати, какой родной DT для mega48? ATmega48 Signature Bytes 1. 0x000: 0x1E (indicates manufactured by Atmel). 2. 0x001: 0x92 (indicates 4KB Flash memory). 3. 0x002: 0x05 (indicates ATmega48 device when 0x001 is 0x92). Что за девайс type такой 0x77? (я правда не знаю) Ваша проблема наверняка в загрузчике. Пробовали прошивать программу без него? Как-то Вы сумбурно описали алгоритм его работы. До конца не понятно что значит работает на ура. в пробовали считать флешку у контроллера с неработающей программой и сверить с тем что там должно находится на самом деле? У меня для 48 было такое решение. В начале прошивки находится прыжок на старт программы. Он подменялся на прыжок к старту загрузчика. Плюс в прошивке по определнному адресу, скажем 0080h размещается прыжок на старт основной программы. В этом случае контроллер при старте попадает на загрузчик. Загрузчик при необходимости старта основной программы делает абсолютный прыжок по адресу 0080h.
--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
|
|
|
|
|
Jun 27 2006, 15:46
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(SpiritDance @ Jun 27 2006, 18:04)  Цитата(alux @ Jun 27 2006, 16:13)  И кстати, какой родной DT для mega48?
ATmega48 Signature Bytes 1. 0x000: 0x1E (indicates manufactured by Atmel). 2. 0x001: 0x92 (indicates 4KB Flash memory). 3. 0x002: 0x05 (indicates ATmega48 device when 0x001 is 0x92). device codes ;* ;* DESCRIPTION ;* The following device codes must be used by the host computer. Note ;* that the device codes are arbitrary selected, they do not have any ;* thing in common with the signature bytes stored in the device. ;* This are the device Codes recognized by the AVRprog Software. Some ;* Devices may require special hardware or a different, not yet ;* implemented Protocol! Use at your own risk. Используется AVRProg и AVROSP Цитата(SpiritDance @ Jun 27 2006, 18:04)  Цитата(alux @ Jun 27 2006, 16:13)  У меня для 48 было такое решение. В начале прошивки находится прыжок на старт программы. Он подменялся на прыжок к старту загрузчика. Плюс в прошивке по определнному адресу, скажем 0080h размещается прыжок на старт основной программы. В этом случае контроллер при старте попадает на загрузчик. Загрузчик при необходимости старта основной программы делает абсолютный прыжок по адресу 0080h. Как-то закручено. Мой вариант проще. Цитата(SpiritDance @ Jun 27 2006, 18:04)  Цитата(alux @ Jun 27 2006, 16:13)  Ваша проблема наверняка в загрузчике. Пробовали прошивать программу без него? Попробую сегодня вечером. Думаю, Sergio66 прав.
|
|
|
|
|
Jun 29 2006, 07:09
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(SpiritDance @ Jun 27 2006, 20:15)  Цитата(alux @ Jun 27 2006, 19:46)  Как-то закручено. Мой вариант проще.
Вам конечно виднее. А я вот как раз не понял как ваш вариант прыгает на основную программу. Все! Нашел!!! Кратко объясню еще раз, в чем суть проблемы. Для меги48 написал бутлодер. Он размещен в последних 512байт памяти. Да, кстати метка boot_start действительно стояла перед директивой .org BOOTLOADER. Исправил.Но это не критично. По сбросу МК rjmp boot_start. Если во время сброса кнопка PINC, 5 была нажата, то переход в режим программирования. Если нет, то переход к инициализационной части основной программы (rjmp init). Вот здесь начинается интересное. Бутлодер запрограммировал при помощи avreal. Когда сравнил hex-файлы исходника и прочитанного через бутлодер, выяснилось, что бутлодер не правильно вычислил переход к метке init. AVROSP (host-программа для управлением бутлодером) использует расширенный формат hex-файла. А avreal отсекает все лишнее. Поэтому имеем смещение init -2 байта. Проблема решается довольно просто. Инициализацию разместил сразу за таблицей векторов прерываний. И метку init закрепить конкретным адресом директивой .org $01a . Все!!! Всем спасибо . Отдельное человеческое спасибо Sergio66 и SpiritDance.
|
|
|
|
|
Jul 3 2006, 13:04
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(defunct @ Jun 29 2006, 22:29)  Действительно. Ничего не понятно.
Откуда взялось прерывание. И зачем оно там вообще нужно? Прерывание использует бутлоадер? Если да то работать не будет, в M48 нет режима Read-While-Write.
ps: когда кажется, что проблема решена, так это только кажется ;> Что не понятно? Бутлодер не использует никаких прерываний. Это же видно из приводимого кода. Во время программирования прерывания запрещены (см. код) Цитата(defunct @ Jun 29 2006, 22:29)  Тип бутлоадера M8 может не подойти, по указанной выше причине (M48 - не поддерживает Read-While-Write и вектора прерываний у него всегда в нижней области Flash, не забывайте у чипа всего 4k флеша). Тип бутлодера прекрасно подошел. И я не вижу никаких проблем. Читаю, стираю, пишу, обратно читаю. И главное - все работает как задумано!  Какие еще нужны доказательства?
|
|
|
|
|
Jul 10 2006, 15:21
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 21-12-04
Из: Киев
Пользователь №: 1 593

|
Цитата(IgorKossak @ Jun 27 2006, 13:29)  Цитата(GeorgyBey @ Jun 27 2006, 13:26)  Сталкивался с тем, что RJMP-у не хватает адресных возможностей перескочить доступную память Команде "jmp" (она дальше "прыгает") тоже может возможностей не хватить. Однозначно хватит возможностей rjmp. Речь идёт об ATmega48. А как объяснить?!: D:\...asm(531): error: Relative branch out of reach
--------------------
На "нет" и "нах" :)
|
|
|
|
|
Jul 11 2006, 12:34
|

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

|
Цитата(GeorgyBey @ Jul 10 2006, 18:21)  А как объяснить?!: D:\...asm(531): error: Relative branch out of reach Приведите здесь эту самую строку (531) и посмотрите внимательно на размер флеши в настройках (*.h, *.inc, *.xcl в зависимости от среды). Судя по исходным данным: 1. Device ATmega48 Flash 4K Bytes 2. RJMP - Relative Jump Description: Relative jump to a address within PC - 2K + 1 and PC + 2K (words). For AVR microcontrollers with Program memory not exceeding 4K words (8K bytes) this instruction can address the entire memory from every address location. Т. е. возможности RJMP перекрывают пространство кода ATmega48 вдвое.
|
|
|
|
|
Jul 12 2006, 10:46
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 21-12-04
Из: Киев
Пользователь №: 1 593

|
Цитата(IgorKossak @ Jul 11 2006, 15:34)  Цитата(GeorgyBey @ Jul 10 2006, 18:21)  А как объяснить?!: D:\...asm(531): error: Relative branch out of reach
Приведите здесь эту самую строку ... Вообще-то я немного слукавил НО, начиная работать с Тини26 сначала наткнулся на то что УСЛОВНЫЕ переходы очень недалеко "скачут", и приходится прыгать на метку с rjmp, а оттуда куда надо А когда из прерывания rjmp-нул в конец программы (всего-то 53% памяти) на обработчик этого прерывания то и не допрыгнул! Сделал за два прыжка - нет проблем, за один - фигвам! Перенес обработчик в начало, о подпрограммы поближе к вызовам и проблемы исчезли А пишу в АСМе
--------------------
На "нет" и "нах" :)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|