查看: 1864|回复: 13
|
Universal IR remote controller with PIC
[复制链接]
|
|
请问这里有谁做过这个PROJECT? 可以告诉我你们的 SAMPLING METHOD 吗?谢谢
[ 本帖最后由 时日无多 于 2-3-2006 12:58 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 3-3-2006 09:02 AM
|
显示全部楼层
原帖由 时日无多 于 2-3-2006 02:29 AM 发表
请问这里有谁做过这个PROJECT? 可以告诉我你们的 SAMPLING METHOD 吗?谢谢
告诉我你怎样setup tmr0. |
|
|
|
|
|
|
|
楼主 |
发表于 3-3-2006 10:53 PM
|
显示全部楼层
我没用TMR0。。。。我是COUNT number when time high or zero delay1 是 100us.可以吗?
zz call delay1
incf ticcount
movf ticcount,w
XORlw h'ff'
BTFSC STATUS,ZEROBIT
goto finish
btfss PORTB,rb1
goto zz
movf ticcount,w
movwf INDF
movf FSR,w
XORlw h'4f'
BTFSC STATUS,ZEROBIT
goto finish
incf FSR
clrf ticcount
aa call delay1
incf ticcount
movf ticcount,w
XORlw h'ff'
BTFSC STATUS,ZEROBIT
goto finish
btfsc PORTB,rb1
goto aa
movf ticcount,w
movwf INDF
XORlw h'ff'
BTFSC STATUS,ZEROBIT
goto finish
movf FSR,w
XORlw h'4f'
BTFSC STATUS,ZEROBIT
goto finish
incf FSR
clrf ticcount
goto zz |
|
|
|
|
|
|
|
发表于 4-3-2006 01:17 PM
|
显示全部楼层
100us 的delay太大,不可以。
两年前, 我做过Universal Remote receiver,它会Learn,学习任何的IR remote controller 的键,学习完后,会对那个键作出反应, toggle output 之类的,目的是遥控一些电灯或电器开关。
那时我是利用Astro remote的那几个红,黄没用的键。
源码属于公司的,我不能公布,除非你向公司买, 希望你见谅。
这里,我可以分享我用的方法,成不成功,得看你的修行了。
我先做一些假设,你用的PIC是16F87x 或16F62x。
先假设要收的是Sony IR remote。
看一看Sony 的protocol:
Header + 12 bit datas
Header: 2.4 mS High, 0.6 mS Low
________________
| 2.4ms | 0.6mS
__| |____
Bit 1 , 1.2 mS High, 0.6 mS Low
________
| 1.2ms |0.6mS
__| |____
Bit 0 , 0.6 mS High, 0.6 mS Low
____
|0.6 |0.6mS
__|ms |____
在这里,时间是重要的,我们要量signal raise 和 fall 的时间,最少是0.6ms 或600uS,
我们需要一个timer,如果设定成10uS 一个timer tick,
那么:
2400uS= 240个tick/count
1200uS= 120个tick/count
600uS= 60个tick/count
接收IR的 IR receiver module 是open collector 的,signal 是invert的,有IR信号(raise) 时是 0V,没有信号(fall)是5V。
这一点不要弄错.
下面是 Pseudo code
- //Set prescaler rate, interrupt or what ever
- setup timer0 =10uS/tick
- int IR_high_Cnt;
- int IR_Low_Cnt;
- int bit[26]; // Array to store Bit timing
- int Cnt; // no of Bit counter
- void main()
- {
- // No IR signal receive yet, wait IR signal to go low
- loop1:
- if IR=1 goto Loop1
- // Carrier detect, init variable
- // At this point, IR=0
- loop2:
- Cnt=0;// reset bit count
- tmr0=0;// reset timer 0, start counting
- // wait IR signal to go high
- loop3:
- if IR=0 goto Loop3
-
- // Get IR raise timing
- // At this point, IR=1
- loop4:
- bit[cnt]=tmr0; // get timer0 and store in array
- cnt++; // increment counter
- tmr0=0;// reset timer 0, start counting
- // wait IR signal to go low
- // At this point, IR=1
- loop5:
- if IR=1 goto Loop5
- // Get IR fall timing
- // At this point, IR=0
- loop6:
- bit[cnt]=tmr0; // get timer0 and store in array
- cnt++; // increment counter
- tmr0=0;// reset timer 0, start counting
- // Have we finish read 26 bit change?
- loop7:
- if Cnt <26 goto loop3
- Finish:
- // We finish reading all the Header + 12bit (13bit X2(high + low) =26)
- data is store at array bit[]
- // Compare data we receive
- compare:
- if bit[] array = predefine value (on eeprom)?
- // if yes, do something.
- // ready to read new IR command
- Done:
- goto loop1
- }
复制代码 |
|
|
|
|
|
|
|
楼主 |
发表于 5-3-2006 09:49 PM
|
显示全部楼层
谢谢 pic 。 我已经成功record astro's ir remote controller 的讯号。也成功把它retransmit =] 我是用555 timer 来产生 38kHz 的,然后使用NAND把 carrirer + data 合起来的。不过 555 和 NAND IC 让我必须提供至少6V。 我想请问有什么方法用PIC16F873A来 carrier(38khz)+data 传送呢?? |
|
|
|
|
|
|
|
楼主 |
发表于 5-3-2006 09:55 PM
|
显示全部楼层
不好意思, 还有如果raise time 是2700us = 270个tick/count <===d'270'= h'10e' 那么10E 要怎么STORE呢? |
|
|
|
|
|
|
|
发表于 6-3-2006 10:03 AM
|
显示全部楼层
谢谢 pic 。 我已经成功record astro's ir remote controller 的讯号。也成功把它retransmit =] 我是用555 timer 来产生 38kHz 的,然后使用NAND把 carrirer + data 合起来的。不过 555 和 NAND IC 让我必须提供至少6V。 我想请问有什么方法用PIC16F873A来 carrier(38khz)+data 传送呢??
不好意思, 还有如果raise time 是2700us = 270个tick/count <===d'270'= h'10e' 那么10E 要怎么STORE呢?
38Khz的carrier可以用PortC.2 CCP, 设定成PWM 就可以了。
raise time 是2700us = 270个tick/count,这个可以用两个8bit register 来store。 (16bit integer) |
|
|
|
|
|
|
|
楼主 |
发表于 6-3-2006 10:58 PM
|
显示全部楼层
当设定了PWM mode PIC 就会在background 自动产生38khz吗?因为我要一边generate carrier一边output data to NAND gate。请问如果不用NAND GATE 还有什么其他的方法来mix carrier和data吗? |
|
|
|
|
|
|
|
发表于 7-3-2006 09:10 AM
|
显示全部楼层
根本不需要NAND gate 啊 , 你可以Enable/Disable PWM 来达到目的,或set PWM 的 duty cycle 从 0% (不要carrier), 50% (要carrier)
如果不要用PWM, 你也可以用software 产生38Khz, 不用很准, 37~40KHz 都 OK。 |
|
|
|
|
|
|
|
楼主 |
发表于 7-3-2006 11:50 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 7-3-2006 10:47 PM
|
显示全部楼层
由于eeprom不够,我用EXTERNAL EEPROM 24lc256。请问我该怎么用ASSEMBLY 来 WRITE 和READ 呢? |
|
|
|
|
|
|
|
发表于 8-3-2006 11:15 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 13-3-2006 07:52 PM
|
显示全部楼层
bsf STATUS,RP0
clrf TRISC
movlw .25
movwf PR2 ;38khz
bcf STATUS,RP0
movlw b'00001100'
movwf CCP1CON
movlw b'00000100'
movwf T2CON ;TMR2 prescaler 1:1
clrf CCPR1L
请问当我SET好上面的CODE,然后当需要OUTPUT 38KHZ 就放以下的CODE,对吗?谢谢
movlw .13
movwf CCPR1L ;duty cycle 50%
CALL DELAY
clrf CCPR1L ;duty cycle 0%
[ 本帖最后由 时日无多 于 14-3-2006 03:52 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 14-3-2006 11:34 AM
|
显示全部楼层
请问当我SET好上面的CODE,然后当需要OUTPUT 38KHZ 就放以下的CODE,对吗?谢谢
可以。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|