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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

asd писал(а):Подскажите, как запрограмировать отдельные биты в РОНе, но чтобы другие остались прежними.
команды SBR и CBR
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
asd
Встал на лапы
Сообщения: 95
Зарегистрирован: Сб янв 20, 2007 22:03:21
Откуда: от верблюда

Сообщение asd »

еще вопрос какие есть способы избавится от дребизга клавиатуры. У мне такая клавиатура, что когда нажимаешь на каждой кнопки возникает как минимум 2 нажатия(дребезга) и на некоторых кнопках 1 дребезг когда отпускаешь кнопку.
Тут одной задержкой перед нажатием не обойтись, ведь и на отпуск кнопки есть дребизг.
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Вводить задержку и после нажатия, и после отпускания. Ну а как конкретно -- от задачи зависит. Например, если присутствует таймер для отсчёта времени, можно при первом срабатывании кнопки (нажатии или отпускании) заносить величину задержки в какую-то переменную и потом уменьшать её с каждым тиком таймера, игнорируя новые срабатывания кнопки до тех пор, пока переменная не обнулится.
Denikmar
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пн ноя 09, 2009 18:14:10

Сообщение Denikmar »

Сталкнулся с небольшой проблемой:
Преамбула
Есть attiny12 у нее одно внешнее прерывание, я подключил две кнопки через диоды, чтобы каждая кнопка могла разбудить процессор и выполнить программу.
Амбула
Для attiny12 поддерживает только асм. вопрос как правильно написать часть кода:
;если нажата кнопка1 то pinb = 0x0f
;если нажата кнопка2 то pinb = 0x17

.if (PINB & ~0x0f) == 0x00 ;immediate activation shutter camera (IASC)
Pulse(480) ;generate pattern
Pause(7324)
Pulse(480)
.endif

.if (PINB & ~0x17) == 0x00 ;activation shutter camera with delay 2 sec (DASC)
Pulse(480) ;generate pattern
Pause(5371)
Pulse(480)
.endif

