Обсуждаем контроллеры компании Atmel.
Ответить

Пн апр 28, 2008 16:59:30

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

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

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

если поставлю ^-M103C то прога работает нормально а вот с RCALL начинаются проблемы
кварц использую на 8мГц
что не так помогите

Пн апр 28, 2008 18:34:29

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

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

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

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

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

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

Пн апр 28, 2008 18:59:57

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


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

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

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

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

По поводу правильности оформления таблицы тоже можно поспорить. Для меня удобнее открыть даташит на кокретный контроллер, перейти в соответствующий раздел, скопировать список(пример), за ним идут пустышки-метки ведущие на команду RETI. В любой момент понадобившееся прерывание выбираем в пару легких движений. К тому же еще и безопаснее кое в чем. Пример в аттаче.
Вложения
examp.asm
Пример оформления таблицы векторов ATtiny2313
(1.61 KiB) Скачиваний: 890

Пн апр 28, 2008 19:32:32

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

Пн апр 28, 2008 19:44:25

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


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

А что касается ADC, то да, это ведь команда, асм будет ругаться если как метку попытаться заюзать. Лучше сразу написать Int_ADC.
Я так вообще все метки относящиеся к прерываниям(кроме Reset) начинаю с Int_ , чтоб сразу было видно, что это обработчик прерывания.

Пн апр 28, 2008 20:31:22

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

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

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

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

подумайте над сказанным и не ошибайтесь впредь!

Пн апр 28, 2008 20:35:07

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

Пн апр 28, 2008 20:48:04

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

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

Пн апр 28, 2008 20:53:19

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


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

Вот ведь Ассемблер для AVR руководство на русском. (линк я удалил так как "верхний человек форума" мне написал
Ваше представление об образовательном процессе, которое идет в разрез с философией и правилами данного Форума.
) - читайте да делайте правильно ...
Последний раз редактировалось tych Ср окт 29, 2008 19:29:20, всего редактировалось 2 раз(а).

Пн апр 28, 2008 21:09:35

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

Пн апр 28, 2008 22:16:40

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

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

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

оки :wink:

Пн апр 28, 2008 22:30:37

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

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


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

Вт апр 29, 2008 08:05:11

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

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

Вс авг 17, 2008 22:48:47

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

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


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


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

А мой совет - что rjmp, что jmp рано или поздно заканчиваются.
И тогда на помощь приходит CALL и RCALL. :)) :)) :)) :)) :))

Вс авг 17, 2008 23:41:08

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

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


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

Вс авг 17, 2008 23:59:11

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

Пн авг 18, 2008 00:01:25

Кстати, IAR это делает при выставленной в опциях галочке. По умолчанию он этого не делает, так что не надо.

Пн авг 18, 2008 18:12:39

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

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

Кстати, видел интересную тему на одном форуме. Там еще более хитрый прием применяется с использованием специальных заглушек, как раз для отлова таких ситуаций с непреднамеренным входом в прерывание и вытекающих из этого проблем.

Вт авг 19, 2008 23:39:16

Уважаемые Коты, будут идеи по поводу сложения чисел в доп. коде в 24 разрядный регистр(8x3) ???
Ситуация такая. перемножаю числа со знаками командой muls, получаю результат в доп коде в регистрах r1:r0 и после нужно прибавить результат, допустим в регистры r17:r16. Перемножение и сложение в цикле несколько раз с новыми значениями. Нужно определить переполнение r17:r16 и правильно прикрутить ещё один регистр r18. Важен максимально быстрый метод!
голова уже не варит, ничего в голову не приходит(

Ср авг 20, 2008 07:54:28

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

Сделайте на СИ скомпильте и посмотрите асм листинг. Когда голова не варит это прекрасный метод. Можно и ручками подправить потом.
Ответить