Ассемблер (ASM) для AVR в вопросах и ответах
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Люблю делать программы из вызываемых модулей. То есть основная прога отдельная и находится в начале памяти и в основном состоит из команд LDI, CPI, RCALL, RJMP. Причём последний код, приведённый выше (Модуль опроса клавы) работает как СИшная функция. То есть вызывается и
по окончанию возвращает какое-то значение через выделенный регистр. Есть у меня п\программы,
которые пишут в EEPROM, только они ещё умеют принимать значения(типа аргументов в СИ) и
что-то возвращать. Если придерживаться какого-нибудь своего стандарта в программировании,
то можно наштамповать для себя кучу макросов и пользоваться ими. Впрочем программисты так и делают. Программы для МК я пишу только на АСМе, для компа только на C++.
по окончанию возвращает какое-то значение через выделенный регистр. Есть у меня п\программы,
которые пишут в 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 в вопросах и ответах
Есть проблемка: была прога, нормально работала в железе на ATtiny2313, появилась необходимость портировать или типа того эту прогу на ATmega168, но почему-то не работают нормально переходы по прерываниям. Прерывания и Timer0_OVF0, и Timer0_CompA срабатывают, но переходит он (Студио) на обработку других прерываний, хотя список и порядок обработчиков прерываний я списывал из даташита ATmega168.
Прикрепляю файл с частью программы, где есть инициализация, гляньте плиз в чём мог ошибится.
Прикрепляю файл с частью программы, где есть инициализация, гляньте плиз в чём мог ошибится.
- Вложения
-
- program_for_tests_2.asm
- (15.48 КБ) 361 скачивание
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Здравствуйте. Замените RJMP на JMP в векторах, как показано на стр. 62 DS.
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Внимательно посмотрите ДШ.
Из ДШ:
Т.е. Вам надо так (а можно и не так
)
Из ДШ:
Код: Выделить всё
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 в вопросах и ответах
господи!!! ну сколько раз повторять: давайте ПРАВИЛЬНЫЕ советы, а не те, которые работают у вас!!! если бы с самого начала во всех обучалках было написано про то, как ПРАВИЛЬНО определять в ассемблере вектора прерываний, не было бы этой и многих других проблем!!!akl писал(а):Здравствуйте. Замените RJMP на JMP в векторах, как показано на стр. 62 DS.
директива .ORG должна задавать адрес вектора, а сам векто может быть хоть JMP, хоть RJMP - это уже никак не будет определяться НОМЕРОМ вектора, а только особенностью контроллера и дальностью перехода!!!
написал же какой-то недоучка книжку, где показал таблицу векторов в виде последовательных никак не помеченных джампов - и пошло-поехало... ужос...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
написал же какой-то недоучка книжку, где показал таблицу векторов в виде последовательных никак не помеченных джампов - и пошло-поехало... ужос...
Что это ужос, я конечно согласен, но ведь эти "заразы" в даташитах так пишут
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
-
HF_Cat
- Первый раз сказал Мяу!
- Сообщения: 37
- Зарегистрирован: Ср июл 28, 2010 20:29:22
- Откуда: Ukraine
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Большое спасибо!
Три дня потраченных на выяснение не вернёшь, но зато нашлась правда
Сглупил я, не посмотрел, что нужно прыгать аж на 16КБ памяти а в 62-ую страницу не вглядывался
ARV, не ругайтесь, с этими ORG-ами код проги растягивается на простынь, так что так - лучше
Три дня потраченных на выяснение не вернёшь, но зато нашлась правда ARV, не ругайтесь, с этими ORG-ами код проги растягивается на простынь, так что так - лучше
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
вы наверное спутали ORG-и с ОГИЯМИHF_Cat писал(а):с этими ORG-ами код проги растягивается на простынь, так что так - лучше
в общем, дело ваше: удобнее вам чистить зубы через задний проход - я не стану вас напрягать, просто мне удобнее чистить их через рот. и не только мне, как правило
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот как я поступаю с векторами прерываний:
То есть вместо вектора пишу RETI сразу
и после этой команды пишу вектор в виде комментария в той же строке.
Если вдруг мне потребовалось какое-то прерывание,
то я затираю команду reti и точку с запятой и остаётся там только нормальный вектор.
Потом ниже, после векторов пишу п\программу обработчика этого прерывания
с командой reti в конце, то есть как положено.
Почему я так делаю? То есть вписываю везде reti, а не с директивой .org , как писАл ARV?
А чтобы случайно из-за фазы луны
, погоды на улице, либо моего
настроения, или если вдруг Андрей_Р познакомится и предложит дружбу Лизе
,
не сработало какое-нибудь ненужное прерывание на пустую ячейку памяти и МК не ушёл в сброс.
А вдруг в этот момент выполнялась какая-то важная процедура?
А так сразу же напорится на RETI и без ущерба продолжит дальше.
И памяти меньше занимает, чем обычный метод с нагромождением пустых
п\программ обработчиков ненужных прерываний.
Код: Выделить всё
.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 в вопросах и ответах
DX168B
опять же, если вектора 2х словные, ты наступишь на те же грабли что и HF_Cat

