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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Нормально (будет работать и не изврат ли), если МК будет тупить

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

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

Сообщение DX168B »

Не думаю.
Я сам вообще так извращался:

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

EEP_RDY:
ldi RON2, _TRUE
reti

....................
....................
ldi RON2, _FALSE
EEP_WAIT_LOOP:
cpi RON2, _TRUE
brne EEP_WAIT_LOOP
...............

Сохранять SREG и прочее не пришлось, так как в обработчике этого примера нет
инструкций, задевающих набор флагов ядра.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

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

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

Сообщение DX168B »

Только если коды обработчика прерывания и места в программе не расположены далеко друг от друга.
Если МК поддерживает инструкцию jmp, то тогда можно и так (в случае, если rjmp не тянет).
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

DX168B писал(а):Не думаю.

Проверил в Студии — работает. :) Но в конечном итоге возможно буду тупить, проверяя флаг прерывания.
В защиту данной реализации хочу добавить, что вырвать МК из мёртвого цикла может любое разрешённое прерывание, а не 1 флаг :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Только если коды обработчика прерывания и места в программе не расположены далеко друг от друга.
Если МК поддерживает инструкцию jmp, то тогда можно и так (в случае, если rjmp не тянет).

Тогда компилятор просто не даст использовать rjmp. jmp, кстати, появляется у контроллеров с более 16к флеша.

Gudd-Head, тогда сделай в прерывании так:

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

pop ZH
pop ZL
adiw ZL,1
ijmp

На счет порядка ZH,ZL не уверен :)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

ploop писал(а):сделай в прерывании так

Надо тогда ещё прерывания включить :wink:
ploop писал(а):На счет порядка ZH,ZL не уверен :)

Всё правильно, из стэка вытаскивается сначала старший, потом младший байт. Проверено в Студии.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
sinobi
Встал на лапы
Сообщения: 104
Зарегистрирован: Сб фев 24, 2007 15:49:35
Контактная информация:

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

Сообщение sinobi »

Подскажите поподробнее работу такого макроса

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

Macro Outi                  ; Макрос - запись константы в порт
   Ldi Temp, @1            ; Положить в переменную второй аргумент
   Out @0, Temp            ; Записать его в первый аргумент-порт
   .EndMacro                  ; Конец макроса
          ;****************************************************************************************************
   .Main:                     ; Точка входа
      Outi  SPL, RAMEND         ; Установить вершину стека
      Outi  ACSR,   0x80         ; Отключить аналоговый компаратор
      Outi  MCUCR,  0x24         ; Глубокий сон
      Outi  GIMSK,  0x20         ; Разрешить прерывания по изменению уровня на ножках контроллера
      Outi  TIMSK0, 0x04         ; Разрешить прерывания по регистру сравнения таймера
      Outi  OCR0A,  11         ; Регистр сравнения = 9.6 MHz / 11+1 / 8 = 10 kHz разрешение таймера
      Sbi   PCMSK, RXD         ; Прерывание по RXD
      Sbi   DDRB, REN            ; Разрешить прием
      Cbi   PORTB, REN   
Аватара пользователя
sinobi
Встал на лапы
Сообщения: 104
Зарегистрирован: Сб фев 24, 2007 15:49:35
Контактная информация:

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

Сообщение sinobi »

я так понимаю этот макрос-сокращение команд настройки ?
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

команд настройки ?

Нет таких команд. Есть регистры настройки периферии.

Макрос работает очень просто: @0 заменяется на первый идентификатор, который стоит после имени макроса, @1 - на второй.
Запись

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

Outi  ACSR,   0x80

тупо переводится в

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

Ldi Temp,  0x80    
Out ACSR, Temp
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

я так понимаю этот макрос-сокращение команд настройки ?
... макрос служит для уменьшения размера исходного файла (именно текста, а не кода ) т.е. для лучшей "читаемости", ну и других "удобств"
Аватара пользователя
sinobi
Встал на лапы
Сообщения: 104
Зарегистрирован: Сб фев 24, 2007 15:49:35
Контактная информация:

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

Сообщение sinobi »

Спасибо я так и подумал для сокращения числа команд,то есть для удобства
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

для сокращения числа команд

Число команд не сократится. Сократится только текст.
Вообще, всю программу можно записать в виде макроса. Тогда она будет состоять из одного слова. Но макрос будет в виде программы...
Аватара пользователя
sinobi
Встал на лапы
Сообщения: 104
Зарегистрирован: Сб фев 24, 2007 15:49:35
Контактная информация:

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

Сообщение sinobi »

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

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

Сообщение DX168B »

ploop писал(а):Тогда компилятор просто не даст использовать rjmp. jmp, кстати, появляется у контроллеров с более 16к флеша.

Про это я в курсе. :)
AVR Studio 4 писал(а):error: Relative branch out of range.

Сам со Студией работаю с самого начала. :beer:

А со стеком я развращаюсь только в том случае, если например мне надо вернуться из обработчика прерывания совсем в другое место по какому-нибудь условию.
К примеру: приём по UART маркерного байта, указывающего на конец пакета. После чего, обработать его и изменить поведение программы.
I am DX168B and this is my favourite forum on internet!
hammer2000
Родился
Сообщения: 12
Зарегистрирован: Сб ноя 26, 2011 15:13:05
Откуда: комсомольск-на-амуре

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

Сообщение hammer2000 »

недавно стало интересно и начал заниматься контроллерами разными. Пока на уровне моделирования в протеусе.
Чтоб понятие заиметь, чего и как.
С программами мигания светодиодов вроде как проблем нет никаких.
Но при симулировании более сложных программ -проблемы:(
долго рассказывать... но проблема такая:при попытке компиляции исходника для at90s2313 в протеусе программой avrasm2 выдается ошибка на строчки
ldi Temp,Low(RamEnd) ;загрузить в Темп адрес последней ячейки ОЗУ
out SPL,Temp ;вывести в SPL значение из Temp

типа неизвестные символы...
А без них вроде как нельзя...
Есть у кого мнения по поводу?
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

типа неизвестные символы...

Ну что за вопрос... Посмотрите сами на него со стороны, смогли бы ответить?
Давайте кусок кода с тем местом, где ругается, и естественно полный текст ошибки.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Temp обдефайнен?
Docendo discimus
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Да что угодно может быть. Не указал контроллер - на RAMEND тоже заругается.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

hammer2000
у меня есть предположение, что в def*.inc файле указатель стека обзывается SP а не SPL, встречалось такое, посмотри в указанном файле.

ЗЫ чтобы быть уверенным на 100%, что все инструкции соответствуют твоему камню, самой первой строкой в программе запиши директиву
.device <имя камня>.
и используй названия регистров и констант так, как они записаны в def-файле.
ЗЫЫ сейчас попробовал, и сразу возник вопрос:
а ты вообще *.inc файл подключил?
Чем дальше, тем больше становлюсь занудой...
Изображение
Ответить

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