Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
ipkin
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вт июл 10, 2007 23:15:17
Откуда: Магнитогорск

Сообщение ipkin »

biDE писал(а):может включен режим совместимости с мега103, как здесь

http://www.radiokot.ru/forum/viewtopic.php?t=8985

блин если я отключаю режим совместимости с мега103 то переход к подпраграммам начинает работать зато основная прога ведёт себя не адекватно
вот какие у меня фузы:
^------это галочка
^-SUT0
^-BOOTSZ0
^-BOOTSZ1
^-JTAGEN

если поставлю ^-M103C то прога работает нормально а вот с RCALL начинаются проблемы
кварц использую на 8мГц
что не так помогите
Аватара пользователя
Томатный
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт июл 31, 2007 20:32:30
Откуда: Киев, Украина
Контактная информация:

Сообщение Томатный »

оформите таблицу векторов прерываний, как положено

помогло, я просто описал все прерывания, но так и не понял, как быть если я использую только RESET и USART_RXC ?
используйте конструкцию

не понял как пользоваться этой конструкцией
кто вас научил так оформлять таблицу векторов прерываний?!

помоему из примера в книге Микроконтроллеры AVR. Вводный курс.
посмотрите в АСМ листинге (файл .lst) в примере к задаче 5 курса

в архиве z5.rar нету этого листинка

покажите пожалуйста пример кода, ато не хочется описывать все векторы...
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Сообщение Brutaller »

Томатный писал(а):пожалуйста наведите на правильный путь :shock: :oops:


А проблему то решить так никто и не помог...
Ну tych меня не удивил, как всегда отправляет на свой курс :)))
Да, давайте все начнем писать на асме методом - компильнул на сях, посмотрел в LST, скормил ассемблеру :)))

ARV дядька толковый, но не учел одного момента, разговор ведь про ATmega32.

А теперь собственно о самой проблеме.

У avr'ok размер памяти программ которых более 8кб, таблица векторов строится не с командами RJMP, а с командами JMP. Соответственно, каждый вектор занимает не одного слово памяти, а два. Если глянуть повнимательнее в даташит в раздел "Interrupts", то это прекрасно видно. Так что надо ни rjmp USART_RXC, а jmp USART_RXC.

По поводу правильности оформления таблицы тоже можно поспорить. Для меня удобнее открыть даташит на кокретный контроллер, перейти в соответствующий раздел, скопировать список(пример), за ним идут пустышки-метки ведущие на команду RETI. В любой момент понадобившееся прерывание выбираем в пару легких движений. К тому же еще и безопаснее кое в чем. Пример в аттаче.
Вложения
examp.asm
Пример оформления таблицы векторов ATtiny2313
(1.61 КБ) 1182 скачивания
Аватара пользователя
Томатный
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт июл 31, 2007 20:32:30
Откуда: Киев, Украина
Контактная информация:

Сообщение Томатный »

большое спасибо, теперь сам буду так же делать.
кстати я из примера в даташите копировал векторы прерываний...
там один из векторов называется ADC и я только сейчас заметил, что "ADC" подсвечивается синим цветом в AVR Studio ! :shock:
обьясняли что надо писать jmp вместо rjmp, а примерчик дали с rjmp ;)
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Сообщение Brutaller »

Томатный писал(а):большое спасибо, теперь сам буду так же делать.
кстати я из примера в даташите копировал векторы прерываний...
там один из векторов называется ADC и я только сейчас заметил, что "ADC" подсвечивается синим цветом в AVR Studio ! :shock:


Я рад, что помогло :))

А что касается ADC, то да, это ведь команда, асм будет ругаться если как метку попытаться заюзать. Лучше сразу написать Int_ADC.
Я так вообще все метки относящиеся к прерываниям(кроме Reset) начинаю с Int_ , чтоб сразу было видно, что это обработчик прерывания.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

все ваши проблемы именно в том, что вы, начитавшись непонятно каких книжек, используете неверный подход. если бы вы использовали рекомендованный мной способ с директивами ORG - минимум половины проблем у вас не возникло, а может и вообще ни одной (с векторами). поясню, в чем суть.

