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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Dessp писал(а):Всем привет. Такой вот вопрос.

Пишу программу на асемблере для атмега88
так работает
ldi temp,0b00000001
out EIMSK,temp

а так нет

ldi temp,0b00000001
sts EIMSK,temp

почему?


Матчасть мал-мал учить однако надо... :tea:
А также команды ассемблера и их выполнение...
Команды IN\OUT работают с адресным пространством УВВ, а ST(STD/STS)\LD(LDD/LDS) c адресным пространством ОЗУ.
Одна из особенностей AVR - обращение к регистрам специальных функций одновременно как к области УВВ и как к ячейкам ОЗУ - частенько весьма долго с толку сбивает (у XMEGA еще поинтереснее будет).
Если использовать заранее установленные имена регистров ( в данном случае m88def.inc ), то предпочтение отдается командам IN\OUT. Если потребуется к заранее объявленному регистру спецфункций обратиться как к ячейке памяти - то для tiny/mega к имени регистра прийдется добавить 0х20, поскольку регистры общего назначения также являются частью адресного пространства ОЗУ ( STS EIMSK+0x20,temp ).
Хоша, с моей подушки, поскольку у ATmega88 регистр EIMSK находится в младшей группе адресов (от 0 до 31 /0-0x1F/) такая операция выглядит корректнее как:
sbi EIMSK,INT0
... :roll:
Там еще есть много чего зловредного - посему ежли решено с ассемблером работать - много-много читать и учить надо... желательно самому...
Или вот шпора для разнообразия...
viewtopic.php?f=20&t=68985
:beer:
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

BOB51 писал(а):Команды IN\OUT работают с адресным пространством УВВ, а ST(STD/STS)\LD(LDD/LDS) c адресным пространством ОЗУ.

Хотя согласитесь, разработчики могли бы допилить компилятор чтобы правильно расставлял адреса РВВ для IN/OUT и ST/LD.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

Еще одна причина перейти на Си - там об этом думать не надо.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Еще одна причина перейти на Си - там об этом думать не надо.

Хотя согласитесь, разработчики могли бы допилить компилятор чтобы правильно расставлял адреса РВВ для IN/OUT и ST/LD
;

А мы чем хуже? :)))

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

***************************************
;-             
;***************************************
.macro   inr
   .if ( @1 < 0x60 )
   in   @0,@1
   .else
   lds   @0,@1
   .endif
.endm
;***************************************
;-             
;***************************************
.macro   outr
   .if ( @0 < 0x60 )
   out   @0,@1
   .else
   sts   @0,@1
   .endif
.endm
;***************************************
;-             
;***************************************
.macro   outi
   ldi   CopySram,@1
   .if ( @0 < 0x60 )
   out   @0,CopySram
   .else
   sts   @0,CopySram
   .endif
.endm
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Gudd-Head писал(а):
BOB51 писал(а):Команды IN\OUT работают с адресным пространством УВВ, а ST(STD/STS)\LD(LDD/LDS) c адресным пространством ОЗУ.

Хотя согласитесь, разработчики могли бы допилить компилятор чтобы правильно расставлял адреса РВВ для IN/OUT и ST/LD.


Обычная история для попытки "изобрести новенькое" - гибрид базового ядра Z80 и дополнительной периферии от mcs51 +"ограниченный набор команд" с фиксированной длиной команды для создания лицензионно-чистого продукта... :cry:
Вобщем-то съедобно... Но не лучший вариант.
А употреблять сей продукт можно и с макросами, и с прочими специями - по вкусу (исходя из опыта потребления). 8)
Весьма неплохо еще и разнообразить меню (асм для avr, pic & intel mcs51 + Z80) - частенько хорошие решения находятся на стыках идеологий. :hunger:
:beer:
Реклама
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

ILYAUL писал(а):А мы чем хуже? :)))


Хуже тем, что в случае необходимости битовой операции все равно думать придется, какую команду или макрос применить. Хотя можно написать и более сложный макрос. В пределе, можно самому написать и компилятор Си.
Реклама
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Думать. Думать в любом случае надо , независимо от языка.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Леонид Иванович писал(а):Еще одна причина перейти на Си - там об этом думать не надо.
Послушал вас годик назад viewtopic.php?f=20&t=5931&p=1338194&hilit=%D0%BF%D0%BB%D1%8E%D0%BD%D1%83%D1%82%D1%8C#p1338194 ... теперь живу не тужу...

Правда иногда такие раскручивания ситуаций приходилось делать, что слабонервный бы не выдержал..... Но зато если преодолеть психологический барьер, то потом и море поколено....
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

:)))
Сиишникам вроде сюдыть:
viewtopic.php?f=57&t=5560
:sleep:
Аватара пользователя
BlYur
Открыл глаза
Сообщения: 52
Зарегистрирован: Пн май 27, 2013 17:02:32

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

Сообщение BlYur »

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

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

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

Команда EOR. Загрузить в другой РОН маску и сделать искл. ИЛИ.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
forfrends
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина
Контактная информация:

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

