RC-5 Декодирование
RC-5 Декодирование
Вот привожу файлы временных диаграм для кнопок <POWER> и <0> пульт RC5 (SAA3010T)
снятые микроконтролером AT90s2313. 8 Мгц TCCR0 = 0x04;
При попытке использования исходника ( http://radiokot.ru/articles/16/02.zip ) для AT90s2313. 8 Мгц TCCR0 = 0x04; программа затыкается при декодировании 8 - 9 бита
и соответсявенно не работает .
В чем может быть проблема ?
вот мои настройки
#define l_min 50 //диапазон для "длинного" (long) интервала в посылке, в "тиках" таймера, 1,28..2,176мс
#define l_max 68
#define s_min 17 //диапазон для "короткого" (short) интервала в посылке, в "тиках" таймера, 0,704..1,088мс
#define s_max 40
снятые микроконтролером AT90s2313. 8 Мгц TCCR0 = 0x04;
При попытке использования исходника ( http://radiokot.ru/articles/16/02.zip ) для AT90s2313. 8 Мгц TCCR0 = 0x04; программа затыкается при декодировании 8 - 9 бита
и соответсявенно не работает .
В чем может быть проблема ?
вот мои настройки
#define l_min 50 //диапазон для "длинного" (long) интервала в посылке, в "тиках" таймера, 1,28..2,176мс
#define l_max 68
#define s_min 17 //диапазон для "короткого" (short) интервала в посылке, в "тиках" таймера, 0,704..1,088мс
#define s_max 40
- Вложения
-
- DEC_power.TXT
- (155 байт) 374 скачивания
-
- DEC_0.TXT
- (175 байт) 212 скачиваний
- Реклама
Re: RC-5 Декодирование
Вот эти пульты . Есть небольшой разброс по времени но катина та же
- Вложения
-
- rc5_pult.jpg
- (136.45 КБ) 790 скачиваний
-
- pults.jpg
- (145.23 КБ) 470 скачиваний
Последний раз редактировалось FUZZY_ Вт июл 05, 2011 20:35:57, всего редактировалось 1 раз.
Re: RC-5 Декодирование
попробуйте другой алгоритм: например как тут http://easyelectronics.ru/ik-distancion ... lenie.html или тут http://avrproject.ru/publ/protokol_rc5_ ... r/1-1-0-30
Re: RC-5 Декодирование
Вот из давних проектов. Много лишнего, но дума разберёшься. Код рабочий.
- Вложения
-
- AZSprice.rar
- (62.4 КБ) 333 скачивания
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18656
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: RC-5 Декодирование
ну и мои 5 копеек: http://arv.radioliga.com/content/view/219/43/
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
Re: RC-5 Декодирование
Спасибо всем кто откликнулся.
А теперь по существу:
Исходники
http://radiokot.ru/articles/16/02.zip , http://radiokot.ru/forum/download/file.php?id=71435 (AZSprice.rar )
построены по одному и тому-же алгоритму и содержат одну и ту же ошибку или нюанс - затыкаются при приеме 10 - 12 бита кода RC5
ЭТО ПРИ ТОМ ЧТО АЛГОРИТМ ОБРАБОТКИ ПРАВИЛЬНЫЙ (скорее всего авторы выложили более рании версии своих исходников ).
В архиве RC5_decode_AT90s2313.rar находится исправленый код для AT90s2313
Вот результаты работы исправленого кода для пульта RC5 SAA3010T сканирование кнопок
*******************************************
Terminal log file
Date: 03.07.2011 - 11:41:49
-----------------------------------------------
chip = SAA3010T fl=RC5 contry=CHINA
-----------------------------------------------
key scancode
power = 00 0C
off speaker =00 0D
1 = 00 01
2 = 00 02
3 = 00 03
4 = 00 04
5 = 00 05
6 = 00 06
7 = 00 07
8 = 00 08
9 = 00 09
0 = 00 00
-/-- = 00 0A
>>> = 00 1E
prog+ =00 20
prog- =00 21
tune+ = 00 2B
tune- =00 2C
loudless+ = 00 10
store- = 00 29
call = 00 0F
loudless- =00 11
p.p =00 0E
timer = 00 26
contrast+ = 00 1C
sat + =00 14
bri+ = 00 12
av = 00 38
contast- = 00 1D
sat- =00 15
bri- = 00 13
tv = 00 3F
-----------------------------------------------
Date: 03.07.2011 - 11:43:45
End log file
А теперь по существу:
Исходники
http://radiokot.ru/articles/16/02.zip , http://radiokot.ru/forum/download/file.php?id=71435 (AZSprice.rar )
построены по одному и тому-же алгоритму и содержат одну и ту же ошибку или нюанс - затыкаются при приеме 10 - 12 бита кода RC5
ЭТО ПРИ ТОМ ЧТО АЛГОРИТМ ОБРАБОТКИ ПРАВИЛЬНЫЙ (скорее всего авторы выложили более рании версии своих исходников ).
В архиве RC5_decode_AT90s2313.rar находится исправленый код для AT90s2313
Вот результаты работы исправленого кода для пульта RC5 SAA3010T сканирование кнопок
*******************************************
Terminal log file
Date: 03.07.2011 - 11:41:49
-----------------------------------------------
chip = SAA3010T fl=RC5 contry=CHINA
-----------------------------------------------
key scancode
power = 00 0C
off speaker =00 0D
1 = 00 01
2 = 00 02
3 = 00 03
4 = 00 04
5 = 00 05
6 = 00 06
7 = 00 07
8 = 00 08
9 = 00 09
0 = 00 00
-/-- = 00 0A
>>> = 00 1E
prog+ =00 20
prog- =00 21
tune+ = 00 2B
tune- =00 2C
loudless+ = 00 10
store- = 00 29
call = 00 0F
loudless- =00 11
p.p =00 0E
timer = 00 26
contrast+ = 00 1C
sat + =00 14
bri+ = 00 12
av = 00 38
contast- = 00 1D
sat- =00 15
bri- = 00 13
tv = 00 3F
-----------------------------------------------
Date: 03.07.2011 - 11:43:45
End log file
- Вложения
-
- RC5_decode_AT90s2313.rar
- (2.73 КБ) 251 скачивание
Последний раз редактировалось FUZZY_ Вс июл 03, 2011 12:57:12, всего редактировалось 1 раз.
Re: RC-5 Декодирование
Вот не RC5 пульты - в них протокол NEC - 8 bit address 8 bit ~address 8 bit command 8 bit ~command
Желтый - 4$ китай -универсальный только для TV поддерживает 5 систем кодирования для разных TV
Сканкоды в кнопок power от пульта mp3 и SAT файле
Желтый - 4$ китай -универсальный только для TV поддерживает 5 систем кодирования для разных TV
Сканкоды в кнопок power от пульта mp3 и SAT файле
- Вложения
-
- psat.TXT
- (249 байт) 173 скачивания
-
- pmp3.TXT
- (249 байт) 166 скачиваний
-
- nonRC5pult.jpg
- (138.25 КБ) 666 скачиваний
Re: RC-5 Декодирование
Либо у вас времянки настроены были не правильно, либо ещё что. Но тот код работал. Как и код автора статьи
Re: RC-5 Декодирование
Вставленный код с коментариями
/* indection code */
faling=false;
RISING_INT0();
/* indection code */
и так далее по тексту программы
времянки настроены так чтобы подходил любой RC5 пульт (у меня их 10 )
Разброс в них конечно есть, но как и телики работают с любыми RC5 пультами так и прога должна работать
Все проги по одному алгоритму - в файле - но надо четко понимать что остается вне кадра алгоритма
/* indection code */
faling=false;
RISING_INT0();
/* indection code */
и так далее по тексту программы
времянки настроены так чтобы подходил любой RC5 пульт (у меня их 10 )
Разброс в них конечно есть, но как и телики работают с любыми RC5 пультами так и прога должна работать
Все проги по одному алгоритму - в файле - но надо четко понимать что остается вне кадра алгоритма
- Вложения
-
- rc5.rar
- (368.99 КБ) 191 скачивание
Последний раз редактировалось FUZZY_ Вт июл 05, 2011 20:28:15, всего редактировалось 1 раз.
Re: RC-5 Декодирование
По ходу дела собрал вот эту схему
http://servissistemy.narod.ru/index_fil ... kbd_bg.gif с сайта http://servissistemy.narod.ru/10.htm
Как всегда с USB надо точно согласовывать уровни (3.3 В D+ D-) - сразу не пошла (не определялся USB)
путем несложной доработки начала четко определяться.
но опять трабл не видит пульта ДУ
http://servissistemy.narod.ru/index_fil ... kbd_bg.gif с сайта http://servissistemy.narod.ru/10.htm
Как всегда с USB надо точно согласовывать уровни (3.3 В D+ D-) - сразу не пошла (не определялся USB)
путем несложной доработки начала четко определяться.
но опять трабл не видит пульта ДУ
- Вложения
-
- dispechar.jpg
- (10 КБ) 650 скачиваний
-
- IR_mega48pa.jpg
- (98.05 КБ) 657 скачиваний
Re: RC-5 Декодирование
Прошу помощи в асемблере как настроить длительности (код из источника выше)
; п/п приема RC5
; Вход: StateRC5 - состояние приема
; BitCnt - счетчик бит
; OldTMR1L - хранение сост. TMR1
; OldTMR1H - /
; Константа: Nt=T*Ft/Kd
; T=1778 - длит. периода RC5
; Ft=12 - тактовая частота, мгц
; Kd=8 Kd TMR1
; Выход: ByteRC5L - команда RC5 0xxx.xxxx
; ByteRC5H - система RC5 000x.xxxx
; StateRC5=FF при успешном приеме
; Используются: R16-R22
RxRC5:
lds R16,StateRC5
cpi R16,$FF
brne PC+2
ret ; не принимаем, предыд. команда не обраб.
cpi R16,$00
breq State0 ; 0
cpi R16,$01
breq State1 ; 1
cpi R16,$02
breq State02 ; 2
cpi R16,$03
breq State03 ; 3
rjmp NewRX ; ошибка, сброс
State02:
rjmp State2
State03:
rjmp State3
; ждем 1-й |_
State0:
sbic PINB,0 ; ICP1= PB0=0
ret ; =1 - выход, ждем
sbis TIFR1,ICF1 ; ICF1=1, был перепад |_
rjmp NewRX ; ошибка
; был |_
; инвертируем LED
lds R18,StateTest
in R17,PORTB
cbr R17,(1<<LEDTEST) ; LED=0, включен
tst R18
breq PC+2 ; StateTest=0
sbr R17,(1<<LEDTEST) ; LED=1, выключен
out PORTB,R17
;
lds R17,ICR1L ; сохранить захваченный TMR1
lds R18,ICR1H
sts OldTMR1L,R17
sts OldTMR1H,R18
StateInc:
inc R16 ; State+1
sts StateRC5,R16
ret
; проверяем время и принимаем бит
State1:
lds R17,TCNT1L ; считываем TMR1
lds R18,TCNT1H ; /
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; R17,R18 = TMR1-OldTMR1
sbc R18,R20
ldi R19,LOW(11*Nt/16) ; окно 11/16 Nt
ldi R20,HIGH(11*Nt/16); /
cp R17,R19
cpc R18,R20
brsh PC+2 ; прошло >11/16 Nt
ret ; ждем
clc ; C=0
sbic PINB,0 ; ICP1= PB0=0
sec ; C=1
lds R17,ByteRC5L
lds R18,ByteRC5H
rol R17 ; вдвигаем бит
rol R18
sts ByteRC5L,R17 ; сохранить
sts ByteRC5H,R18 ; /
com R17 ; инверсия
bst R17,0 ; bit0-->T
lds R17,TCCR1B
bld R17,ICES1
sts TCCR1B,R17 ; bit=0 - _|, =1 - |_
lds R17,BitCnt
inc R17 ; счетчик бит
sts BitCnt,R17
ldi R17,(1<<ICF1) ; $20
out TIFR1,R17 ; сброс флага ICF1
rjmp StateInc ; след. сост.
State2:
lds R17,ICR1L ; захваченный TMR1
lds R18,ICR1H
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; R17,R18 = ICR1-OldTMR1
sbc R18,R20
ldi R19,LOW(5*Nt/4) ; окно 5/4 Nt
ldi R20,HIGH(5*Nt/4); /
cp R17,R19 ; D(ICR1)-5/4 Nt
cpc R18,R20 ; /
brsh State2Er ; прошло >5/4 Nt, ошибка
sbis TIFR1,ICF1 ; ICF1=1
rjmp State2Wt ; ждем перепад с проверкой TOUT
lds R17,ICR1L ; захваченный TMR1
lds R18,ICR1H
sts OldTMR1L,R17 ; сохранить
sts OldTMR1H,R18
lds R17,BitCnt
cpi R17,Nbit-1 ; кол-во бит -1
brsh PC+3 ; все биты приняты
dec R16 ; не все
rjmp PC+2
inc R16
sts StateRC5,R16
; сбросим флаг ICF1, настроим на |_
lds R17,TCCR1B
cbr R17,(1<<ICES1) ; bit=0 - |_
sts TCCR1B,R17
ldi R17,(1<<ICF1) ; $20
out TIFR1,R17 ; сброс флага ICF1
ret
State2Wt:
lds R17,TCNT1L ; считываем TMR1
lds R18,TCNT1H ; /
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; R17,R18 = TMR1-OldTMR1
sbc R18,R20
ldi R19,LOW(3*Nt/2) ; окно 3/2 Nt
ldi R20,HIGH(3*Nt/2); /
cp R17,R19
cpc R18,R20
State2Er:
brsh NewRX ; прошло >3/2 Nt, ошибка
ret ; ждем
; приняты все биты, ждем 2Nt
State3:
lds R17,TCNT1L
lds R18,TCNT1H
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; TMR1-OldTMR1
sbc R18,R20 ; /
ldi R19,LOW(2*Nt)
ldi R20,HIGH(2*Nt)
cp R17,R19
cpc R18,R20
brsh PC+2 ; прошло >2 Nt
ret ; ждем 2 Nt
sbic TIFR1,ICF1 ; ICF1=0
rjmp NewRX ; был лишний перепад, ошибка
; формируем рез-т
lds R17,ByteRC5L
lds R18,ByteRC5H
rol R17
rol R18
rol R17
rol R18
ror R17
ror R17
set ; T=1
sbrc R18,6 ; ст.бит команды =0
clt ; T=0
bld R17,6 ; инверсный ст.бит
bst R18,5 ; tagle bit
bld R17,7
andi R18,$1F ; 000x.xxxx
; принята команда
clr R16
sts RtcRC5,R16 ; счетчик времени
lds R16,OldRC5L
cp R17,R16
breq NewRX ; повтор команды
sts OldRC5L,R17
andi R17,$7F ; маскируем Tagle bit
sts ByteRC5L,R17
sts ByteRC5H,R18
ldi R16,$FF ; команда принята
rjmp PC+2
NewRX:
clr R16 ; ошибка, новый прием
sts StateRC5,R16
ldi R16,RevTMR1 ; 1000.0010
sts TCCR1B,R16 ; настр. TMR1
ldi R16,(1<<ICF1) ; $20
out TIFR1,R16 ; сброс флага ICF1 на всяк.случай
clr R16
sts BitCnt,R16 ; сч.бит =0
; инвертируем LED
lds R16,StateTest
in R17,PORTB
sbr R17,(1<<LEDTEST) ; LED=1, выключен
tst R16
breq PC+2 ; StateTest=0
cbr R17,(1<<LEDTEST) ; LED=0, включен
out PORTB,R17
ret
; п/п приема RC5
; Вход: StateRC5 - состояние приема
; BitCnt - счетчик бит
; OldTMR1L - хранение сост. TMR1
; OldTMR1H - /
; Константа: Nt=T*Ft/Kd
; T=1778 - длит. периода RC5
; Ft=12 - тактовая частота, мгц
; Kd=8 Kd TMR1
; Выход: ByteRC5L - команда RC5 0xxx.xxxx
; ByteRC5H - система RC5 000x.xxxx
; StateRC5=FF при успешном приеме
; Используются: R16-R22
RxRC5:
lds R16,StateRC5
cpi R16,$FF
brne PC+2
ret ; не принимаем, предыд. команда не обраб.
cpi R16,$00
breq State0 ; 0
cpi R16,$01
breq State1 ; 1
cpi R16,$02
breq State02 ; 2
cpi R16,$03
breq State03 ; 3
rjmp NewRX ; ошибка, сброс
State02:
rjmp State2
State03:
rjmp State3
; ждем 1-й |_
State0:
sbic PINB,0 ; ICP1= PB0=0
ret ; =1 - выход, ждем
sbis TIFR1,ICF1 ; ICF1=1, был перепад |_
rjmp NewRX ; ошибка
; был |_
; инвертируем LED
lds R18,StateTest
in R17,PORTB
cbr R17,(1<<LEDTEST) ; LED=0, включен
tst R18
breq PC+2 ; StateTest=0
sbr R17,(1<<LEDTEST) ; LED=1, выключен
out PORTB,R17
;
lds R17,ICR1L ; сохранить захваченный TMR1
lds R18,ICR1H
sts OldTMR1L,R17
sts OldTMR1H,R18
StateInc:
inc R16 ; State+1
sts StateRC5,R16
ret
; проверяем время и принимаем бит
State1:
lds R17,TCNT1L ; считываем TMR1
lds R18,TCNT1H ; /
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; R17,R18 = TMR1-OldTMR1
sbc R18,R20
ldi R19,LOW(11*Nt/16) ; окно 11/16 Nt
ldi R20,HIGH(11*Nt/16); /
cp R17,R19
cpc R18,R20
brsh PC+2 ; прошло >11/16 Nt
ret ; ждем
clc ; C=0
sbic PINB,0 ; ICP1= PB0=0
sec ; C=1
lds R17,ByteRC5L
lds R18,ByteRC5H
rol R17 ; вдвигаем бит
rol R18
sts ByteRC5L,R17 ; сохранить
sts ByteRC5H,R18 ; /
com R17 ; инверсия
bst R17,0 ; bit0-->T
lds R17,TCCR1B
bld R17,ICES1
sts TCCR1B,R17 ; bit=0 - _|, =1 - |_
lds R17,BitCnt
inc R17 ; счетчик бит
sts BitCnt,R17
ldi R17,(1<<ICF1) ; $20
out TIFR1,R17 ; сброс флага ICF1
rjmp StateInc ; след. сост.
State2:
lds R17,ICR1L ; захваченный TMR1
lds R18,ICR1H
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; R17,R18 = ICR1-OldTMR1
sbc R18,R20
ldi R19,LOW(5*Nt/4) ; окно 5/4 Nt
ldi R20,HIGH(5*Nt/4); /
cp R17,R19 ; D(ICR1)-5/4 Nt
cpc R18,R20 ; /
brsh State2Er ; прошло >5/4 Nt, ошибка
sbis TIFR1,ICF1 ; ICF1=1
rjmp State2Wt ; ждем перепад с проверкой TOUT
lds R17,ICR1L ; захваченный TMR1
lds R18,ICR1H
sts OldTMR1L,R17 ; сохранить
sts OldTMR1H,R18
lds R17,BitCnt
cpi R17,Nbit-1 ; кол-во бит -1
brsh PC+3 ; все биты приняты
dec R16 ; не все
rjmp PC+2
inc R16
sts StateRC5,R16
; сбросим флаг ICF1, настроим на |_
lds R17,TCCR1B
cbr R17,(1<<ICES1) ; bit=0 - |_
sts TCCR1B,R17
ldi R17,(1<<ICF1) ; $20
out TIFR1,R17 ; сброс флага ICF1
ret
State2Wt:
lds R17,TCNT1L ; считываем TMR1
lds R18,TCNT1H ; /
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; R17,R18 = TMR1-OldTMR1
sbc R18,R20
ldi R19,LOW(3*Nt/2) ; окно 3/2 Nt
ldi R20,HIGH(3*Nt/2); /
cp R17,R19
cpc R18,R20
State2Er:
brsh NewRX ; прошло >3/2 Nt, ошибка
ret ; ждем
; приняты все биты, ждем 2Nt
State3:
lds R17,TCNT1L
lds R18,TCNT1H
lds R19,OldTMR1L
lds R20,OldTMR1H
sub R17,R19 ; TMR1-OldTMR1
sbc R18,R20 ; /
ldi R19,LOW(2*Nt)
ldi R20,HIGH(2*Nt)
cp R17,R19
cpc R18,R20
brsh PC+2 ; прошло >2 Nt
ret ; ждем 2 Nt
sbic TIFR1,ICF1 ; ICF1=0
rjmp NewRX ; был лишний перепад, ошибка
; формируем рез-т
lds R17,ByteRC5L
lds R18,ByteRC5H
rol R17
rol R18
rol R17
rol R18
ror R17
ror R17
set ; T=1
sbrc R18,6 ; ст.бит команды =0
clt ; T=0
bld R17,6 ; инверсный ст.бит
bst R18,5 ; tagle bit
bld R17,7
andi R18,$1F ; 000x.xxxx
; принята команда
clr R16
sts RtcRC5,R16 ; счетчик времени
lds R16,OldRC5L
cp R17,R16
breq NewRX ; повтор команды
sts OldRC5L,R17
andi R17,$7F ; маскируем Tagle bit
sts ByteRC5L,R17
sts ByteRC5H,R18
ldi R16,$FF ; команда принята
rjmp PC+2
NewRX:
clr R16 ; ошибка, новый прием
sts StateRC5,R16
ldi R16,RevTMR1 ; 1000.0010
sts TCCR1B,R16 ; настр. TMR1
ldi R16,(1<<ICF1) ; $20
out TIFR1,R16 ; сброс флага ICF1 на всяк.случай
clr R16
sts BitCnt,R16 ; сч.бит =0
; инвертируем LED
lds R16,StateTest
in R17,PORTB
sbr R17,(1<<LEDTEST) ; LED=1, выключен
tst R16
breq PC+2 ; StateTest=0
cbr R17,(1<<LEDTEST) ; LED=0, включен
out PORTB,R17
ret
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18656
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: RC-5 Декодирование
почему бы вам не воспользоваться моим кодом, который отлично работает с RC5 и многими другими стандартами? или свой особый путь - это важно?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: RC-5 Декодирование
Прошу извинения у автора девайса - он полностью рабочий и код рабочий и работает слюбым RC5 пультом без всяких там настроек
типа мин и мах !!!!
У меня в схеме была сопля - а именно PB2 был соединен с ножкой питания фотоприемника - было обнаружено путем замера напряжений
была разница в 0.25 в между ножкой питания проца и PB2 в большую сторону
типа мин и мах !!!!
У меня в схеме была сопля - а именно PB2 был соединен с ножкой питания фотоприемника - было обнаружено путем замера напряжений
была разница в 0.25 в между ножкой питания проца и PB2 в большую сторону
Последний раз редактировалось FUZZY_ Пт июл 08, 2011 22:42:59, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18656
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: RC-5 Декодирование
я как бы с этого и начал:FUZZY_ писал(а):Если можно исходник сюда.
он там - я проверялARV писал(а):ну и мои 5 копеек: http://arv.radioliga.com/content/view/219/43/
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: RC-5 Декодирование
Спасибо. Привожу фото и где была ошибка
- Вложения
-
- usb_IR.jpg
- (162.14 КБ) 406 скачиваний
Re: RC-5 Декодирование
По ссылке на приведеной код буду пробывать декодировать NEC протокол.
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: RC-5 Декодирование
Мои пять копеек: декодер, который поддерживает Extended RC-5 Code:
Код: Выделить всё
//----------------------------------------------------------------------------
//Декодер RC-5
//----------------------------------------------------------------------------
//Декодер использует два прерывания: внешнее от фотоприемника и
//прерывание по переполнению таймера 0.
//После того, как обнаружен стартовый бит (переход из единицы
//в ноль на входе прерывания), в обработчике внешнего прерывания
//разрешается прерывание таймера 0 и загружается интервал до первой
//выборки T_SAMPLE. В прерывании таймера 0 делаются выборки для
//каждной половинки бита. Подсчет выборок ведется в переменной SampCnt.
//Количество выборок задается константой SAMPLE_COUNT.
//Логический уровень для каждой половинки бита вычисляется по
//мажоритарному принципу. Для этого вычисляется сумма выборок
//в переменной SampVal. Если на входе обнаруживается ВЫСОКИЙ уровень,
//то к этой переменной добавляется единица, если НИЗКИЙ - вычитается.
//Значение суммы не может быть равно нулю, так как общее количество
//выборок всегда задается нечетным. По первой половине текущего бита
//принимается решение о значении принятого бита. Для проверки
//корректности кода Манчестер этот уровень сравнивается со значением
//второй половины предыдущего бита, которое сохраняется в переменной
//PreVal. Если значения совпадают, была ошибка, и прием начинается
//с начала. То же самое происходит, если очередной переход на входе
//не обнаружен через время T_SAMPLE * 2 после последней выборки
//(ошибка таймаута). Принятые биты вдвигаются в переменную Rc5Code.
//Подсчет принятых битов осуществляется в переменной BitCounter.
//Когда принято RC5_LENGTH битов, прием завершен, номер системы
//копируется в переменную SysVar, а код команды - в переменную ComVar.
//Декодер поддерживает Extended RC-5 Code, второй стартовый бит
//интерпретируется как бит F (Field). Бит F представляет собой
//инвертированный дополнительный (старший) бит кода команды,
//в результате количество команд удваивается.
//----------------------------------------------------------------------------
#include "Main.h"
#include "RC5.h"
//----------------------------- Константы: -----------------------------------
#define PRE 64 //предделитель таймера 0
#define RC5_SLOT 1778 //длительность слота RC-5, мкс
#define RC5_LENGTH 14 //количество принимаемых битов
#define SAMPLE_COUNT 3 //количество выборок (должно быть нечетным)
#define T_SAMPLE_US (RC5_SLOT / ((SAMPLE_COUNT + 1) * 2))
#define T_SAMPLE (T_SAMPLE_US * F_CLK / PRE + 0.5)
//----------------------------- Переменные: ----------------------------------
static char SampCnt; //счетчик выборок
static signed char SampVal; //величина, полученная суммой выборок
static bool PreVal; //значение педыдущего полу-интервала
static int RC5Code; //принятый код
static char BitCounter; //счетчик принятых битов
static char SysVar; //номер системы
static char ComVar; //код команды
//-------------------------- Прототипы функций: ------------------------------
#pragma vector = INT0_vect
__interrupt void EdgeIR(void); //прерывание по сигналу фотоприемника
#pragma vector = TIMER0_OVF_vect
__interrupt void TimerIR(void); //прерывание таймера 0
//----------------- Инициализация модуля декодера RC-5: ----------------------
void RC5_Init(void)
{
BitCounter = RC5_LENGTH; //инициализация счетчика битов
PreVal = 1; //перед стартовым битом была единица
SysVar = 0xFF; //неиспользуемый код системы
ComVar = 0xFF; //неиспользуемый код команды
TCCR0 = (1<<CS00) | (1<<CS01); //прескалер CK/64 для таймера 0
MCUCR = (1<<ISC01); //INT0 по спаду
GIFR = (1<<INTF0); //очистка отложенных прерываний
GICR |= (1<<INT0); //разрешение INT0
}
//------------- Обработчик прерывания по сигналу фотоприемника: --------------
#pragma vector = INT0_vect
__interrupt void EdgeIR(void)
{
Port_LED_1;
GICR &= ~(1<<INT0); //запрещение INT0
TCNT0 = 256 - T_SAMPLE; //интервал до первой выборки
TIFR = (1<<TOV0); //очистка отложенных прерываний
TIMSK |= (1<<TOIE0); //разрешение прерываний таймера 0
SampCnt = SAMPLE_COUNT * 2; //общее количесто выборок
SampVal = 0; //очистка принятого значения
}
//------------------ Обработчик прерывания таймера 0: ------------------------
#pragma vector = TIMER0_OVF_vect
__interrupt void TimerIR(void)
{
if(SampCnt) //проверка таймаута
{
if(Pin_RC5) SampVal++; //если на входе единица, инкремент суммы,
else SampVal--; //иначе декремент суммы
if(--SampCnt) //декремент количества выборок
{
if(SampCnt != SAMPLE_COUNT)
{
TCNT0 = 256 - T_SAMPLE; //продолжаем опрашивать
return;
}
else //первая половина интервала закончилась:
{
TCNT0 = 256 - T_SAMPLE * 2; //загрузка интервала между сериями выборок
bool Val = (SampVal > 0); //оценка бита
if(Val != PreVal) //проверка корректности кода Манчестер
{
RC5Code <<= 1; //сдвиг принятого кода
if(!Val) RC5Code |= 1; //первая половина = 0, бит = 1
SampVal = 0; //очистка счетчика выборок
return;
}
}
}
else //вторая половина интервала закончилась:
{
TCNT0 = 256 - T_SAMPLE * 2; //загрузка интервала таймаута
PreVal = (SampVal > 0); //оценка второй половины бита
if(PreVal) //обнаружена единица,
MCUCR &= ~(1<<ISC00); //INT0 по спаду,
else MCUCR |= (1<<ISC00); //иначе INT0 по фронту
GICR |= (1<<INT0); //разрешение INT0
if(--BitCounter) //декремент счетчика битов
return; //переход к приему следующего бита
SysVar = (RC5Code >> 6) & 0x3F; //номер системы
ComVar = RC5Code & 0x3F; //код команды
if(!(RC5Code & 0x1000)) //добавление бита F
ComVar |= 0x40;
}
}
BitCounter = RC5_LENGTH; //загрузка счетчика битов
PreVal = 1; //перед стартовым битом была единица
TIMSK &= ~(1<<TOIE0); //запрещение прерываний таймера 0
MCUCR &= ~(1<<ISC00); //INT0 по спаду
GICR |= (1<<INT0); //разрешение INT0
Port_LED_0;
}
//------------------------- Чтение номера системы: ---------------------------
char RC5_GetSys(void)
{
return(SysVar);
}
//-------------------------- Чтение кода команды: ----------------------------
char RC5_GetCom(void)
{
return(ComVar);
}
//----------------------------------------------------------------------------
Re: RC-5 Декодирование
Вот он еще один алгоритм декодирования - чем-то подобен коду на асемблере. Сп-бо.
Re: RC-5 Декодирование
В доке описаны времянки протоколов обмена NEC , JVS, SAMSUNG, SHARP, SONY, RCA, PANASONIC, PHILIPS
- Вложения
-
- IRC.rar
- (191.61 КБ) 214 скачиваний
- IM1
- Грызет канифоль
- Сообщения: 268
- Зарегистрирован: Вт фев 16, 2010 12:10:38
- Откуда: Воронеж, Россия
Re: RC-5 Декодирование
Спасибо!FUZZY_ писал(а):В доке описаны времянки протоколов обмена NEC , JVS, SAMSUNG, SHARP, SONY, RCA, PANASONIC, PHILIPS