Вся проблема в том что в if`e pinb = 0x16 (почему так я не понимаю)

Пробывал положить значения в регистр r16 (temp)
in temp,PINB
но опять же этот temp воткнуть в if не получается.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

схему подключения кнопок.
Чем дальше, тем больше становлюсь занудой...
Изображение
Denikmar
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пн ноя 09, 2009 18:14:10

Сообщение Denikmar »

http://chipenable.ru/index.php/how-conn ... -to-micros

Кнопки подключены как на рисунке 3
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Denikmar
если тебе лень нарисовать схему из одного квадратика и 2х кнопок, почему ты думаеш что при таком отношении все кинутся тебе код писать? :evil:
я же русским языком написал
схему подключения кнопок.

я же не написал принцип подключения...
Чем дальше, тем больше становлюсь занудой...
Изображение
Denikmar
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пн ноя 09, 2009 18:14:10

Сообщение Denikmar »

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

я же не написал принцип подключения...


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

З.Ы. Спасибо за понимание.
Denikmar
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пн ноя 09, 2009 18:14:10

Сообщение Denikmar »

Вот добрался до дома прикрепил схему подключения кнопок.
Смысл прост при нажатии на кнопку меняется сразу два бита в pinb, int0 и бит нажатой кнопки, т.о. контроллер можно вывести из глубокого сна двумя кнопками с одним внешним прерыванием.
Вложения
schm-v1.GIF
(11.66 КБ) 394 скачивания
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

вот теперь можно говорить конкретно :)))
1. при замыкании SB1 код будет 0х16, т.к. PB3=0 и PB1=0
2. при замыкании SB2 код будет 0х0D, PB4=0 и PB1=0
остальные выводы =1
на асме будет примерно так:

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

.equ SB1=pb3
.equ SB2=pb4
 .
 .
 in tmp,pinb
 sbrs tmp,SB1
        ; здесь должен быть переход на прог. обработки события по кнопке SB1
 sbrs tmp,SB2
       ; здесь должен быть переход на прог. обработки события по кнопке SB2
 .
 .
 .

но это в первом приближении, а так надо учесть дребезг контактов, время пробуждения, и что pinb по идее надо читать в прерывани INT0, а обработку в теле основной программы.
Последний раз редактировалось GP1 Чт ноя 26, 2009 16:36:04, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Denikmar
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пн ноя 09, 2009 18:14:10

Сообщение Denikmar »

1. после инициализации всех портов начальльное состояние pinb = 0x05 (если кнопки не нажаты), т. о если SB1 нажата то код будет 0х0F ,SB2 - 0x17

2. самый не понятный для меня. команда SBRS () - пропускает одну! команду если бит установлен, а мне надо передать 3 макроса (в каждом по 6 - 10 команд) т.е. из первого макроса выполнитсяодна команда, а дальше ....или я чего то не допонимаю?

in tmp,pinb
sbrs tmp,SB1
Pulse(480)
Pause(7324)
Pulse(480)
sbrs tmp,SB2
Pulse(480)
Pause(5371)
Pulse(480)
цикл if /endif может работать с данными взятыми из регистра или только с константами
3. дребез контактов убирается по INT0 также как и по нему происходит пробуждение.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Denikmar писал(а):1. после инициализации всех портов начальльное состояние pinb = 0x05 (если кнопки не нажаты), т. о если SB1 нажата то код будет 0х0F ,SB2 - 0x17

2. самый не понятный для меня. команда SBRS () - пропускает одну!

давай разбирться.
1. в исходном состоянии ни одна кнопка не нажата, ни один св.диод не горит - так?
тогда откуда на pinb возмется 0х05?
pinb.0=1 - выход, св.диод отключен
pinb.1=1 - вход с подтяжкой к Vcc, иначе не получить прерывание INT0
pinb.2=1 - выход, св.диод отключен
pinb.3=1 - вход с подтяжкой к Vcc,кнопка не нажата
pinb.4=1 - вход с подтяжкой к Vcc,кнопка не нажата
и в каком месте здесь получится 0х05? :shock:

при нажатии кнопки 0 будет присутствовать не только на одном из выводов pinb.3/pinb.4 но и на выводе pinb.1, при такой схеме включения INT0 можно получить или по спадающему фронту, или по низкому уровню, а это требует присутствия 0 на выводе pinb.1 :wink:
так что 0х0F и 0x17 у тебя не получится ни при каких условиях :tea:

2. после команды sbrs нужно вставить команду jmp, после которой команд можно написать сколько угодно.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

вот где-то так
Вложения
sbrs.jpg
(56.15 КБ) 449 скачиваний
Чем дальше, тем больше становлюсь занудой...
Изображение
Denikmar
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пн ноя 09, 2009 18:14:10

Сообщение Denikmar »

Для GP1

Спасибо за помощь с программой разобрался.

1. начальное состояние 0х05 т.к. питание светодиода осуществляется логическим нулем. (но в общем это не важно так как считывание происходит с конкретных битов PINB)
2. команды jmp у attiny12 нет но есть rjmp ее я и применил

Вот основная часть кода, на эмуляторе работает попробую ее залить в кристалл.

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

Main:   sei                        ;global interupt enable
   sleep                        ;go to power down
   cli                           ;global interupt disable
   
#ifdef Canon
    in temp,PINB
   com temp         

   sbrs temp,PB3      ;immediate activation shutter camera (IASC)
   rjmp IASC            

   sbrs temp,PB4      ;activation shutter camera with delay 2 sec(DASC)
   rjmp DASC
   
      PulseRIL(10000)   ;pattern don`t send
      Pulse(10000)
      PulseRIL(10000)      
   rjmp END
IASC:
      Pulse(480)      ;generate pattern
      Pause(7324)
      Pulse(480)
      PulseRIL(10000)   ;pulse indication LED (10mS)
   rjmp END

DASC:
      Pulse(480)      ;generate pattern
      Pause(5371)
      Pulse(480)
      PulseRIL(10000)   ;pulse indication LED (10mS)
   rjmp END
      
END:
[/code]
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

ну откуда ты взял 0х05?
если у тебя нет подтяжки на РВ1, РВ3, РВ4 - то после инициализации там 0 не будет и читаться будет произвольное значение, зависит от кучи случайных факторов, а с подтяжкой там будет 1
и зачем тебе ЭТО

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

com temp


com R -> R=0xFF-R
Чем дальше, тем больше становлюсь занудой...
Изображение
Denikmar
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пн ноя 09, 2009 18:14:10

Сообщение Denikmar »

GP1 писал(а):ну откуда ты взял 0х05?

стоит подтяжка

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

;Ports definition:
.equ   LED1   = exp2(PB0)            ;IR LED (LED1) port 0
.equ   PBTN   = exp2(PB1)            ;push button INT0 port 1
.equ   LED2   = exp2(PB2)            ;RED indication LED (LED) port 2
.equ   PBTN1   = exp2(PB3)            ;immediate activation shutter camera port 3
.equ   PBTN2   = exp2(PB4)            ;activation shutter camera with delay 2 sec  port 4

