佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1743|回复: 13

Universal IR remote controller with PIC

[复制链接]
发表于 2-3-2006 02:29 AM | 显示全部楼层 |阅读模式
请问这里有谁做过这个PROJECT? 可以告诉我你们的 SAMPLING METHOD 吗?谢谢

[ 本帖最后由 时日无多 于 2-3-2006 12:58 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 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



  1. //Set prescaler rate, interrupt or what ever
  2. setup timer0 =10uS/tick


  3. int IR_high_Cnt;
  4. int IR_Low_Cnt;
  5. int bit[26]; // Array to store Bit timing
  6. int Cnt; // no of Bit counter

  7. void main()
  8. {

  9. //  No IR signal receive yet,   wait IR signal to go low
  10. loop1:
  11.     if IR=1 goto Loop1

  12. // Carrier detect, init variable
  13. // At this point, IR=0
  14. loop2:
  15.     Cnt=0;// reset bit count
  16.     tmr0=0;// reset timer 0, start counting

  17. //    wait IR signal to go high
  18. loop3:
  19.     if IR=0 goto Loop3
  20.    
  21. // Get IR raise  timing
  22. // At this point, IR=1
  23. loop4:
  24.     bit[cnt]=tmr0; // get timer0 and store in array
  25.     cnt++; // increment counter
  26.     tmr0=0;// reset timer 0, start counting   

  27. //    wait IR signal to go low
  28. // At this point, IR=1
  29. loop5:
  30.     if IR=1 goto Loop5

  31. // Get IR fall  timing
  32. // At this point, IR=0
  33. loop6:
  34.     bit[cnt]=tmr0; // get timer0 and store in array
  35.     cnt++; // increment counter
  36.     tmr0=0;// reset timer 0, start counting   

  37. // Have we finish read 26 bit change?
  38. loop7:
  39.     if Cnt <26 goto loop3

  40. Finish:
  41. // We finish reading all the Header + 12bit  (13bit X2(high + low) =26)
  42. data is store at array bit[]

  43. // Compare data we receive
  44. compare:
  45.   if bit[] array = predefine value (on eeprom)?
  46. //  if yes, do something.


  47. // ready to read new IR command
  48. Done:
  49.     goto loop1

  50. }


复制代码
回复

使用道具 举报

 楼主| 发表于 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呢?
回复

使用道具 举报

Follow Us
发表于 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吗?
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层
原帖由 时日无多 于 7-3-2006 10:47 PM 发表
由于eeprom不够,我用EXTERNAL EEPROM 24lc256。请问我该怎么用ASSEMBLY 来 WRITE 和READ 呢?

你用16F873A,其实可以写进它的4K Program Memory, 大概可以擦写100,000次。
参考:http://www.piclist.com/techref/microchip/memory.htm
回复

使用道具 举报

 楼主| 发表于 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,对吗?谢谢

可以。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 8-5-2024 05:18 PM , Processed in 0.100937 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表