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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Сделал вот так. Работает как надо. Получается кнопка переключает режимы, нажал - один, еще раз нажал другой..

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

MainLoop:
	; вызываем программы
	; обработка кнопки старт-меню
menu:
	sbic PIND, 0	
	rjmp start_auto
	nop
	nop
	nop
	rjmp menu
start_auto:
	sbic PIND, 0	
	rjmp menu
	nop
	nop
	nop
	nop
	rjmp start_auto
	rjmp MainLoop
теперь дальше буду мозги колупать себе.. сделать индикацию для начала на 7 сегментнике.
Реклама
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Переключатель предполагает наличие памяти состояния режима. У Вас получился обработчик nop при нажатой кнопке и ожидание нажатия при отпущенной кнопке.

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

menu:
   sbic PIND, 0   
   rjmp menu
   nop
   nop
   nop
   rjmp menu
;start_auto:
;   sbic PIND, 0   
;   rjmp menu
;   nop
 ;  nop
  ; nop
;   nop
;   rjmp start_auto
;   rjmp MainLoop
Реклама
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

А давайте просто поговорим о кнопках и их обработке.
Я использую две разновидности тупо АЦП или таймер+внешнее прерывания.
Во втором случае кнопки обычно висят на 595 вместе с устройством отображения ( 7-segment или LCD - не суть)
Таймер с частотой 100гц=10ms выдает по SPI код - сдвиг регистра (ror rol), но тут тонкий момент т.к в прерывании регистр SREG может на входе иметь разное значение бита C , то необходима проверка MSВ или LSB регистра с кодом и корректировка бита С. Конечно не забыть сохранить SREG. INTx - тупой счетчик совпадений от 7-10 , с выходом - флаг, либо с произвольным выходом из прерывания т.б.
на исполняемую функцию обнаруженной кнопки. При этом функции (подпрограммы) можно располагать где угодно , перемещать в процессе написания кода. Компилятор все равно определит их адрес.
Точнее- создаст таблицу их адресов
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Забыл совсем - в обоих случаях не нужно думать о дребезге.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

Есть на первый взгляд простая задача - вывести данные в часть выводов порта. Но при этом необходимо не изменить состояние и конфигурацию незадействованых выводов.
Если прочитать состояние из PinX, модифицировать и записать в PortX, то есть вероятность того что на незадействованных выводах (которые могут быть настроены на вход), включится или выключится подтягивающий резистор, что нежелательно. Как быть в такой ситуации?
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А зачем читать PINX? Читайте PORTX
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

PORTX выдаст состояния подтягивающих резисторов, или я что-то не правильно понял?
Часть порта будет настроена на вход, а часть на выход. Нужно не изменить состояние выходов и подтягивающих резисторов (у входов).
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Вариантов не так много, но все они, так или иначе, сводятся к тому чтобы исключить нежелательные последствия. :)
С помощью битовых операций (and/or/xor). Получить только то, что требуется. Модифицировать. Если надо, то добавить к получившемуся то что должно быть на "не нужных" местах. Записать.
Можно ещё цикл или кучу if-ов BRxx-ов совместно с пачкой sbi/cbi по нужным битам.
Если состояние порта может поменяться в прерывании, а модификация происходит в основной программе, то может быть полезным запретить прерывания на время модификации.

И не важно что считывать PIN или PORT - маской выделить только нужное.
Последний раз редактировалось Kavka Вс авг 23, 2015 16:54:18, всего редактировалось 1 раз.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4965
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Мурик писал(а):Есть на первый взгляд простая задача - вывести данные в часть выводов порта. Но при этом необходимо не изменить состояние и конфигурацию незадействованых выводов.
Почитай, это про тебя. http://easyelectronics.ru/avr-uchebnyj- ... porty.html
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

Kavka писал(а):И не важно что считывать PIN или PORT - маской выделить только нужное.
Как это не важно? :) PIN выдаст то что сейчас реально на порту, а PORT - состояние подтягивающих резисторов. По моему, инженеры Atmel совершили глупость когда совместили в одном регистре вывод в порт и установку подтягивающих резисторов. :shock:
Тут как получается. Если читать из PIN, то скорее всего будет изменено состояние подтягивающих резисторов. Если читать из PORT, то изменится состояние выходов. Попытка совместить, приведет к увеличению размера кода. Уж проще побитово (SBI и CBI) записать данные в нужные выводы порта. Но думал что есть более правильный способ.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Вам советую сначала разобраться с PORTx, DDRx, PINx.

