Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega48 и INT0
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
alux
Ситуация тупая до безобразия... Сделал проект на меге48 с бутлодером. Так как у м48 нет отдельного загрузчика, сделал так. По сбросу делаю rjmp boot_start в последние 512 байт памяти. Там по нажатию на кнопку определяю, что делать: запускать пользовательскую программу или ждать команд от компьютера. Все работает с песней. Пишу, стираю, читаю. Теперь надо добавить обработчик внешнего прерывания. Все сделал как положено. Настроил внешнее прерывание INT0 по фронту. Разрешил его. Указал вектор .org INT0addr rjmp metka . Программа перестала работать(или работать не так как надо) Кстати, в симуляторе (AVRStudio) все работает как положено. Не могу понять в чем дело. В обработчике ничего не делаю! Исчерпал все варианты. Помогите, пожалуйста.
java script:emoticon(':help:', 'smid_14')
help.gif
beer_warrior
Проверять железо, дребезг, подтяжка итп.
Shurmas
Цитата(alux @ Jun 27 2006, 12:08) *
в симуляторе (AVRStudio) все работает как положено. Не могу понять в чем дело. В обработчике ничего не делаю! Исчерпал все варианты. Помогите, пожалуйста.


проверьте в симуляторе VMLAB.
alux
Проверять железо, дребезг, подтяжка итп.


Вывод INT0 настроен на вход, пулап подключен. К выводу ничего не подключено. Как может вставка вектора прерывания ИНТ0 повлиять на программу?
beer_warrior
Цитата
Как может вставка вектора прерывания ИНТ0 повлиять на программу?

При определенных условиях, но это маловероятно.
На чем пишите? И плз критичные места кода в студию( в т.ч. инит и обработчик прерывания).
alux
Появилась версия...
В бутлодере я использовал в качестве DEV_CODE = 0x77 (Mega8 boot) Может в этом проблема?
alux
Цитата(beer_warrior @ Jun 27 2006, 12:18) *
Цитата
Как может вставка вектора прерывания ИНТ0 повлиять на программу?

При определенных условиях, но это маловероятно.
На чем пишите? И плз критичные места кода в студию( в т.ч. инит и обработчик прерывания).



Прилагаю код
GeorgyBey
Цитата(alux @ Jun 27 2006, 11:08) *
... Указал вектор .org INT0addr rjmp metka .


Сталкивался с тем, что RJMP-у не хватает адресных возможностей перескочить доступную память sad.gif
Команде "jmp" (она дальше "прыгает") тоже может возможностей не хватить.

"Развесьте" метки по пространству адресов через малые промежутки, вместо "rjmp metka" сделайте
"rjmp m1", оттуда "rjmp m2"..."rjmp metka" и посмотрите - не заработает ли.
Или вспоминайте команду перехода на физический конкретный адрес в начало, а оттуда "rjmp",
но в любом случает почитайте в ПОЛНОМ даташите про команды переходов smile.gif

Удачи cheers.gif
IgorKossak
Цитата(GeorgyBey @ Jun 27 2006, 13:26) *
Сталкивался с тем, что RJMP-у не хватает адресных возможностей перескочить доступную память sad.gif
Команде "jmp" (она дальше "прыгает") тоже может возможностей не хватить.

Однозначно хватит возможностей rjmp.
Речь идёт об ATmega48.
Sergio66
Была аналогичная проблема. Дело оказалось в том, что случайно переключил формат выходного hex файлв в Intel Exdended вместо Intel Standard. Разница в том, что в перы=вом случае в начале файла присутствуют доп. 2 байта. А загрузчик этого не учитывал. Вот все вектора и сдвигались. Проверьте формат выходного файла.
serg_am
Может быть у тебя происходит вызов прерывания во время чтения/записи в еепром?
попробуй разрешать прерывания после завершения цикла чтения/записи...
alux
Цитата(Sergio66 @ Jun 27 2006, 13:30) *
Была аналогичная проблема. Дело оказалось в том, что случайно переключил формат выходного hex файлв в Intel Exdended вместо Intel Standard. Разница в том, что в перы=вом случае в начале файла присутствуют доп. 2 байта. А загрузчик этого не учитывал. Вот все вектора и сдвигались. Проверьте формат выходного файла.


Интересная мысль! Но почему тогда обработчик по совпадению таймера работает без проблем?
alux
Повторяю. Может ли быть проблема в том , что в бутлодере я использовал в качестве Device_Type = 0x77 (Mega8 boot) для меги48? И кстати, какой родной DT для mega48? Для загрузки пользуюсь AVROSP (avr911)
Sergio66
Цитата(alux @ Jun 27 2006, 15:55) *
Цитата(Sergio66 @ Jun 27 2006, 13:30) *

Была аналогичная проблема. Дело оказалось в том, что случайно переключил формат выходного hex файлв в Intel Exdended вместо Intel Standard. Разница в том, что в перы=вом случае в начале файла присутствуют доп. 2 байта. А загрузчик этого не учитывал. Вот все вектора и сдвигались. Проверьте формат выходного файла.


Интересная мысль! Но почему тогда обработчик по совпадению таймера работает без проблем?

