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

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

Сообщение akl »

Абсурд применения прибамбаса с гордым названием "макрос" :)

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

CP R16,R20
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

akl писал(а):CP R16,R20
Да нет, уважаемый akl, сдается мне что bondyara имел ввиду другое. А вот насчет абсурда соглашусь, то люди в одних магических цифрах пишут, чуть не в маш. коде, то пытаются из макросов новый язык программирования создать.
bondyara писал(а):При совпадении получится MOV R20,R20.
Мало того, что бесполезная команда, она еще и искажает значение регистра
Поясните мысль искажения регистра.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

Сообщение bondyara »

Z_h_e писал(а):Поясните мысль искажения регистра.
По крайней мере, в Протеусе операция MOV Rn, Rn портит значение.
А смысл действительно не в сравнении значений регистров, а в проверке передаваемого регистра.
Пишу макрос, работающий с физическими портами ВВ и виртуальными. Виртуальный порт использует свой регистр, например при объявлении порта:
.def VP0_REG = R25
Далее, делаю разные модули (7-сегментные инд., LCD и т. д.) универсальными. При конфигурации можно указать как физический порт, так и виртуальный. В итоге, один и тот же код работает с любым портом (физ. или вирт.)
Чтобы вывести даныне в порт, используется макрос
OUTR PORT, R16
Макрос определяет тип порта, если виртаульный, пихает значение в VP0_REG
MOV VP0_REG, @0
и вызывает функцию записи в порт

Так вот, если регистр совпадет с VP0_REG, будет беда. Можно, конечно, отказаться от использования регистров, занятых вирт. портами. Это будет лучшим решением.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

Когда же вы закопаете Протеус? Макетка рулит.
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

А не секрет зачем нужен вывод на виртуальный LCD? Может проще макросами указать порты, к которым подключен реальный или написать слой абстракции?
Реклама
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

bondyara писал(а):... в Протеусе операция MOV Rn, Rn портит значение.
Афффигеть. :shock:
MOV_AVR.png
(21.54 КБ) 365 скачиваний
http://www.atmel.com/Images/Atmel-0856- ... Manual.pdf
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Кстати из глюков протеуса на avr заметил пока два. Не срабатывало прерывание сравнения , когда таймер в нормальном режиме. Неправильно устанавливаются флаги источника сброса, при записи 1 флаг устанавливается, при записи 0 сбрасывается. Что интересно, второй глюк присутствует и в атмел студио.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 6348
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

akl писал(а):
bondyara писал(а):... в Протеусе операция MOV Rn, Rn портит значение.
Афффигеть. :shock:
MOV_AVR.png
да, дела ... нужно срочно ревизию АВРов делать, мож и остальные полсотни команд что-нибудь где-нибудь портють :))
Изображение
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Проверил нижеследующий код в шпротеусе 7. Что я могу сказать, пока списог багов не пополнился.

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

RESET:  //
ldi R20,0xFF
out DDRB,R20

andi R20,0x55
mov R20,R20

OUT PORTB,R20

rjmp RESET
Добавлено after 2 minutes 55 seconds:
ООО. Совсем забыл написать, извиняюсь.

Афффигеть. :shock:
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Могу добавить пару багов в протеусе
Неправильно работает таймер в режиме fast PWM с переменным TOP = ICR
Не работает АЦП в непрерывном режиме (ADFR / ADATE)
Не работают команды bld / bst
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Нижеследующий код сработал адекватно.

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

RESET:  //
ldi R20,0xFF
out DDRB,R20

andi R20,0x55
mov R20,R20

bst R20,0
bld R20,1

OUT PORTB,R20

rjmp RESET
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Перепроверил, действительно работает. Наверное, баг был где-то в другом месте. Правда, без замены bld + bst на sbrc + ori оно не работало, но копаться во взаимоотношениях протеуса и исходного кода сейчас желания нет.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Ну оно могло глючить в другом МК или в определенной ситуации.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

да хз что там глючило. Тестировал на ATmega8 - конструкция bld rX, 1 + bst rY,6 не заоботала, а sbrc rX, 1 + ori rY, (1<<6) работала. Памяти и скорости они занимают одинаково, так что в недра проблемы лезть не стал.
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

Сообщение bondyara »

dimmer писал(а):Когда же вы закопаете Протеус? Макетка рулит.
Собираю в отладочной. Ну и беспаечная макетка, куда же без нее? Просто иногда быстрее посмотреть в Протеусе, работает или нет, а потом уже...
COKPOWEHEU писал(а):А не секрет зачем нужен вывод на виртуальный LCD? Может проще макросами указать порты, к которым подключен реальный или написать слой абстракции?
LCD вполне реальный. Виртуальный порт для вывода данных. Назначением вирт. порта как раз и является указание какой бит на какую ногу отправлять.
А что Вы подразумеваете под слоем абстракции? По-моему, виртуальный порт и есть абстракция.
Z_h_e писал(а):Проверил нижеследующий код в шпротеусе...
Я и не настаиваю.
У меня не просто Протеус, а Протеус под Wine в Linux :facepalm:
Кстати, под Wine баг - невозможно редактировать код, компилировать. Отладка с готовым obj-файлом работает.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

LCD вполне реальный. Виртуальный порт для вывода данных. Назначением вирт. порта как раз и является указание какой бит на какую ногу отправлять.
Я имел в виду что-то вроде

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

#define LCD_D0 B,0
#define LCD_D1 B,1
#define LCD_D2 B,2
#define LCD_D3 B,3
#define LCD_RS B,4
#define LCD_E B,5
а дальше пусть компилятор подставляет в код "драйвера" сразу нужные порты. Примерно так (только на Си) работает мой самописный драйвер. При желании, те же макросы можно использовать в gnu-assembler, там с макросами гораздо лучше, чем avr-assembler.
Виртуальный порт мне казался полноценной абстракцией - выбор куда же значение будет записано на самом деле осуществляется на этапе выполнения и может быть изменен во время работы.
У меня не просто Протеус, а Протеус под Wine в Linux :facepalm:
Кстати, под Wine баг - невозможно редактировать код, компилировать. Отладка с готовым obj-файлом работает.
Аналогично. Впрочем, завести встроенный редактор кода мне не удалось и под winXP, win7, да не больно-то он и нужен.
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

Сообщение bondyara »

Ну в Винде я быстро перешел на написание кода в Протеусе. Он жрет меньше ресурсов, чем 7-я Студия, да и отладка под боком.
В Linux остановился на Geany + AVRA.
COKPOWEHEU писал(а):выбор куда же значение будет записано на самом деле осуществляется на этапе выполнения и может быть изменен во время работы.
Где это используется, например? Пока только изучаю (время от времени). По мне, схема устройства определяет куда и что. Так что пока вирт. порты создаю на этапе компиляции макросами, определениями, добавляю необходимые функции по условиям препроцессора.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Где в контроллерах такое может пригодиться не знаю. Но в таком случае зачем копирование регистра в произвольный?
Мне хватает текстового редактора (kwrite), gcc, make, а отладка в протеусе.
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Z_h_e писал(а):Кстати из глюков протеуса на avr заметил пока два... Неправильно устанавливаются флаги источника сброса, при записи 1 флаг устанавливается, при записи 0 сбрасывается. Что интересно, второй глюк присутствует и в атмел студио.
Это не глюк. Так и должно быть.
RESET_FLAG.PNG
(79.97 КБ) 483 скачивания
Вымогатель припоя
Аватара пользователя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

Сообщение strengerst »

Спасибо попробую
Ответить

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