Сообщение forfrends »

Всем добрый день!
Пытаюсь сейчас освоить Ассемблер. Вот ковыряю АЦП, что-то получается, а что-то нет.
Нужно сделать сравнение значения АЦП с заданными значениями, но у меня не получается. Точнее я не знаю как сделать сравнение такой конструкции:

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

 if (read_adc(0)>63) {key=1;}  //  (если... то... выполнить Действие 1)
 else if (read_adc(0)>127){key=2; }  //  (если... то... выполнить Действие 2)
 else if (read_adc(0)>191){key=3; }  //  (если... то... выполнить Действие 3)
 else{key=0;}

Все дело в том что значение АЦП (использую только старший байт) у меня хранится в РОН в двуичном виде в виде 0b00000000.
Как это значение сравнить с 63 (0b00111111) или с 127 (0b01111111) не имею представления.
И что бы в зависимости от того какое значение выпадает то делать определенное действие.
Можете помочь? Приведите пример в Ассемблере
Сделать своими руками всегда интересней чем просто купить и пользоваться
Аватара пользователя
1essor1
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Вс дек 09, 2012 12:14:44

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

Сообщение 1essor1 »

Вот что можно сделать, если я правильно вас понял :


CPI ADC,67 ; ADC - это регистр с данными АЦП
;а дальше могут быть различные условия
BREQ action1; если равно
;или
BRNE action1; если неравно
;или
BRSH action1; больше или равно
;или
BRLO action1; меньше

;тут еще какой-то код


action1:
NOP;куча полезного кода
NOP
NOP

Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

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

И еще одна мелочь - делать if (read_adc(0)>63) как минимум самонадеянно, ведь каждая такая последующая проверка будет давать РАЗНЫЕ значения, и вложенные IF-ы с такой проверкой могут повести себя крайне непредсказуемо. Сначала нужно прочитать значение АЦП в переменную, а только потом делай вложенные проверки - будет гарантия что содержимое переменной точно не изменится в течении всех вложенных проверок.
Челюскин
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

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

Сообщение Челюскин »

Здравствуйте, Котаны). Помогите с вопросом по USART на Tiny2313. Вопрос - можно ли такой код:

m1:
in r16, UCSRA; считываем регистр состояния USART
bst r16, RXC; запоминаем бит приема в флаг Т
brtc m1; переход, если не приняли

заменить таким:

m1:
bst UCSRA, RXC;
brtc m1;
Лень - двигатель прогресса!
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Не получится. BST работает только с регистрами.
Челюскин
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

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

Сообщение Челюскин »

Здравствуйте, РадиоКоты. Подскажите пожалуйста вот в чем: Как реализовать управляемую переменную задержку по таймеру1 (Tyni2313)? Чтобы, допустим, на РВ7 диод мигает 1 раз в секунду, на PD(ну допустим PD0 и PD1) кнопки "+" и "-" (увел. и уменьш. скорости мигания). пауза меняется дискретно - шаг 0.1 сек. В какую сторону думать-то? И как вообще такие вещи реализуются?
Лень - двигатель прогресса!
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Таймер настраивается (для примера принят клок 8МГц) на счет с прескейлером 256 в режиме CTC до 31250 (1 сек); компаратор B сравнение с 3125 (0.1 сек). Меняя число компаратора B с помощью кнопок будет меняться и пауза. Каждый раз при сравнении B в его регистр заносится увеличенное на 3125 число.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Настроить таймер в режим CTC - тогда он считать будет до указанного в TCCRxA регистре значения. Меняешь его - меняется скорость переполнения, т.е. период импульсов. А чтобы светодиод мигал - настраиваешь аппаратный выход таймера в режим "инверсии" на каждое событие по сравнению, или аппаратно в прерывании инвертируешь нужный пин.

Основная сложность здесь - обеспечить таймеру на входе нужную частоту чтобы достичь на выходе частот поряядка 1Гц, предделитель у него ограниченный - до 1024 вроде бы можно поделить тактовую частоту, чтобы получить период импульсов на выходе максимум 1Гц - надо загрузить в регистр значение 255 и использовать кварц на 510кГц.

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

А еще можно использовать технологию применяемую для цифрового синтеза частоты, его преимущества - возможность очень точно установить необходимую частоту.
Представляет собой метод обычный сумматор - который по такту складывает собственный выход и число подаваемое на вход. Что у нас получается? чем больше подаем число на вход - тем быстрее сумматор переполняется! Именно сигнал его переполнения и служит выходом нужной частоты.
Так же скорость переполнения зависит от частоты с которой производится суммирование. Достаточно просто организовать такой алгоритм на основе 8-битного сумматора.

Простой расчет: если запихнуть такой алгоритм в прерывание от таймера с периодом 1мс, то подав на вход число "1" получим переполнение каждые 256 тактов - т.е. 256мс. подав туда число 255 получим переполнение каждые 2 такта - 2мс.
Ответить

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