Предположим Вам надо установить на младших трех выходных битах значение 0b101, само собой не меняя другие биты и значение остальных старших бит Вы почему то не знаете.

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

in R16,PORTx
andi R16,0b11111000
ori   R16,0b000000101 
out PORTx,R16
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Чтение PORT даст вам то что было последний раз в него записано. Как трактовать эти биты (подтяжка или выход пина) зависит от того, что записано в соответствующий биты DDR. Соответственно, чтобы модифицировать только выходные сигналы на порту основываясь только на их текущем состоянии достаточно прочитать PORT. Если вы модифицируете ещё опираясь на входные сигналы того же порта, тогда, да, читать PIN.
А если сигналы надо только установить в известное состояние, и состояние подтяжки известно, то и чтение из PORT не понадобиться. Только код длиннее может получиться. :)

Если это 1-2 бита, то может быть проще через sbi/cbi. А если, например 5-7? :)
Естественно, многое зависит от конкретной задачи.
Z_h_e писал(а):Вам советую сначала разобраться с PORTx, DDRx, PINx.
Скорее с битовыми операциями.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

Kavka писал(а):Как трактовать эти биты (подтяжка или выход пина) зависит от того, что записано в соответствующий биты DDR.
Часть порта используется в другом коде и можно сказать что о состоянии неиспользуемых выводов ничего не известно. Потому что если побитово анализировать DDR и брать биты с PIN или PORT, то код сильно усложнится.
Kavka писал(а):А если, например 5-7
Как раз такой случай. Но видимо проще всего будет побитово изменить состояние выводов о чем писал выше. Думал есть более правильный способ.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Мурик писал(а):PIN выдаст то что сейчас реально на порту, а PORT - состояние подтягивающих резисторов.
Второе утверждение - чистая ложь. Состояние PORT никак не зависит от внешних сигналов, подтяжек или чего-то ещё. Что туда записали, то там и лежит всегда.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

В документации этого не нашел (или неправильно понял).
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Мурик писал(а):Но видимо проще всего будет побитово изменить состояние выводов о чем писал выше.
Я ж Вам код готовый дал одновременного изменения битов порта.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Мурик писал(а):В документации этого не нашел (или неправильно понял).
Второе. Если надо что-то записать только в определённые биты порта - обнуляете их по маске, а потом пишете по маске. Остальные биты не затронутся. Поэтому,
Мурик писал(а):Есть на первый взгляд простая задача - вывести данные в часть выводов порта.
- задача простая не только на первый взгляд. Она простая на любой взгляд и крайне типична, встречаясь почти в любом проекте.
Мурик писал(а):По моему, инженеры Atmel совершили глупость когда совместили в одном регистре вывод в порт и установку подтягивающих резисторов.
На самом деле это очень удобно, и легко позволяет реализовать работу в режиме открытого стока:
1. Вешаем на линию резистор на питание (подтяжка), например, 10 кОм.
2. Инициализация: пишем в PORT ноль.
3. Работа с данными:
- Пишем в DDR ноль - линия переходит Z-состояние и за счёт внешнего резистора утягивается в единицу.
- Пишем в DDR единицу - линия переходит в режим выхода и за счёт PORT = 0 утягивается в ноль.
Так, щёлкая битом DDR, мы фактически имеет выход с открытым стоком.

В принципе, можно и без внешнего резистора обойтись:
- PORT = 0; DDR = 1 => активный ноль.
- DDR = 0; PORT = 1 => неактивная (за счёт подтяжки) единица.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

WiseLord, много лет назад мне нужно было I2C программный изваять, бо аппаратного в том МК не было, и одих хороший чел с fido7.ru.embedded подсказал этот метод. Красиво, хоть и парадоксально на первый взгляд!
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

Спасибо.
Прочитаю еще раз документацию по внимательней.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Мурик писал(а):Потому что если побитово анализировать DDR
Я ничего не писал про анализ/обработку битов DDR. Повторю, трактовать биты PORT можно в зависимости от DDR. А если не надо менять значение бита в PORT, то его просто не надо менять, что бы он не обозначал (как бы он не трактовался).

Мурик, учите мат. часть. В данном случае логические операции и их применение.
Подсказок вам уже дали достаточно, чтобы вы додумали исходя из ваших потребностей. Z_h_e даже пример дал.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

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