от модели к модели количество используемых векторов прерываний, их размер и т.п. могут меняться, как вы справедливо заметили. поэтому если вы будете считать команды rjmp или jmp в таблице векторов, надеясь попасть на нужное место - вам не избежать проблем при портировании кода с одной модели МК на другую. выход в принципиально ином системном подходе: надо максимально абстрагироваться от конкретной аппаратной платформы и работать с символьными константами. Эти константы определяют адреса каждого вектора, описаны они в соответствующем inc-файле. главное: значения констант могут быть разные, но символьные имена остаются прежними. т.е. вектор прерывания по переполнению таймера 0 будет иметь название TMR0_OV_VECT (я привожу абстрактный пример, т.к. не помню точное название константы) для любого МК. если вы напишите в программе

Код: Выделить всё

   .org  TMR_OV_VECT
   rjmp Vect_Func

то компилятор разместит команду перехода на подпрограмму-обработчик прерывания Vect_Func именно по тому адресу, который соответствует вектору - для одного МК это будет ячейка, предположим, 2, для другого - 4, для третьего - 8. вы знать не будете, какая именно ячейка соответствует вектору, но программа будет работать верно! если какие-то векторы вам не нужны - просто не описывайте их - никаких nop-ов в таблице векторов не надо! если вы будете использовать "короткие" переходы rjmp - вы никогда не ошибетесь!

есть такое простое правило, которым пренебрегают программисты-любители: чем меньше конкретных чисел в вашей программе - тем лучше. т.е. вместо чисел используйте заранее описанные символьные константы (если вы задумаетесь, то все "названия" регистров не более, чем четкое следование этому подходу).

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

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Brutaller писал(а):Ну tych меня не удивил, как всегда отправляет на свой курс :))) .


Я там еще пример в VMLAB рекомендовал:
C:\VMLAB\AVR_demo\UART.ASM

ARV писал(а):значения констант могут быть разные, но символьные имена остаются прежними. т.е. вектор прерывания по переполнению таймера 0 будет иметь название TMR0_OV_VECT (я привожу абстрактный пример, т.к. не помню точное название константы) для любого МК. если вы напишите в программе

Код: Выделить всё

   .org  TMR_OV_VECT
   rjmp Vect_Func

то компилятор разместит команду перехода на подпрограмму-обработчик прерывания Vect_Func именно по тому адресу, который соответствует вектору


В примере C:\VMLAB\AVR_demo\UART.ASM
который я рекомендовал на прошлой страницы
примерно так и сделано !

Код: Выделить всё

.org URXCaddr               ; UART Receive Complete Interrupt
   rjmp uart_rx
.org UDREaddr               ; UART Data Register Empty Interrupt
   rjmp uart_em
.org UTXCaddr               ; UART Transmit Complete Interrupt
   rjmp uart_tx
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

tych, не надо кричать: правильный подход - даже в вашем курсе остается правильным :)

в примерах, предлагаемых разработчиками компиляторов или производителями МК, как правило, всегда показан наиболее правильный подход - остается только его воспринять и следовать ему!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

ARV писал(а):остается только его воспринять и следовать ему!


Но как убедить в этом людей !? :shock: Не желают читать примеры к прогам, хелпы и доку. Сразу ваять !

Вот ведь Ассемблер для AVR руководство на русском. (линк я удалил так как "верхний человек форума" мне написал
Ваше представление об образовательном процессе, которое идет в разрез с философией и правилами данного Форума.
) - читайте да делайте правильно ...
Последний раз редактировалось tych Ср окт 29, 2008 19:29:20, всего редактировалось 2 раза.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

tych писал(а):Но как убедить в этом людей !? :shock: Не желают читать примеры к прогам, хелпы и доку. Сразу ваять !
имхо, терпеливо убеждать, ненавязчиво подводя (возможно через ошибки) к осознанию необходимости учиться
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Томатный
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт июл 31, 2007 20:32:30
Откуда: Киев, Украина
Контактная информация:

Сообщение Томатный »

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

я ту книжку не читал, просто просмотрев и обнаружив море ошибок не стал дальше читать...я интуиктивно пытаюсь сам разобраться. достаточно даже списка асм команд с кратким пояснением...темболее я несовсем новичек в МК, просто впервые вижу асм.
я привожу абстрактный пример

спасибо, с примером все понятно.
можно и так и так безразници. смысл понятен, но я даже не знаю что такое .org так что пока так для меня так грубовато как-то.
...
подумайте над сказанным и не ошибайтесь впредь!

оки :wink:
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Сообщение Brutaller »

По поводу максимального юзания символьных имен - согласен.

