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

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

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

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

vit007 писал(а):Здрасть

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

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

Сообщение pyzhman »

vit007 писал(а):Подскажите, как собрать единицу или ноль с порта (in...?)

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

in R16,PINA

или

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

set
sbis PINA,0
clt

В остальном согласен с Gudd-Head.
Docendo discimus
vit007
Встал на лапы
Сообщения: 124
Зарегистрирован: Пн мар 22, 2010 18:07:52

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

Сообщение vit007 »

ldi Temp,0 ;установки
ldi Temp4,0

sei

Inf: rjmp Inf ;бесконечный цикл

EXT_INT0: ;срабатывание первого датчика


ldi Temp,1
sub Temp, Temp4 ;обнуление основного регистра Temp
clr Temp4

reti

EXT_INT1: ;срабатывание второго датчика

inc Temp

cpi Temp,1 ;сравнение, что избежать холостого срабатывания при выходе
breq qwe



ldi Temp5,1 ;установка ед. в порт для нажатия на звонок
out PortD,Temp5

;зАДЕРЖКА***********************
ldi Temp1,0
ldi Temp2,0
ldi Temp3,10

Loop: dec Temp1
brne Loop

dec Temp2
brne Loop

dec Temp3
brne Loop
;*******************************

ldi Temp5,0 ;установка нуля для отжатия кн. звонка
out PortD,Temp5
rjmp r

qwe:
ldi Temp4,1 ;при выходе (второй-первый датчик) записываем ед., чтоб
;обнулить основной регистр Temp


r: clr Temp

reti
----------
замысел:
1. вход (первый-второй датчик)
закидывается ед. в Temp (регистр) - работа первого прерывания
увеличиваем число в Temp на ед. = 2 и выдача на порт ед. для кнопки звонка - работа второго прерывания
2. выход (второй-первый датчик)
во втором прерывание увеличиваем 0 в Temp на ед., сравниваем с ед. = 0, переходим, минуя порты, в конец проги... Там в рег. Temp4 вводим ед. и ждем срабатывание первого прерывания
В первом прерывание в Temp идет ед., а т.к. след операция разности, то отнимаем ед. Temp4...

По идеи моей в Temp должен быть 0, и если выходит еще один чел, то второе прерывание работает по принципу 2...

А у меня только может выйти беззвучно только один чел...
vit007
Встал на лапы
Сообщения: 124
Зарегистрирован: Пн мар 22, 2010 18:07:52

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

Сообщение vit007 »

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

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

Сообщение pyzhman »

Это означает пропустить следующую команду, если бит 0 в порту А установлен. Приобретаем или скачиваем книжку по контроллерам и узнаем назначения всех команд.
Docendo discimus
vit007
Встал на лапы
Сообщения: 124
Зарегистрирован: Пн мар 22, 2010 18:07:52

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

Сообщение vit007 »

pyzh_man писал(а):Приобретаем или скачиваем


есть, но ни черта не понятно - слишком умно написано, подойдет пример использования команды, чтоб можно было скомпилировать и получить результат на железке - вот так что-то и пойму...
Аватара пользователя
qmix
Родился
Сообщения: 16
Зарегистрирован: Ср фев 16, 2011 09:01:31
Откуда: Туапсе

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

Сообщение qmix »

Приветствую уважаемые. Разбираюсь с памятью. То ли лыжи не едут, то ли... В общем очень нужна помощь.
Если пошагово двигаться в AVR Studio, то программа выполняется как надо. Однако ни протеус, ни реальный контроллер не работают как надо.
Идея программы следующая: после включения берутся данные из памяти, запускается шим с этими параметрами. При нажатии одной кнопки, увеличивается процент заполнения ШИМ, записывается в память. При нажатии другой кнопки, процент заполнения уменьшается, записывается в память.

p.s. что то типа плавного регулятора с памятью хочу получить.
Вложения
EEPROM_v1.asm
(2.86 КБ) 233 скачивания
matrix has you/
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Не очень понятно, зачем вы разрешаете/запрещаете прерывания, если у вас код всё равно с нулевого адреса начинается.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

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

Сообщение Rimsky »

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

// чтение порта D
START:
      in temp, PinD         ; чтение порта В
      subi temp,0b00010000   ; вычитаем из ttemp значение 0b00010000 (PD4)
      breq dekrement         ; если нажата переходим на инкремент



Сильно не разбирался, но:

Чтение из порта, точнее с кнопки, следует реализовывать след. образом:

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

         sbis PIND, PIND4
         rjmp  dekrement


этот код избавит Вас от лишнего гемороя с состоянием остальных пинов МК, и тем самым избавит от ошибок.


