команды SBR и CBRasd писал(а):Подскажите, как запрограмировать отдельные биты в РОНе, но чтобы другие остались прежними.
Ассемблер (ASM) для AVR в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
еще вопрос какие есть способы избавится от дребизга клавиатуры. У мне такая клавиатура, что когда нажимаешь на каждой кнопки возникает как минимум 2 нажатия(дребезга) и на некоторых кнопках 1 дребезг когда отпускаешь кнопку.
Тут одной задержкой перед нажатием не обойтись, ведь и на отпуск кнопки есть дребизг.
Тут одной задержкой перед нажатием не обойтись, ведь и на отпуск кнопки есть дребизг.
-
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 не получается.
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... не спрашивайте даже
