команды SBR и CBRasd писал(а):Подскажите, как запрограмировать отдельные биты в РОНе, но чтобы другие остались прежними.
Ассемблер (ASM) для AVR в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
гостевая1
еще вопрос какие есть способы избавится от дребизга клавиатуры. У мне такая клавиатура, что когда нажимаешь на каждой кнопки возникает как минимум 2 нажатия(дребезга) и на некоторых кнопках 1 дребезг когда отпускаешь кнопку.
Тут одной задержкой перед нажатием не обойтись, ведь и на отпуск кнопки есть дребизг.
Тут одной задержкой перед нажатием не обойтись, ведь и на отпуск кнопки есть дребизг.
- Реклама
гостевая2
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Вводить задержку и после нажатия, и после отпускания. Ну а как конкретно -- от задачи зависит. Например, если присутствует таймер для отсчёта времени, можно при первом срабатывании кнопки (нажатии или отпускании) заносить величину задержки в какую-то переменную и потом уменьшать её с каждым тиком таймера, игнорируя новые срабатывания кнопки до тех пор, пока переменная не обнулится.
Сталкнулся с небольшой проблемой:
Преамбула
Есть 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 не получается.
Преамбула
Есть 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 не получается.
- Реклама
гостеваая 3
GP1 писал(а):Denikmar
если тебе лень нарисовать схему из одного квадратика и 2х кнопок,схему подключения кнопок.
я же не написал принцип подключения...
Прошу не обижаться, не смог нарисовать, т.к. инет на работе, а всяких пейнтов и др редакторов нема на рабочей станции. Дело не в лении, а в отсутствии возможности. приду домой выложу схемку.
З.Ы. Спасибо за понимание.
Вот добрался до дома прикрепил схему подключения кнопок.
Смысл прост при нажатии на кнопку меняется сразу два бита в pinb, int0 и бит нажатой кнопки, т.о. контроллер можно вывести из глубокого сна двумя кнопками с одним внешним прерыванием.
Смысл прост при нажатии на кнопку меняется сразу два бита в pinb, int0 и бит нажатой кнопки, т.о. контроллер можно вывести из глубокого сна двумя кнопками с одним внешним прерыванием.
- Вложения
-
- schm-v1.GIF
- (11.66 КБ) 394 скачивания
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
вот теперь можно говорить конкретно
1. при замыкании SB1 код будет 0х16, т.к. PB3=0 и PB1=0
2. при замыкании SB2 код будет 0х0D, PB4=0 и PB1=0
остальные выводы =1
на асме будет примерно так:
но это в первом приближении, а так надо учесть дребезг контактов, время пробуждения, и что pinb по идее надо читать в прерывани INT0, а обработку в теле основной программы.
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 раз.
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 также как и по нему происходит пробуждение.
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
- Откуда: Россия, Волгоград
- Контактная информация:
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?
при нажатии кнопки 0 будет присутствовать не только на одном из выводов pinb.3/pinb.4 но и на выводе pinb.1, при такой схеме включения INT0 можно получить или по спадающему фронту, или по низкому уровню, а это требует присутствия 0 на выводе pinb.1
так что 0х0F и 0x17 у тебя не получится ни при каких условиях
2. после команды sbrs нужно вставить команду jmp, после которой команд можно написать сколько угодно.
Для GP1
Спасибо за помощь с программой разобрался.
1. начальное состояние 0х05 т.к. питание светодиода осуществляется логическим нулем. (но в общем это не важно так как считывание происходит с конкретных битов PINB)
2. команды jmp у attiny12 нет но есть rjmp ее я и применил
Вот основная часть кода, на эмуляторе работает попробую ее залить в кристалл.
[/code]
Спасибо за помощь с программой разобрался.
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:
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
ну откуда ты взял 0х05?
если у тебя нет подтяжки на РВ1, РВ3, РВ4 - то после инициализации там 0 не будет и читаться будет произвольное значение, зависит от кучи случайных факторов, а с подтяжкой там будет 1
и зачем тебе ЭТО
com R -> R=0xFF-R
если у тебя нет подтяжки на РВ1, РВ3, РВ4 - то после инициализации там 0 не будет и читаться будет произвольное значение, зависит от кучи случайных факторов, а с подтяжкой там будет 1
и зачем тебе ЭТО
Код: Выделить всё
com tempcom R -> R=0xFF-R
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СОМ побитно инвертирует 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
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
после СОМ ты получишь в разряде, в котором нажата кнопка, 1
т.к. нажатие кнопки означает подача 0 на соотв. вывод!
и твоя конструкция будет работать с точностью до наоборот:
при нажатии SB1 будет отрабатываться действие приписанное к SB2 и наоборот.
ЗЫ: может кто ещё объяснит товарисчу что не будет у него в исходном состоянии 0х05, а то мне он не верит
Мне надо чтобы при нажатии PB3 выполнилось IASC, и при нажатии PB4 выполнилось DASC я этого добился по крайней мере в AVR Studio у меня все работает так как я задумал. могу выложить исходник.
По поводу 0х05 (0b00000101) из выше приложенного куска кода
По поводу 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
- Откуда: Россия, Волгоград
- Контактная информация:
Код: Выделить всё
; таким образом
;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 в исходном состоянии.
возьми мультиметр и померяй
Последний раз редактировалось GP1 Чт ноя 26, 2009 20:40:10, всего редактировалось 1 раз.
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
В регистрах DDRx (x=A,B,C,D...) задается направление пинов. При установке в 0 выводы являются входами, а при установки в 1 - выходами. На Вашей схеме, к РВ0 и РВ2 прицеплены темнодиоды, которые благополучно не светят при исходных настройках.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