И сл. замечание, необходимо для кнопки реализовать алгоритм защиты от дребезга, дело в том, что МК работает быстро и Вы просто не в состоянии корректно отследить процесс нажатия и изменения данных в железе (не знаю как работает Ваш шпротеус, (ИМХО ненадо он совсем)).
Аватара пользователя
qmix
Родился
Сообщения: 16
Зарегистрирован: Ср фев 16, 2011 09:01:31
Откуда: Туапсе

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

Сообщение qmix »

Gudd-Head писал(а):Не очень понятно, зачем вы разрешаете/запрещаете прерывания, если у вас код всё равно с нулевого адреса начинается.

На всякий случай. где то читал, что надо. ну у меня в общем не нужно, но вроде и не мешает.

Rimsky писал(а):
Чтение из порта, точнее с кнопки, следует реализовывать след. образом:

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

         sbis PIND, PIND4
         rjmp  dekrement


этот код избавит Вас от лишнего гемороя с состоянием остальных пинов МК, и тем самым избавит от ошибок.
пока накидал первое что пришло в голову. Потом бы все равно до чего нибудь подобного дошел. Спасибо за подсказку. Защита от дребезга у меня там есть временная задержка. А шпротеус, для оперативной отлажки. Не всегда охота МК программировать после каждого мелкого изменения программы.
Но суть не об этом... может я чего не дописал, чтобы память использовалась нормально. может ей там где то какое то особое приглашение надо?
matrix has you/
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

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

Сообщение Rimsky »

накидал в своем стиле (но не проверял!)

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

.include "tn2313def.inc"

.def   ZERO         = R15

.cseg
.org 0


BEGIN:   

   clr   ZERO   

   ldi    r16, 0xFF       ; настройка всего порта B на вывод
        out    DDRB, r16 

   ldi    r16, (1<<PD4)|(1<<PD6)    ; подтягивающие резисторы на PD4, PD6
   out    DDRD, r16

   ldi    r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
   out    DDRD, r16

   ldi    r16, RAMEND      ; Инициализация стека
   out    SPL, r16         


; инициализируем таймер
; Compare Output Mode, Fast PWM Mode
; Clear OC0A on Compare Match, set OC0A at TOP

   ldi    r16, (1<<COM0A1)|(1<<WGM01)|(1<<WGM00)
   out    TCCR0A, r16

   ldi    r16, (1<<CS00)         ; clkI/O/(No prescaling)
   out    TCCR0B, r16

   out    OCR1AH, ZERO
   out    OCR1AL, ZERO



PROG:
; прочитать 1-ю ячейку из EEPROM

   clr   r17
   rcall    EEPROM_read

; запуск шим со значением из temp_eeprom
;значение для сравнения (те данные из eeprom) 

   out    OCR0A, r16


PROG_LOOP:
   sbis   PIND, PIND4
   rjmp   DECREMENT_VALUE
   
   sbis   PIND, PIND6
   rjmp   INCREMENT_VALUE

   rjmp   PROG_LOOP



DECREMENT_VALUE:

;............... Здесь нужна ПП для предотвращения дребезга


   clr   r17
   rcall   EEPROM_read

   dec   r16
   rcall   EEPROM_write
   
   rjmp   PROG   



INCREMENT_VALUE:   

;............... Здесь нужна ПП для предотвращения дребезга

   clr   r17
   rcall   EEPROM_read

   inc   r16
   rcall   EEPROM_write
   
   rjmp   PROG   



EEPROM_write:
; Wait for completion of previous write
   sbic    EECR, EEPE
   rjmp    EEPROM_write

; Set up address (r17) in address register
   out    EEAR, r17

; Write data (r16) to data register
   out    EEDR, r16

; Write logical one to EEMPE
   sbi    EECR, EEMPE

; Start eeprom write by setting EEPE
   sbi    EECR, EEPE
   ret

 
EEPROM_read:
; Wait for completion of previous write
   sbic    EECR, EEPE
   rjmp    EEPROM_read

; Set up address (r17) in address register
   out    EEAR, r17

; Start eeprom read by writing EERE
   sbi    EECR, EERE

; Read data from data register
   in    r16, EEDR
   ret


Аватара пользователя
qmix
Родился
Сообщения: 16
Зарегистрирован: Ср фев 16, 2011 09:01:31
Откуда: Туапсе

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

Сообщение qmix »

Блин.... Вот как это называется? Вчера мозг чуть не взорвался не мог понять почему не работает. Сегодня прихожу, запускаю схему а она работает..... Ну блин вчера та не работала. как такое возможно.....

Rimsky писал(а):

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

ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out DDRD, r16
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16
Вам огромный респект и спасибо есть чего покурить. Прога почти работает вот тока почему то только в одну сторону (проверено в железе). и вместо sbis нужен sbic.
Есть другой вопрос. В тех обучалках по которым я учился небыло ни слова про написания типа: ldi r16, ~((1<<PD4)|(1<<PD6)). Смысл этого в общем та понятен кроме ~ можно в двух словах про все это.
и еще вопрос вместо

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

ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out DDRD, r16
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16