Обработчик таймера (точнее JAMP) может попадать на пространство, заполненное 0 (NOP) и "добегать" по ним до нужного кода.
SpiritDance
Цитата(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.
alux
Цитата(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 прав.
SpiritDance
Цитата(alux @ Jun 27 2006, 19:46) *
Как-то закручено. Мой вариант проще.

Вам конечно виднее. А я вот как раз не понял как ваш вариант прыгает на основную программу.
singlskv
Цитата(alux @ Jun 27 2006, 19:46) *
.cseg
boot_start:

.equ DT = 0x77 ; Device Type = 0x77 (ATmega8boot)
.........

.equ BOOTSIZE = 256 ; Note: Word address
.equ BOOTLOADER = (FLASHEND+1)-BOOTSIZE ; $0800-$0100=$0700

.org BOOTLOADER ; ($0700)BootStart. Block size is 512B

sbic PINC, 1 ;Если кнопка PROG нажата во время сброса, то
rjmp init ;Переход к программе пользователя


А это нормально что "boot_start:" идет до ".org BOOTLOADER" ?
alux
Цитата(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.
defunct
Действительно. Ничего не понятно.

Откуда взялось прерывание. И зачем оно там вообще нужно?
Прерывание использует бутлоадер? Если да то работать не будет, в M48 нет режима Read-While-Write.

Опишите задачу более точно. К чему именно относится прерывание к бутлоадеру или к основной программе. Запрещены ли прерывания в момент записи. Тип бутлоадера M8 может не подойти, по указанной выше причине (M48 - не поддерживает Read-While-Write и вектора прерываний у него всегда в нижней области Flash, не забывайте у чипа всего 4k флеша).

ps: когда кажется, что проблема решена, так это только кажется ;>
alux
Цитата(defunct @ Jun 29 2006, 22:29) *
Действительно. Ничего не понятно.

Откуда взялось прерывание. И зачем оно там вообще нужно?
Прерывание использует бутлоадер? Если да то работать не будет, в M48 нет режима Read-While-Write.

ps: когда кажется, что проблема решена, так это только кажется ;>


Что не понятно? Бутлодер не использует никаких прерываний. Это же видно из приводимого кода. Во время программирования прерывания запрещены (см. код)

Цитата(defunct @ Jun 29 2006, 22:29) *
Тип бутлоадера M8 может не подойти, по указанной выше причине (M48 - не поддерживает Read-While-Write и вектора прерываний у него всегда в нижней области Flash, не забывайте у чипа всего 4k флеша).


Тип бутлодера прекрасно подошел. И я не вижу никаких проблем. Читаю, стираю, пишу, обратно читаю. И главное - все работает как задумано! smile.gif Какие еще нужны доказательства?
SpiritDance
Цитата(alux @ Jul 3 2006, 17:04) *
Какие еще нужны доказательства?

Напишите программу на С и попробуйте загрузить вашим бутлоадером. smile.gif
alux
Цитата(SpiritDance @ Jul 3 2006, 17:17) *
Цитата(alux @ Jul 3 2006, 17:04) *

Какие еще нужны доказательства?

Напишите программу на С и попробуйте загрузить вашим бутлоадером. smile.gif


А смысл? Я наоборот перевел с Си на Асм. И все работает. Проверено на трех устройствах. Кстати тини2313 тоже программируется с небольшими изменениями через этот же будлодер. Вопрос считаю закрытым.
GeorgyBey
Цитата(IgorKossak @ Jun 27 2006, 13:29) *
Цитата(GeorgyBey @ Jun 27 2006, 13:26) *

Сталкивался с тем, что RJMP-у не хватает адресных возможностей перескочить доступную память sad.gif
Команде "jmp" (она дальше "прыгает") тоже может возможностей не хватить.

Однозначно хватит возможностей rjmp.
Речь идёт об ATmega48.


А как объяснить?!:
D:\...asm(531): error: Relative branch out of reach
IgorKossak
Цитата(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 вдвое.
GeorgyBey
Цитата(IgorKossak @ Jul 11 2006, 15:34) *
Цитата(GeorgyBey @ Jul 10 2006, 18:21) *

А как объяснить?!:
D:\...asm(531): error: Relative branch out of reach

Приведите здесь эту самую строку ...


Вообще-то я немного слукавил wink.gif wub.gif
НО, начиная работать с Тини26 сначала наткнулся на то что УСЛОВНЫЕ переходы очень недалеко "скачут", и приходится прыгать на метку с rjmp, а оттуда куда надо angry.gif
А когда из прерывания rjmp-нул в конец программы (всего-то 53% памяти) на обработчик этого прерывания то и не допрыгнул! Сделал за два прыжка - нет проблем, за один - фигвам! Перенес обработчик в начало, о подпрограммы поближе к вызовам и проблемы исчезли smile.gif
А пишу в АСМе cheers.gif
IgorKossak
Цитата(GeorgyBey @ Jul 12 2006, 13:46) *
А пишу в АСМе cheers.gif

Если пишете под AVRStudio, то там в опциях ассемблера Project\Assembler options есть такая фича - Wrap Relative Jumps.
Попробуйте поэкспериментировать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.