Страница 32 из 400
Добавлено: Ср фев 03, 2010 19:04:36
Pooher
Ага, а это как говорят в Одессе - "Две большие разницы"

Добавлено: Пт фев 05, 2010 20:38:29
elf
доброго времени суток.
Объясните пожалуйста что означает этот код:
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x40
.EQU __sm_mask=0xB0
.EQU __sm_powerdown=0x20
.EQU __sm_powersave=0x30
.EQU __sm_standby=0xA0
.EQU __sm_ext_standby=0xB0
.EQU __sm_adc_noise_red=0x10
.SET power_ctrl_reg=mcucr
#endif
как его заменить на Си
Добавлено: Пт фев 05, 2010 22:37:31
SII
Первые две и последнюю строчку оставить, как есть, а все .EQU заменить на #define имя число, например:
#define __se_bit 0x40
Добавлено: Сб фев 06, 2010 21:11:39
elf
SII СПАСИБО
Добавлено: Вс фев 14, 2010 01:58:43
MTF
Здравствуйте уважаемые коты , опять возникли проблемы с приёмом кода
RC5 , понадобилось различать длительное нажатие одной клавиши , по протоколу, есть такой 3 бит (
управляющий бит) , по нему впринципе можно определить , что нажата одна и таже клавиша , он инвертируется всякий раз, когда нажимается клавиша !!!
Паразитирую на коде DATASHEET AVR410 RC5 , вот кусок кода записи 12 битов кода RC5 без 2 стартовых битов.
Код: Выделить всё
sample:
cp timerL,ref1 ;Sample INPUT at 1/4 bit time
brlo sample
sbic PIND,RC5
rjmp bit_is_a_1 ;Jump if line high
bit_is_a_0:
clc ;Store a '0'
rol command
rol system
;Synchronize timing
bit_is_a_0a:
cp timerL,ref2 ;If no edge within 3/4 bit time
brge fault ;exit
sbis PIND,RC5 ;Wait for rising edge
rjmp bit_is_a_0a ;in the middle of the bit
clr timerL
rjmp nextbit
bit_is_a_1:
sec ;Store a '1'
rol command
rol system
;Synchronize timing
bit_is_a_1a:
cp timerL,ref2 ;If no edge within 3/4 bit time
brge fault ;exit
sbic PIND,RC5 ;Wait for falling edge
rjmp bit_is_a_1a ;in the middle of the bit
clr timerL
nextbit:
dec bitcnt ;If bitcnt > 0
brne sample ;get next bit
;All bits sucessfully received!
mov tmp,command ;Place system bits in "system"
rol tmp
rol system
rol tmp
rol system
bst system,5 ;Move toggle bit
bld command,6 ;to "command"
;Clear remaining bits
andi command,0b01111111
andi system,0x1F
в этой части кода
Код: Выделить всё
bst system, 6 ; Move toggle bit
bld command, 6 ; to "command"
;Clear remaining bits
andi command,0b01111111
andi system,0x3F
я думаю если в system записать 6 бит а не 5 бит , то 6 бит это как раз будет
управляющий бит , как можно проверять 6 бит system
на повтор , а если повтор , то выставить 8 бит command в 1 ????
Добавлено: Вт фев 16, 2010 01:04:23
MTF
Спецы по ASM , обьясните как начанающему , вот что написал для проверки нажатия кнопки на повтор !!!!
Код: Выделить всё
bst system, 6 ; Move toggle bit
bld command, 6 ; to "command"
;Clear remaining bits
andi command,0b01111111
andi system,0x3F
mov r16 , system
andi r16 , 0b01000000 ; обнулить все биты кроме 7
cp r16 , autorpt ;
mov autorpt , r16
brne no_repeat ; если не равно то exit
ori command , 0b10000000 ; 8 бит в 1
no_repeat:
почему то не работает , может кто нибудь подсказать что не так делаю ????
Добавлено: Вт фев 16, 2010 09:10:55
GP1
Для проверки бита в РОН и ветвления процесса лучше использовать команды
SBRC SBRS.
Вот только не понял:
Выставляешь 6-й бит а проверяешь 7-й бит?
Код: Выделить всё
mov r16 , system
andi r16 , 0b01000000 ; обнулить все биты кроме 7
Добавлено: Вт фев 16, 2010 10:33:49
MTF
GP1 насколько я понял в этом куске записываются последних 11 битов кода RC5 нажатой кнопки , 5 из них номер системы , 6 код кнопки , хотя судя по общему коду AVR410 RC5 считываются все 12 битов , в том числе и интересующий меня (управляющий) бит , но этот бит почему то не учитывается ????
Код: Выделить всё
mov tmp,command ; Place system bits in "system"
rol tmp
rol system
rol tmp
rol system
[code] bst system, 5 ;Move toggle bit
bld command, 6 ;to "command"
;Clear remaining bits
andi command,0b01111111
andi system,0x3F
[/code]
долгое время разбирался в коде DATASHEET AVR410 , кое что правда не понятно , не пойму как они с помощью этого куска кода записывают 11 битов в system и command , особенно непонятно вот это
Код: Выделить всё
bst system, 5 ;Move toggle bit
bld command, 6 ;to "command"
GP1
Для проверки бита в РОН и ветвления процесса лучше использовать команды SBRC SBRS.
Ведь интересующий меня (управляющий) бит , нвертируется всякий раз, когда нажимается клавиша. Таким путем приемник может различать клавишу, которая остается нажатой, или периодически нажимается.
все голову сломал куда у них делся 12 (управляющий) бит , как ловить повторяющуюся клавишу я в принципе понял , даже написал доп код но почему то он не работает ???
Добавлено: Вт фев 16, 2010 12:02:27
GP1
Как я понял в
system - 5 бит код системы
command - 6 бит код команды
прием ведется первые 6 бит в system, вторые 6 бит в command
код:
Код: Выделить всё
bst system, 5 ;Move toggle bit
bld command, 6 ;to "command"
просто переписывает ст.бит system в 6-й бит command, через бит Т sreg, в результате в system остается 5 бит [4:0] адрес системы, а в command 7 бит кода команды + управляющий бит - [6]-контрольный бит, [5:0] - код комманды
вот от этого commanf[6] бита тебе и надо плясать.
Добавлено: Ср фев 17, 2010 02:16:29
MTF
GP1 Спасибо, после ваших разьяснений по коду
Код: Выделить всё
bst system, 5 ;Move toggle bit
bld command, 6 ;to "command"
теперь все понятно , во я дал

