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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Люблю делать программы из вызываемых модулей. То есть основная прога отдельная и находится в начале памяти и в основном состоит из команд LDI, CPI, RCALL, RJMP. Причём последний код, приведённый выше (Модуль опроса клавы) работает как СИшная функция. То есть вызывается и
по окончанию возвращает какое-то значение через выделенный регистр. Есть у меня п\программы,
которые пишут в EEPROM, только они ещё умеют принимать значения(типа аргументов в СИ) и
что-то возвращать. Если придерживаться какого-нибудь своего стандарта в программировании,
то можно наштамповать для себя кучу макросов и пользоваться ими. Впрочем программисты так и делают. Программы для МК я пишу только на АСМе, для компа только на C++.
I am DX168B and this is my favourite forum on internet!
HF_Cat
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Ср июл 28, 2010 20:29:22
Откуда: Ukraine

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

Сообщение HF_Cat »

Есть проблемка: была прога, нормально работала в железе на ATtiny2313, появилась необходимость портировать или типа того эту прогу на ATmega168, но почему-то не работают нормально переходы по прерываниям. Прерывания и Timer0_OVF0, и Timer0_CompA срабатывают, но переходит он (Студио) на обработку других прерываний, хотя список и порядок обработчиков прерываний я списывал из даташита ATmega168.
Прикрепляю файл с частью программы, где есть инициализация, гляньте плиз в чём мог ошибится.
Вложения
program_for_tests_2.asm
(15.48 КБ) 361 скачивание
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Здравствуйте. Замените RJMP на JMP в векторах, как показано на стр. 62 DS.
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

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

Сообщение Pooher »

Внимательно посмотрите ДШ.
Из ДШ:

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

Address Labels Code Comments
0x0000 jmp RESET ; Reset Handler
0x0002 jmp EXT_INT0 ; IRQ0 Handler
0x0004 jmp EXT_INT1 ; IRQ1 Handler
0x0006 jmp PCINT0 ; PCINT0 Handler
0x0008 jmp PCINT1 ; PCINT1 Handler
0x000A jmp PCINT2 ; PCINT2 Handler
........................................................


Т.е. Вам надо так (а можно и не так :) )

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

rjmp Reset                     ; обработка прерывания по сбросу
nop
rjmp INT_0                     ; IRQ0 - запрос внешнего прерывания 0
nop
rjmp INT_1                     ; IRQ1 - запрос внешнего прерывания 1
nop
rjmp PinChangeINT0             ; прерывание изменения пина 0
nop
rjmp PinChangeINT1             ; прерывание изменения пина 1 
nop
rjmp PinChangeINT2             ; прерывание изменения пина 2
nop
........................................................
Последний раз редактировалось Pooher Вт авг 10, 2010 18:52:38, всего редактировалось 1 раз.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

akl писал(а):Здравствуйте. Замените RJMP на JMP в векторах, как показано на стр. 62 DS.
господи!!! ну сколько раз повторять: давайте ПРАВИЛЬНЫЕ советы, а не те, которые работают у вас!!! если бы с самого начала во всех обучалках было написано про то, как ПРАВИЛЬНО определять в ассемблере вектора прерываний, не было бы этой и многих других проблем!!!

директива .ORG должна задавать адрес вектора, а сам векто может быть хоть JMP, хоть RJMP - это уже никак не будет определяться НОМЕРОМ вектора, а только особенностью контроллера и дальностью перехода!!!

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

Мой уютный бложик... заходите!
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

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

Сообщение Pooher »

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

Что это ужос, я конечно согласен, но ведь эти "заразы" в даташитах так пишут :))
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
HF_Cat
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Ср июл 28, 2010 20:29:22
Откуда: Ukraine

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

Сообщение HF_Cat »

Большое спасибо! :beer: Три дня потраченных на выяснение не вернёшь, но зато нашлась правда :)) Сглупил я, не посмотрел, что нужно прыгать аж на 16КБ памяти а в 62-ую страницу не вглядывался :cry:
ARV, не ругайтесь, с этими ORG-ами код проги растягивается на простынь, так что так - лучше :)))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

HF_Cat писал(а):с этими ORG-ами код проги растягивается на простынь, так что так - лучше :)))
вы наверное спутали ORG-и с ОГИЯМИ :))) какие простыни?! наоборот, вы задаете только те вектора, которые вам нужны, а их, как правило. от одного до пяти, а с таблицей ваших джампов вы вынуждены таскать за собой таблицу из 10 или более джампов, при этом они напрасно занимают память, если не используются!!!

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

Мой уютный бложик... заходите!
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Вот как я поступаю с векторами прерываний:

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

.cseg
.org 0
;----------
rjmp          RESET
reti;rjmp          EXT_INT0
reti;rjmp          EXT_INT1
reti;rjmp          TIM_COMP1A
reti;rjmp          TIM_COMP1B
rjmp          TIM_OVF1
reti;rjmp          TIM_OVF0
reti;rjmp          USI_STRT
reti;rjmp          USI_OVF
rjmp          EEP_RDY
reti;rjmp          AN_COMPAR
reti;rjmp          ADC_COMPLETE
;----------
EEP_RDY:
..........
.........
reti
;----------
TIM_OVF1:
.............
.........
reti
;----------
RESET:
...........
........
......