опять же, если вектора 2х словные, ты наступишь на те же грабли что и HF_Cat
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
мда... видно, научить хорошему у меня не получится... придется учить плохомуDX168B писал(а):Вот как я поступаю с векторами прерываний
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Хм... У меня проблем не наблюдалось. Делаю так и всё отлично работает. Что-что, но с прерываниями проблем не имел. Ладно, с массивами в ПЗУ баги у меня были.
Но с прерываниями проблем никогда небыло. Мой пример для простых тинек,
а не для навороченных МЕГ.
Ну, как я понял - команда JMP занимает больше места в памяти чем RJMP, + адрес перехода, который уже не двух байтный(1 байт - 8 бит), а более.
Тогда вывод - что каждый вектор у таких МК идёт через 1 адрес, то есть 0, 2, 4, 6 и так
далее. Я правильно понял?
Если правильно понял, то тогда естественно, что мой вариант не прокатит например в МЕГАх.
Но с прерываниями проблем никогда небыло. Мой пример для простых тинек,
а не для навороченных МЕГ.
Ну, как я понял - команда 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 в вопросах и ответах
в МЕГАх.
Не во всех
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну у тех, у которых памяти побольше. Если памяти больше, значит и адрес длиннее. 
Вот кусок из даташита на ATtiny26:
То есть каждый вектор тут умещается в один адрес.
Памяти у этого МК - 2к. Ну а где памяти поболее, то там
один вектор лезет в 2 адреса. Ну ещё зависит и от типа МК.
Вот кусок из даташита на 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!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
опять у меня проблемы при работе с памятью, поправьте пожалуйста если не так... собственно сам вопрос: при извлечении байтов из памяти в переменную 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 в вопросах и ответах
может temp в прерываниях меняется, а не при считывании данных из SRAM? и еще что за данные 0x109??? должно быть не больше 0xFF.
Ставим плюсы: )
Re: Ассемблер (ASM) для AVR в вопросах и ответах
может temp в прерываниях меняется, а не при считывании данных из SRAM?
никакие прерывания не оспользуються!
и еще что за данные 0x109??? должно быть не больше 0xFF
это я перепутал, но при исправлении сёравно не помогло....
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Извлечение данных из памяти программ делается командой 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 в вопросах и ответах
Господин akl. А что ищет Ваш массив в разделе .dseg (RAM) ?
Он ведь должен быть в ПЗУ. Перенесите его куда-нибудь ниже директивы .cseg
Он ведь должен быть в ПЗУ. Перенесите его куда-нибудь ниже директивы .cseg
I am DX168B and this is my favourite forum on internet!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Упс. Виноват.