тут даже в коментарии для идеотов написано поместить
управляющий бит в 6 бит command
вот так у меня выглядит опрос кнопок пульта
Код: Выделить всё
main: основной цикл программы
rcall detect ;
cpi system, 0x00 ;
brne rc5_end ;
andi command,0x3F ; без управляющего бита
cpi command,0b00111000 ;Code 1
breq CODE11 ;
cpi command,0b00111001 ;Code 2
breq CODE22 ;
rjmp rc5_end ;
CODE11: rjmp CODE1 ;
CODE22: rjmp CODE2 ;
rc5_end:
********
********
********
rjmp main ;
изменил код под длинное нажатие
Код: Выделить всё
main: основной цикл программы
rcall detect ;
cpi system, 0x00 ;
brne rc5_end ;
lds tmp , rc5_old
cp tmp , command
sts rc5_old , tmp
andi command,0x3F ;
brne K1 ; если не равно
ori command , 0b10000000 ; 8бит в 1
K1:
cpi command,0b00111000 ;Code 1 для одного нажатия
breq CODE11 ;
cpi command,0b00111001 ;Code 2
breq CODE22 ;
cpi command,0b10111000 ;Code 1L длинное нажатие
breq CODE11L ;
cpi command,0b10111001 ;Code 2L
breq CODE22L ;
rjmp rc5_end ;
CODE11: rjmp CODE1 ;
CODE22: rjmp CODE2 ;
CODE11L: rjmp CODE1L ;
CODE22L: rjmp CODE2L ;
rc5_end:
********
********
********
rjmp main ;
Опять не хочет работать , не ловит длинное нажатие , что может быть не так ????
Добавлено: Ср фев 17, 2010 18:54:46
GP1
Честно говорю - не догнал смысла твоего кода.
Добавлено: Чт фев 18, 2010 00:47:42
MTF
Попробую обьяснить.
В моем устройстве при нажатии на кнопку + или - Vol пульта RC5 ,у меня увеличивается громкость, если нажать один раз на кнопку соответственно увеличивается либо уменьшается громкость как бы на одно деление + BEEP из пьезоизлучателя , если я долго держу кнопку то громкость как то очень быстро регулируется от 0 до 100 около 2 сек , а хотелось бы как у всех медленно и без BEEP , вот и решил различать короткое от длинного нажатия!!!
может есть какие нибуть другие варианты как регулировать громкость медленнее при постоянно нажатой кнопке????
Добавлено: Чт фев 18, 2010 09:52:33
GP1
Для этого у тебя есть управляющий бит (УБ). Тебе нужно организовать счетчик, который будет увеличиваться при каждой смене значения УБ, и таймер time-out, и как счетчик достигнет определенного значения - выполняешь нужное действие.
Не забывай его обнулять если превышен time-out, или поменялся код клавищи.
Добавлено: Чт фев 18, 2010 12:12:48
Meteor
Мяу,
GP1!
То
MTF иногда может стоит пересмотреть схему и алгоритм?
Алгоритм различения проще реализовать прерываниями от таймера 1 и внешнего сигнала (INTi). Запускаете нажатием кнопки таймер, а при отпускании - фиксируете значение ICP... Далее определяете сколько вешать в граммах...
Добавлено: Чт фев 18, 2010 12:17:49
GP1
Meteor и тебе мяу, пушистый брат!
Если я правильно понял, он пытается решить траблу в приемнике, думаю через ICR вряд ли получится.
Добавлено: Чт фев 18, 2010 12:23:26
Meteor
GP1 писал(а):Если я правильно понял, он пытается решить траблу в приемнике...
Тут народ терпеливый - подождем чего мяфтор скажет:))
А по делу лучше связывать и прогу и схему - сразу прозрачнее становится.
PS. Чем мотивируешь сложность реализации через ICP?
Добавлено: Пт фев 19, 2010 02:04:34
MTF
Ребята вы попали в точку , я не раз на форуме задавал вопрос по поводу приема кода RC5 через INT1, советов по реализации не было, сначала у меня возникли проблемы с просыпанием контроллера Attiny2313 с подключенным TSOP1736 через INT1 , потом решил проблему.
Инфы в инете много , но через int как делать инфы особо нет , либо на Си, разве что товарищь Ридико полуописал как он делал через int на at89с2051, пытался разобратся как делается через INT, но так как еще не очень владею ASM , так и не реализовал свою идею до конца , да еще как назло оба таймера работают с фиксированной частотой T0/CK , T1 (вообще не всегда работает только по требованию) !!!
У меня усилитель на контроллере attiny2313 , имеет пока 3 кнопки (on -off , + , - громкость ), потом решил приладить пульт RC5 , вставил стандартный код detect из datasheet avr410 rc5 , поскольку при нажатии кнопки on - off усилитель входит в режим SLEEP , тут же понадобилось сделать чтобы при нажатии кнопок на пульте он просыпается, просыпание от внешнего прерывание INT с помощью TSOP1736 , поскольку TSOP1736 подключен к INT1 , я почему то решил что раз уж подключен через к INT1 то можно упростить алгоритм приема кода RC5 в отличие от оригинальной процедуры detect datasheet avr410 !!!!
Насчет длительного нажатия , я заморочился потому что очень быстро регулируется громкость усилителя , на стационарных кнопках
у меня есть различие длительного(повтор кода кнопки ~ через каждые 0,5 сек) и короткого нажатия , процедура прибавления звука у меня одна на длинное и короткое нажатие , для кнопок пульта RC5 планирую использовать так же эту процедуру , вот и понадобилось обработка длительного нажатия на одну кнопку пульта RC5
Поскольку от своей идеи принимать код RC5 через INT не отказался , буду очень признателен если вы мне поможите разобратся c этой задачей , зарание спасибо !!!!!
p.s что означает ICP
Добавлено: Пт фев 19, 2010 07:46:40
Meteor
Виноват,

заморочился уже с NECовскими, подзабыл атмеловские. Не
ICP, а
ICR-захват состояния таймера 1 по внешнему событию.
Добавлено: Пт фев 19, 2010 09:21:08
MTF
а еще есть какие нибуть варианты кроме ICR-захват состояния таймера 1 по внешнему событию , у меня таймеры работают все время с определенной частотой , походу ICR для меня не годится ???
Добавлено: Пт фев 19, 2010 09:25:00
Meteor
Позволю себе еще раз нескромно намекнуть на схему....
Наверняка есть варианты. Тем более если речь пойдет о порте В (в тини2313)