А вот такого от вас ARV, я не ожидал:
ARV писал(а):если вы будете использовать "короткие" переходы rjmp - вы никогда не ошибетесь!


Интересно вот только, а зачем же тогда каждый вектор занимает два слова в памяти, а не одно как у кристаллов с флэшиной не более 8кб ?
Наверно потому, что rjmp не вовсюда может прыгнуть... Эх, а всё так категорично было заявлено...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Brutaller писал(а):А вот такого от вас ARV, я не ожидал:
ARV писал(а):если вы будете использовать "короткие" переходы rjmp - вы никогда не ошибетесь!

Интересно вот только, а зачем же тогда каждый вектор занимает два слова в памяти, а не одно как у кристаллов с флэшиной не более 8кб ?
Наверно потому, что rjmp не вовсюда может прыгнуть... Эх, а всё так категорично было заявлено...
уважаемый Brutaller! в моем "категоричном" заявлении нет никакой ошибки! можете - не означает должны, не так ли? если вам действительно необходимо использовать далекие переходы - даже в "больших" мегах вы можете использовать короткие: сначала прыгнуть недалеко, а уже оттуда - длинным джампом куда угодно - всего-то 2 такта лишних...
кроме того, используя только короткие джампы вы не будете иметь проблем до тех пор, пока не окажется, что их не хватает для перехода к обработчику - компилятор при этом выдаст ошбику. Вот тогда вы, исправляя ее, измените короткий джамп на длинный. при этом проблем с "непопаданием вектора в требуемый адрес" у вас все равно не будет
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Brutaller писал(а):По поводу максимального юзания символьных имен - согласен.

А вот такого от вас ARV, я не ожидал:
ARV писал(а):если вы будете использовать "короткие" переходы rjmp - вы никогда не ошибетесь!


Интересно вот только, а зачем же тогда каждый вектор занимает два слова в памяти, а не одно как у кристаллов с флэшиной не более 8кб ?
Наверно потому, что rjmp не вовсюда может прыгнуть... Эх, а всё так категорично было заявлено...


Мда, с асмом работоть и работать. Какя разница что 8кб что 256кб? Если rjmp адресует - то туда и прыгнет. Если выше - то сам компилятор даст ошибку.

А мой совет - что rjmp, что jmp рано или поздно заканчиваются.
И тогда на помощь приходит CALL и RCALL. :)) :)) :)) :)) :))
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Сообщение Brutaller »

А никто не задумывался, зачем многие, кто пишет на асме забивают векторы не используемых прерываний инструкцией RETI ?
Кстати IAR это тоже делает. Про GCC не знаю - не смотрел что он там творит.

__Alexander писал(а):Мда, с асмом работоть и работать.


Я то вполне комфортно себя в асме чувствую и понимаю - что делаю.
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Так это логично со стороны случайного (а случаи бывают разные) входа в прерывание. Лучше с него выйти, чем выполнить следующую за ним команду.
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Кстати, IAR это делает при выставленной в опциях галочке. По умолчанию он этого не делает, так что не надо.
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Сообщение Brutaller »

Вот это уже другой разговор. :)

Про IAR согласен, просто я не уточнил.

Кстати, видел интересную тему на одном форуме. Там еще более хитрый прием применяется с использованием специальных заглушек, как раз для отлова таких ситуаций с непреднамеренным входом в прерывание и вытекающих из этого проблем.
Аватара пользователя
Томатный
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт июл 31, 2007 20:32:30
Откуда: Киев, Украина
Контактная информация:

Сообщение Томатный »

Уважаемые Коты, будут идеи по поводу сложения чисел в доп. коде в 24 разрядный регистр(8x3) ???
Ситуация такая. перемножаю числа со знаками командой muls, получаю результат в доп коде в регистрах r1:r0 и после нужно прибавить результат, допустим в регистры r17:r16. Перемножение и сложение в цикле несколько раз с новыми значениями. Нужно определить переполнение r17:r16 и правильно прикрутить ещё один регистр r18. Важен максимально быстрый метод!
голова уже не варит, ничего в голову не приходит(
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Томатный писал(а):голова уже не варит, ничего в голову не приходит(

Сделайте на СИ скомпильте и посмотрите асм листинг. Когда голова не варит это прекрасный метод. Можно и ручками подправить потом.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Ответить

Вернуться в «AVR»