Страница 47 из 400

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

Добавлено: Ср июл 28, 2010 20:02:14
DX168B
Люблю делать программы из вызываемых модулей. То есть основная прога отдельная и находится в начале памяти и в основном состоит из команд LDI, CPI, RCALL, RJMP. Причём последний код, приведённый выше (Модуль опроса клавы) работает как СИшная функция. То есть вызывается и
по окончанию возвращает какое-то значение через выделенный регистр. Есть у меня п\программы,
которые пишут в EEPROM, только они ещё умеют принимать значения(типа аргументов в СИ) и
что-то возвращать. Если придерживаться какого-нибудь своего стандарта в программировании,
то можно наштамповать для себя кучу макросов и пользоваться ими. Впрочем программисты так и делают. Программы для МК я пишу только на АСМе, для компа только на C++.

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

Добавлено: Вт авг 10, 2010 16:48:43
HF_Cat
Есть проблемка: была прога, нормально работала в железе на ATtiny2313, появилась необходимость портировать или типа того эту прогу на ATmega168, но почему-то не работают нормально переходы по прерываниям. Прерывания и Timer0_OVF0, и Timer0_CompA срабатывают, но переходит он (Студио) на обработку других прерываний, хотя список и порядок обработчиков прерываний я списывал из даташита ATmega168.
Прикрепляю файл с частью программы, где есть инициализация, гляньте плиз в чём мог ошибится.

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

Добавлено: Вт авг 10, 2010 17:03:03
akl
Здравствуйте. Замените RJMP на JMP в векторах, как показано на стр. 62 DS.

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

Добавлено: Вт авг 10, 2010 18:49:02
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
....................

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

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

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

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

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

Добавлено: Вт авг 10, 2010 18:57:01
Pooher
написал же какой-то недоучка книжку, где показал таблицу векторов в виде последовательных никак не помеченных джампов - и пошло-поехало... ужос...
Что это ужос, я конечно согласен, но ведь эти "заразы" в даташитах так пишут :))

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

Добавлено: Вт авг 10, 2010 19:18:02
HF_Cat
Большое спасибо! :beer: Три дня потраченных на выяснение не вернёшь, но зато нашлась правда :)) Сглупил я, не посмотрел, что нужно прыгать аж на 16КБ памяти а в 62-ую страницу не вглядывался :cry:
ARV, не ругайтесь, с этими ORG-ами код проги растягивается на простынь, так что так - лучше :)))

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

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

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

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

Добавлено: Ср авг 11, 2010 16:24:26
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 и без ущерба продолжит дальше.
И памяти меньше занимает, чем обычный метод с нагромождением пустых
п\программ обработчиков ненужных прерываний.

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

Добавлено: Ср авг 11, 2010 19:10:57
GP1
DX168B
опять же, если вектора 2х словные, ты наступишь на те же грабли что и HF_Cat
:)))

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

Добавлено: Ср авг 11, 2010 19:36:50
ARV
DX168B писал(а):Вот как я поступаю с векторами прерываний
мда... видно, научить хорошему у меня не получится... придется учить плохому :twisted:

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

Добавлено: Ср авг 11, 2010 20:47:11
DX168B
Хм... У меня проблем не наблюдалось. Делаю так и всё отлично работает. Что-что, но с прерываниями проблем не имел. Ладно, с массивами в ПЗУ баги у меня были. :)))
Но с прерываниями проблем никогда небыло. Мой пример для простых тинек,
а не для навороченных МЕГ.
Ну, как я понял - команда JMP занимает больше места в памяти чем RJMP, + адрес перехода, который уже не двух байтный(1 байт - 8 бит), а более.
Тогда вывод - что каждый вектор у таких МК идёт через 1 адрес, то есть 0, 2, 4, 6 и так
далее. Я правильно понял?
Если правильно понял, то тогда естественно, что мой вариант не прокатит например в МЕГАх.

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

Добавлено: Ср авг 11, 2010 21:10:24
Pooher
в МЕГАх.
Не во всех :)))

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

Добавлено: Ср авг 11, 2010 21:14:06
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 адреса. Ну ещё зависит и от типа МК.

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

Добавлено: Пн авг 16, 2010 21:27:05
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+
......

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

Добавлено: Вт авг 17, 2010 01:00:24
ibiza11
может temp в прерываниях меняется, а не при считывании данных из SRAM? и еще что за данные 0x109??? должно быть не больше 0xFF.

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

Добавлено: Вт авг 17, 2010 01:07:00
day0l
может temp в прерываниях меняется, а не при считывании данных из SRAM?
никакие прерывания не оспользуються!
и еще что за данные 0x109??? должно быть не больше 0xFF
это я перепутал, но при исправлении сёравно не помогло....

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

Добавлено: Вт авг 17, 2010 02:47:31
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
......

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

Добавлено: Вт авг 17, 2010 02:53:12
DX168B
Господин akl. А что ищет Ваш массив в разделе .dseg (RAM) ?
Он ведь должен быть в ПЗУ. Перенесите его куда-нибудь ниже директивы .cseg

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

Добавлено: Вт авг 17, 2010 03:02:19
akl
Упс. Виноват.