.equ   PBTN_ALL = PBTN | PBTN1 | PBTN2
.equ   DIRB   = LED1 | LED2         ;port B direction
.equ   PUPB   = LED1 | LED2 | PBTN_ALL   ;port B pull-ups/initial values
...............

;Global Register Variables:

.def   temp   = r16               ;temporary register temp
.def   tempL   = r17               ;temporary register tempL
.def   tempH   = r18               ;temporary register tempH
.def   Cnt   = r19               ;temporary register Cnt

...............

;Initialization:

...............

   ldi   temp,PUPB
   out   PORTB,temp                  ;init PORTB and on/off pullup
   ldi   temp,DIRB   
   out   DDRB,temp                  ;set PORTB direction


GP1 писал(а):и зачем тебе ЭТО

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

com temp


com R -> R=0xFF-R


СОМ побитно инвертирует temp в котором находятся данные (pinb), а затем идет команда

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

        sbrs temp,PB3      ;immediate activation shutter camera  (IASC)
   rjmp IASC            
   sbrs temp,PB4      ;activation shutter camera with delay 2 sec(DASC)
   rjmp DASC
т.о. если я нажал на кнопку РВ3 то бит из 1 после СОМ бит станет 0 и sbrs не пропустит команду идущюю ниже, сработает rjmp сразу же произойдет переход на нужный макрос. [/code]
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

:shock: :shock: :shock:



после СОМ ты получишь в разряде, в котором нажата кнопка, 1
т.к. нажатие кнопки означает подача 0 на соотв. вывод!
и твоя конструкция будет работать с точностью до наоборот:

при нажатии SB1 будет отрабатываться действие приписанное к SB2 и наоборот.

ЗЫ: может кто ещё объяснит товарисчу что не будет у него в исходном состоянии 0х05, а то мне он не верит :)))
Чем дальше, тем больше становлюсь занудой...
Изображение
Denikmar
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пн ноя 09, 2009 18:14:10

Сообщение Denikmar »

Мне надо чтобы при нажатии PB3 выполнилось IASC, и при нажатии PB4 выполнилось DASC я этого добился по крайней мере в AVR Studio у меня все работает так как я задумал. могу выложить исходник.

По поводу 0х05 (0b00000101) из выше приложенного куска кода

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

; расписываем ноги микрухи
.equ   LED1   = exp2(PB0)            ;0b00000001
.equ   PBTN   = exp2(PB1)            ;0b00000010
.equ   LED2   = exp2(PB2)            ;0b00000100
.equ   PBTN1   = exp2(PB3)           ;0b00001000
.equ   PBTN2   = exp2(PB4)           ;0b00010000

.equ   PBTN_ALL = PBTN | PBTN1 | PBTN2  ;0b00011010
.equ   DIRB   = LED1 | LED2             ;0b00000101
;port B pull-ups/initial values
.equ   PUPB   = LED1 | LED2 | PBTN_ALL  ;0b00011111
...............
;Initialization:

;В PORTB загружаем temp
   ldi   temp,PUPB                      ;0b00011111
   out   PORTB,temp                     ;0b00011111
;Выставляем направление портов
   ldi   temp,DIRB   
   out   DDRB,temp                      ;0b00000101
; таким образом
;PORTB=0b00011111
;DDRB =0b00000101 (pb0, pb1 выходы причем на выходе
;логическая 1; pb1,pb3,pb4 входы причем в состоянии pull up ~100k)
;и тогда начальное состояние pinb после инициализации портов будет:
;PINB = 0b00000101 (правда он на Attiny12 6-разрядый но это не важно)
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

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

; таким образом 
;PORTB=0b00011111
;DDRB =0b00000101 (pb0, pb1 выходы причем на выходе
;логическая 1; pb1,pb3,pb4 входы причем в состоянии pull up ~100k)
;и тогда начальное состояние pinb после инициализации портов будет:
;PINB = 0b00000101 (правда он на Attiny12 6-разрядый но это не важно)


толи лыжи не едут ....
pb1,pb3,pb4 входы причем в состоянии pull up ~100k
народ, HELP!!! объясниете ему что при таких установках, на pinb будет 0х1F в исходном состоянии. :dont_know:

возьми мультиметр и померяй :evil:[/b]
Последний раз редактировалось GP1 Чт ноя 26, 2009 20:40:10, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

В регистрах DDRx (x=A,B,C,D...) задается направление пинов. При установке в 0 выводы являются входами, а при установки в 1 - выходами. На Вашей схеме, к РВ0 и РВ2 прицеплены темнодиоды, которые благополучно не светят при исходных настройках.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Ответить

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