нельзя просто написать?:

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

ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16
matrix has you/
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

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

Сообщение Rimsky »

В тех обучалках по которым я учился небыло ни слова про написания типа: ldi r16, ~((1<<PD4)|(1<<PD6)). Смысл этого в общем та понятен кроме ~ можно в двух словах про все это.
и еще вопрос вместо


В общем так, думаю будет понятно:

ldi r16, ~((1<<PD4)|(1<<PD6)), это равнозначно 0b10101111, знак ~ означает логическое отрицание (НЕ) или проще говоря инвертирование.

ldi r16, (1<<PD4)|(1<<PD6), это равнозначно 0b01010000

В общем случае, это запись константы, только нагляднее и понятнее для понимания. В хидере, это файл tn2313def.inc в вашем случае, есть все определения регистров SFR и ключевых адресов МК, так что и на ассемблере можно писать достаточно понятно.

нельзя просто написать?:
Код:
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16


Можно и так, но в таком случае Вам будет необходимо к каждому пину на котором у Вас кнопки прицепить внешний подтягивающий резистор к + Uпит, чтобы обеспечить лог 1 на входе порта, а при нажатии кнопки, которая замыкает пин на землю на входе пина будет лог. 0, так мы определим, что кнопка нажата или отпущена.

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

sbis   PIND, PIND4
   rjmp   DECREMENT_VALUE
   
   sbis   PIND, PIND6
   rjmp   INCREMENT_VALUE


В этом месте нужен именно sbis, поскольку 1, это состояние, когда кнопка не нажата, и соответственно программа летает в цикле.

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

   out    OCR1AH, ZERO
   out    OCR1AL, ZERO

Вот это sorry, тупо переписал по Вашим мотивом, совершенно не к селу не к городу, лучше вместо этих строчек написать так out TCNT0, ZERO

P.S. Там я в исходнике конечно много намудрил, но думаю Вам полезнее самому разобраться что к чему, главной целью было показать почерк. :)
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

qmix писал(а):кроме ~ можно в двух словах про все это.

Это побитовое НЕ. Или инвертирование. Или функция f(x) = 0xFF - x :)

Rimsky писал(а):знак ~ означает логическое отрицание (НЕ)

Ну вот не надо. Логическое отрицание - это оператор ! 8) :))
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
qmix
Родился
Сообщения: 16
Зарегистрирован: Ср фев 16, 2011 09:01:31
Откуда: Туапсе

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

Сообщение qmix »

C ~ и остальным разобрался. просто и весьма удобно.
Следующие вопросы. На что подтягивают внутренние резисторы? управление идет низким уровнем, значит логично предположить что подтягиваются к высокому уровню.
Просто в моем понимании нажатая кнопка это подача высокого уровня на вход. Поэтому и подумал что sbic. Соответственно подтягивать нужно к низкому уровню. можно их подтянуть к 0?
matrix has you/
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

qmix писал(а):На что подтягивают внутренние резисторы? управление идет низким уровнем, значит логично предположить что подтягиваются к высокому уровню.
Просто в моем понимании нажатая кнопка это подача высокого уровня на вход. Поэтому и подумал что sbic. Соответственно подтягивать нужно к низкому уровню. можно их подтянуть к 0?

Резистором подтягивают вывод контроллера к одному уровню, а кнопку ставить на другой уровень. В МК есть встроенные подтягивающие резисторы к "+" питания — очень удобно, не надо ставить внешние.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
qmix
Родился
Сообщения: 16
Зарегистрирован: Ср фев 16, 2011 09:01:31
Откуда: Туапсе

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

Сообщение qmix »

Очень меня смущало это :

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

ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out DDRD, r16
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16

не мог понять вроде обе строчки настраивают порт
да и не подтягивалось ничего на железе.
может правильно

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

ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16
  ldi    r16, (1<<PD4)|(1<<PD6)    ; подтягивающие резисторы на PD4, PD6
   out    PortD, r16

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

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

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

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

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

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

Сообщение DX168B »

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

ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6.
out PORTD, r16
ldi r16, (0<<PD4)|(0<<PD6) ; настройка порта PD4, PD6 на вход.
out DDRD, r16


Так не пробовали? :))) :))) :)))
I am DX168B and this is my favourite forum on internet!
vit007
Встал на лапы
Сообщения: 124
Зарегистрирован: Пн мар 22, 2010 18:07:52

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

Сообщение vit007 »

ldi Temp,0b01011111
out DDRD,Temp

PROG_LOOP:

sbis PIND, PIND7
rjmp start

sbis PIND, PIND5
rjmp start

rjmp PROG_LOOP

Подскажите, почему при такой комбинации срабатывает только 7 вывод?
менял порядок, менял пины, а работает только последний...
Ответить

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