Ассемблер (ASM) для AVR в вопросах и ответах
доброго времени суток.
Объясните пожалуйста что означает этот код:
#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
как его заменить на Си
Объясните пожалуйста что означает этот код:
#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
как его заменить на Си
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
Здравствуйте уважаемые коты , опять возникли проблемы с приёмом кода RC5 , понадобилось различать длительное нажатие одной клавиши , по протоколу, есть такой 3 бит (управляющий бит) , по нему впринципе можно определить , что нажата одна и таже клавиша , он инвертируется всякий раз, когда нажимается клавиша !!!
Паразитирую на коде DATASHEET AVR410 RC5 , вот кусок кода записи 12 битов кода RC5 без 2 стартовых битов.
в этой части кода
я думаю если в system записать 6 бит а не 5 бит , то 6 бит это как раз будет управляющий бит , как можно проверять 6 бит system
на повтор , а если повтор , то выставить 8 бит command в 1 ????
Паразитирую на коде 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 ????
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
Спецы по 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:
почему то не работает , может кто нибудь подсказать что не так делаю ????
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Для проверки бита в РОН и ветвления процесса лучше использовать команды SBRC SBRS.
Вот только не понял:
Выставляешь 6-й бит а проверяешь 7-й бит?
Вот только не понял:
Выставляешь 6-й бит а проверяешь 7-й бит?
Код: Выделить всё
mov r16 , system
andi r16 , 0b01000000 ; обнулить все биты кроме 7
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
GP1 насколько я понял в этом куске записываются последних 11 битов кода RC5 нажатой кнопки , 5 из них номер системы , 6 код кнопки , хотя судя по общему коду AVR410 RC5 считываются все 12 битов , в том числе и интересующий меня (управляющий) бит , но этот бит почему то не учитывается ????
долгое время разбирался в коде DATASHEET AVR410 , кое что правда не понятно , не пойму как они с помощью этого куска кода записывают 11 битов в system и command , особенно непонятно вот это
GP1
Ведь интересующий меня (управляющий) бит , нвертируется всякий раз, когда нажимается клавиша. Таким путем приемник может различать клавишу, которая остается нажатой, или периодически нажимается.
все голову сломал куда у них делся 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"
[/code];Clear remaining bits
andi command,0b01111111
andi system,0x3F
долгое время разбирался в коде DATASHEET AVR410 , кое что правда не понятно , не пойму как они с помощью этого куска кода записывают 11 битов в system и command , особенно непонятно вот это
Код: Выделить всё
bst system, 5 ;Move toggle bit
bld command, 6 ;to "command"
GP1
Для проверки бита в РОН и ветвления процесса лучше использовать команды SBRC SBRS.
Ведь интересующий меня (управляющий) бит , нвертируется всякий раз, когда нажимается клавиша. Таким путем приемник может различать клавишу, которая остается нажатой, или периодически нажимается.
все голову сломал куда у них делся 12 (управляющий) бит , как ловить повторяющуюся клавишу я в принципе понял , даже написал доп код но почему то он не работает ???
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Как я понял в
system - 5 бит код системы
command - 6 бит код команды
прием ведется первые 6 бит в system, вторые 6 бит в command
код:
просто переписывает ст.бит system в 6-й бит command, через бит Т sreg, в результате в system остается 5 бит [4:0] адрес системы, а в command 7 бит кода команды + управляющий бит - [6]-контрольный бит, [5:0] - код комманды
вот от этого commanf[6] бита тебе и надо плясать.
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] бита тебе и надо плясать.
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
GP1 Спасибо, после ваших разьяснений по коду
теперь все понятно , во я дал
тут даже в коментарии для идеотов написано поместить управляющий бит в 6 бит command
вот так у меня выглядит опрос кнопок пульта
изменил код под длинное нажатие
Опять не хочет работать , не ловит длинное нажатие , что может быть не так ????
Код: Выделить всё
bst system, 5 ;Move toggle bit
bld command, 6 ;to "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 ;
Опять не хочет работать , не ловит длинное нажатие , что может быть не так ????
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
Попробую обьяснить.
В моем устройстве при нажатии на кнопку + или - Vol пульта RC5 ,у меня увеличивается громкость, если нажать один раз на кнопку соответственно увеличивается либо уменьшается громкость как бы на одно деление + BEEP из пьезоизлучателя , если я долго держу кнопку то громкость как то очень быстро регулируется от 0 до 100 около 2 сек , а хотелось бы как у всех медленно и без BEEP , вот и решил различать короткое от длинного нажатия!!!
может есть какие нибуть другие варианты как регулировать громкость медленнее при постоянно нажатой кнопке????
В моем устройстве при нажатии на кнопку + или - Vol пульта RC5 ,у меня увеличивается громкость, если нажать один раз на кнопку соответственно увеличивается либо уменьшается громкость как бы на одно деление + BEEP из пьезоизлучателя , если я долго держу кнопку то громкость как то очень быстро регулируется от 0 до 100 около 2 сек , а хотелось бы как у всех медленно и без BEEP , вот и решил различать короткое от длинного нажатия!!!
может есть какие нибуть другие варианты как регулировать громкость медленнее при постоянно нажатой кнопке????
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Для этого у тебя есть управляющий бит (УБ). Тебе нужно организовать счетчик, который будет увеличиваться при каждой смене значения УБ, и таймер time-out, и как счетчик достигнет определенного значения - выполняешь нужное действие.
Не забывай его обнулять если превышен time-out, или поменялся код клавищи.
Не забывай его обнулять если превышен time-out, или поменялся код клавищи.
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Мяу, GP1!
То MTF иногда может стоит пересмотреть схему и алгоритм?
Алгоритм различения проще реализовать прерываниями от таймера 1 и внешнего сигнала (INTi). Запускаете нажатием кнопки таймер, а при отпускании - фиксируете значение ICP... Далее определяете сколько вешать в граммах...
То MTF иногда может стоит пересмотреть схему и алгоритм?
Алгоритм различения проще реализовать прерываниями от таймера 1 и внешнего сигнала (INTi). Запускаете нажатием кнопки таймер, а при отпускании - фиксируете значение ICP... Далее определяете сколько вешать в граммах...
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
GP1 писал(а):Если я правильно понял, он пытается решить траблу в приемнике...
Тут народ терпеливый - подождем чего мяфтор скажет:))
А по делу лучше связывать и прогу и схему - сразу прозрачнее становится.
PS. Чем мотивируешь сложность реализации через ICP?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- MTF
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Чт янв 07, 2010 11:25:12
- Откуда: Москва
Ребята вы попали в точку , я не раз на форуме задавал вопрос по поводу приема кода 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
Инфы в инете много , но через 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