То есть вместо вектора пишу RETI сразу
и после этой команды пишу вектор в виде комментария в той же строке.
Если вдруг мне потребовалось какое-то прерывание,
то я затираю команду reti и точку с запятой и остаётся там только нормальный вектор.
Потом ниже, после векторов пишу п\программу обработчика этого прерывания
с командой reti в конце, то есть как положено.
Почему я так делаю? То есть вписываю везде reti, а не с директивой .org , как писАл ARV?
А чтобы случайно из-за фазы луны :))) , погоды на улице, либо моего
настроения, или если вдруг Андрей_Р познакомится и предложит дружбу Лизе :))) ,
не сработало какое-нибудь ненужное прерывание на пустую ячейку памяти и МК не ушёл в сброс.
А вдруг в этот момент выполнялась какая-то важная процедура?
А так сразу же напорится на RETI и без ущерба продолжит дальше.
И памяти меньше занимает, чем обычный метод с нагромождением пустых
п\программ обработчиков ненужных прерываний.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Хм... У меня проблем не наблюдалось. Делаю так и всё отлично работает. Что-что, но с прерываниями проблем не имел. Ладно, с массивами в ПЗУ баги у меня были. :)))
Но с прерываниями проблем никогда небыло. Мой пример для простых тинек,
а не для навороченных МЕГ.
Ну, как я понял - команда JMP занимает больше места в памяти чем RJMP, + адрес перехода, который уже не двух байтный(1 байт - 8 бит), а более.
Тогда вывод - что каждый вектор у таких МК идёт через 1 адрес, то есть 0, 2, 4, 6 и так
далее. Я правильно понял?
Если правильно понял, то тогда естественно, что мой вариант не прокатит например в МЕГАх.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

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

Сообщение Pooher »

в МЕГАх.

Не во всех :)))
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Ну у тех, у которых памяти побольше. Если памяти больше, значит и адрес длиннее. :)
Вот кусок из даташита на ATtiny26:

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

Addresses are:
Address Labels Code Comments
$000 rjmp RESET ; Reset handler
$001 rjmp EXT_INT0 ; IRQ0 handler
$002 rjmp PIN_CHANGE ; Pin change handler
$003 rjmp TIM1_CMP1A ; Timer1 compare match 1A
$004 rjmp TIM1_CMP1B ; Timer1 compare match 1B
$005 rjmp TIM1_OVF ; Timer1 overflow handler
$006 rjmp TIM0_OVF ; Timer0 overflow handler
$007 rjmp USI_STRT ; USI Start handler
$008 rjmp USI_OVF ; USI Overflow handler
$009 rjmp EE_RDY ; EEPROM Ready handler
$00A rjmp ANA_COMP ; Analog Comparator handler
$00B rjmp ADC ; ADC Conversion Handler

То есть каждый вектор тут умещается в один адрес.
Памяти у этого МК - 2к. Ну а где памяти поболее, то там
один вектор лезет в 2 адреса. Ну ещё зависит и от типа МК.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
day0l
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт май 14, 2010 15:48:35

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

Сообщение day0l »

опять у меня проблемы при работе с памятью, поправьте пожалуйста если не так... собственно сам вопрос: при извлечении байтов из памяти в переменную temp попадают нули, что я делаю не так?(если вместо перечислении элементов массива обьявить только размер массива и потом их принудительно засовывать, то всё нормально...)
вот код:

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

....
.dseg
array:
   .db 0x63, 0x6, 0x91, 0x79, 0x102, 0x109

.cseg
......
   ldi ZH, high(array)
   ldi ZL, low(array)
   
   ld temp, Z+
   ld temp, Z+
......
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

может temp в прерываниях меняется, а не при считывании данных из SRAM? и еще что за данные 0x109??? должно быть не больше 0xFF.
Ставим плюсы: )
Аватара пользователя
day0l
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт май 14, 2010 15:48:35

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

Сообщение day0l »

может temp в прерываниях меняется, а не при считывании данных из SRAM?

никакие прерывания не оспользуються!

и еще что за данные 0x109??? должно быть не больше 0xFF

это я перепутал, но при исправлении сёравно не помогло....
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Извлечение данных из памяти программ делается командой LPM.

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

....
.dseg
array:
   .db 0x63, 0x6, 0x91, 0x79, 0x102, 0x109

.cseg
......
   ldi ZH, high(array*2)
   ldi ZL, low(array*2)
   
   LPM   R16,Z+
   LPM   R17,Z
......
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Господин akl. А что ищет Ваш массив в разделе .dseg (RAM) ?
Он ведь должен быть в ПЗУ. Перенесите его куда-нибудь ниже директивы .cseg
I am DX168B and this is my favourite forum on internet!
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Упс. Виноват.
Ответить

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