Здрасть. Без комментариев вряд ли кто-то будет пытаться вникнуть в ваш код.vit007 писал(а):Здрасть
Ассемблер (ASM) для AVR в вопросах и ответах
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
vit007 писал(а):Подскажите, как собрать единицу или ноль с порта (in...?)
Код: Выделить всё
in R16,PINAКод: Выделить всё
set
sbis PINA,0
cltDocendo discimus
Re: Ассемблер (ASM) для AVR в вопросах и ответах
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...
А у меня только может выйти беззвучно только один чел...
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...
А у меня только может выйти беззвучно только один чел...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
pyzh_man это означает
sbis PINA,0 - выделения 0 бита из порта А?
sbis PINA,0 - выделения 0 бита из порта А?
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Это означает пропустить следующую команду, если бит 0 в порту А установлен. Приобретаем или скачиваем книжку по контроллерам и узнаем назначения всех команд.
Docendo discimus
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
есть, но ни черта не понятно - слишком умно написано, подойдет пример использования команды, чтоб можно было скомпилировать и получить результат на железке - вот так что-то и пойму...pyzh_man писал(а):Приобретаем или скачиваем
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Приветствую уважаемые. Разбираюсь с памятью. То ли лыжи не едут, то ли... В общем очень нужна помощь.
Если пошагово двигаться в AVR Studio, то программа выполняется как надо. Однако ни протеус, ни реальный контроллер не работают как надо.
Идея программы следующая: после включения берутся данные из памяти, запускается шим с этими параметрами. При нажатии одной кнопки, увеличивается процент заполнения ШИМ, записывается в память. При нажатии другой кнопки, процент заполнения уменьшается, записывается в память.
p.s. что то типа плавного регулятора с памятью хочу получить.
Если пошагово двигаться в AVR Studio, то программа выполняется как надо. Однако ни протеус, ни реальный контроллер не работают как надо.
Идея программы следующая: после включения берутся данные из памяти, запускается шим с этими параметрами. При нажатии одной кнопки, увеличивается процент заполнения ШИМ, записывается в память. При нажатии другой кнопки, процент заполнения уменьшается, записывается в память.
p.s. что то типа плавного регулятора с памятью хочу получить.
- Вложения
-
- EEPROM_v1.asm
- (2.86 КБ) 239 скачиваний
matrix has you/
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Не очень понятно, зачем вы разрешаете/запрещаете прерывания, если у вас код всё равно с нулевого адреса начинается.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Rimsky
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Вт июн 15, 2010 07:16:42
- Откуда: Иркутск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Сильно не разбирался, но:Код: Выделить всё
// чтение порта D START: in temp, PinD ; чтение порта В subi temp,0b00010000 ; вычитаем из ttemp значение 0b00010000 (PD4) breq dekrement ; если нажата переходим на инкремент
Чтение из порта, точнее с кнопки, следует реализовывать след. образом:
Код: Выделить всё
sbis PIND, PIND4
rjmp dekrement
И сл. замечание, необходимо для кнопки реализовать алгоритм защиты от дребезга, дело в том, что МК работает быстро и Вы просто не в состоянии корректно отследить процесс нажатия и изменения данных в железе (не знаю как работает Ваш шпротеус, (ИМХО ненадо он совсем)).
Re: Ассемблер (ASM) для AVR в вопросах и ответах
На всякий случай. где то читал, что надо. ну у меня в общем не нужно, но вроде и не мешает.Gudd-Head писал(а):Не очень понятно, зачем вы разрешаете/запрещаете прерывания, если у вас код всё равно с нулевого адреса начинается.
пока накидал первое что пришло в голову. Потом бы все равно до чего нибудь подобного дошел. Спасибо за подсказку. Защита от дребезга у меня там есть временная задержка. А шпротеус, для оперативной отлажки. Не всегда охота МК программировать после каждого мелкого изменения программы.Rimsky писал(а):
Чтение из порта, точнее с кнопки, следует реализовывать след. образом:этот код избавит Вас от лишнего гемороя с состоянием остальных пинов МК, и тем самым избавит от ошибок.Код: Выделить всё
sbis PIND, PIND4 rjmp dekrement
Но суть не об этом... может я чего не дописал, чтобы память использовалась нормально. может ей там где то какое то особое приглашение надо?
matrix has you/
- Rimsky
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Вт июн 15, 2010 07:16:42
- Откуда: Иркутск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
накидал в своем стиле (но не проверял!)
Код: Выделить всё
.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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Блин.... Вот как это называется? Вчера мозг чуть не взорвался не мог понять почему не работает. Сегодня прихожу, запускаю схему а она работает..... Ну блин вчера та не работала. как такое возможно.....
Есть другой вопрос. В тех обучалках по которым я учился небыло ни слова про написания типа: ldi r16, ~((1<<PD4)|(1<<PD6)). Смысл этого в общем та понятен кроме ~ можно в двух словах про все это.
и еще вопрос вместо
нельзя просто написать?:
Вам огромный респект и спасибо есть чего покурить. Прога почти работает вот тока почему то только в одну сторону (проверено в железе). и вместо sbis нужен sbic.Rimsky писал(а):Код: Выделить всё
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)). Смысл этого в общем та понятен кроме ~ можно в двух словах про все это.
и еще вопрос вместо
Код: Выделить всё
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 в вопросах и ответах
В общем так, думаю будет понятно:В тех обучалках по которым я учился небыло ни слова про написания типа: ldi r16, ~((1<<PD4)|(1<<PD6)). Смысл этого в общем та понятен кроме ~ можно в двух словах про все это.
и еще вопрос вместо
ldi r16, ~((1<<PD4)|(1<<PD6)), это равнозначно 0b10101111, знак ~ означает логическое отрицание (НЕ) или проще говоря инвертирование.
ldi r16, (1<<PD4)|(1<<PD6), это равнозначно 0b01010000
В общем случае, это запись константы, только нагляднее и понятнее для понимания. В хидере, это файл tn2313def.inc в вашем случае, есть все определения регистров SFR и ключевых адресов МК, так что и на ассемблере можно писать достаточно понятно.
Можно и так, но в таком случае Вам будет необходимо к каждому пину на котором у Вас кнопки прицепить внешний подтягивающий резистор к + Uпит, чтобы обеспечить лог 1 на входе порта, а при нажатии кнопки, которая замыкает пин на землю на входе пина будет лог. 0, так мы определим, что кнопка нажата или отпущена.нельзя просто написать?:
Код:
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16
Код: Выделить всё
sbis PIND, PIND4
rjmp DECREMENT_VALUE
sbis PIND, PIND6
rjmp INCREMENT_VALUEКод: Выделить всё
out OCR1AH, ZERO
out OCR1AL, ZEROP.S. Там я в исходнике конечно много намудрил, но думаю Вам полезнее самому разобраться что к чему, главной целью было показать почерк.
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Это побитовое НЕ. Или инвертирование. Или функция f(x) = 0xFF - xqmix писал(а):кроме ~ можно в двух словах про все это.
Ну вот не надо. Логическое отрицание - это оператор !Rimsky писал(а):знак ~ означает логическое отрицание (НЕ)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
C ~ и остальным разобрался. просто и весьма удобно.
Следующие вопросы. На что подтягивают внутренние резисторы? управление идет низким уровнем, значит логично предположить что подтягиваются к высокому уровню.
Просто в моем понимании нажатая кнопка это подача высокого уровня на вход. Поэтому и подумал что sbic. Соответственно подтягивать нужно к низкому уровню. можно их подтянуть к 0?
Следующие вопросы. На что подтягивают внутренние резисторы? управление идет низким уровнем, значит логично предположить что подтягиваются к высокому уровню.
Просто в моем понимании нажатая кнопка это подача высокого уровня на вход. Поэтому и подумал что sbic. Соответственно подтягивать нужно к низкому уровню. можно их подтянуть к 0?
matrix has you/
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Резистором подтягивают вывод контроллера к одному уровню, а кнопку ставить на другой уровень. В МК есть встроенные подтягивающие резисторы к "+" питания — очень удобно, не надо ставить внешние.qmix писал(а):На что подтягивают внутренние резисторы? управление идет низким уровнем, значит логично предположить что подтягиваются к высокому уровню.
Просто в моем понимании нажатая кнопка это подача высокого уровня на вход. Поэтому и подумал что sbic. Соответственно подтягивать нужно к низкому уровню. можно их подтянуть к 0?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Очень меня смущало это :
не мог понять вроде обе строчки настраивают порт
да и не подтягивалось ничего на железе.
может правильно
сначала настраиваем порт на вход, но потом ему выводим высокий уровень, и он тогда подтягивается к высокому уровню....
Код: Выделить всё
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, r16matrix has you/
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
В даташит ни разу не заглядывали?qmix писал(а):не мог понять вроде обе строчки настраивают портт да и не подтягивалось ничего на железе. может правильно сначала настраиваем порт на вход, но потом ему выводим высокий уровень, и он тогда подтягивается к высокому уровню....
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Код: Выделить всё
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!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ldi Temp,0b01011111
out DDRD,Temp
PROG_LOOP:
sbis PIND, PIND7
rjmp start
sbis PIND, PIND5
rjmp start
rjmp PROG_LOOP
Подскажите, почему при такой комбинации срабатывает только 7 вывод?
менял порядок, менял пины, а работает только последний...
out DDRD,Temp
PROG_LOOP:
sbis PIND, PIND7
rjmp start
sbis PIND, PIND5
rjmp start
rjmp PROG_LOOP
Подскажите, почему при такой комбинации срабатывает только 7 вывод?
менял порядок, менял пины, а работает только последний...



