ivws 发表于 2008-3-28 15:49:29

最精间的PT2262解码程序与大家共享

我看过很多PT2262软件解码程序,都是用定时器测量脉冲宽度。占用系统太多资源。我自己编写的程序不用定时器,不用中断,代码最少。发射端为PT2262 3.3M 的电阻 接收端为 M8 内部1M RC振荡。解码成功后输出D口显示。编译软件为 ICCAVR。

http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_241626.JPG
(原文件名:2272.JPG)

#include <iom8v.h>
#include <macros.h>

void delay_ms(void)                         //毫秒延时
{   
   unsigned int i;
   for (i=0;i<140;i++)
          {
          }
}

void delay_nms(unsigned int n)            //延时周期
{
   unsigned int i;
   for (i=0;i<n;i++)
          {
           delay_ms();
          }
}

void spaz(void)                           //响蜂鸣器
{
   PORTC|=(1<<5);                        
       delay_nms(50);                        
       PORTC&=~(1<<5);                        
}

unsigned long decode(void)               //无线解码
{
   unsigned long DATA;                  //记录数据
   unsigned char count,i;               //暂时计数
       
/*一共接收三字节*/       
   
   DATA=0;                              //
   for (count=0;count<24;count++)         //开始收集
          {
          
/*测量高电平宽度*/       

       i=0;                                 //宽度计数
           while (PINC&(1<<4))         //高位计数
          {      
               asm("nop");         //
               i++;                  //计数增加
                                       
               if (i>192) goto end;//限时解码
                }                                 
               
/*分辨出电平高低*/               
      
          DATA*=2;                     //数据左移
               
      if (i<64)                           //分辨高低
           {   
          if (!((56>i)&(i>24))) goto end;   //电平合法                              
          DATA+=0;                            //记低电平
           }
          
          else
           {   
          if (!((168>i)&(i>72))) goto end;    //电平合法                              
          DATA+=1;                            //记高电平
           }
          
/*测量低电平宽度*/       
   
           while (!(PINC&(1<<4)))               //低位计数
          {      
               asm("nop");               //
               i++;                        //计数增加
                                       
               if (i>224) goto end;      //限时解码
                }         
               
/*低电平是否过窄*/               
               
           if (i<96) goto end;                  //对比宽度                               
      }
         
/*解码成功返结果*/       
                                    
       returnDATA;                        //成功返回
       
/*有误码结束解码*/       
       
   end:       
       return 0;                              //误码结束
}

void main(void)
{
   unsigned long DATA;                  //
       unsigned char D;             //
       signed char i;                  //
   
   DDRB =0B00000000;                      //定义输入
   PORTB=0B11111111;                      //上拉使能
       
   DDRC =0B11101111;                      //输入通道
       PORTC=0B11011111;               //上拉选择
   
   DDRD =0B11111111;                      //定义输出
       PORTD=0B00000000;               //输出显示
       
       while (1)
          {
           DATA =decode();                      //解码程序
          
           if (DATA>0)                        //
          {
             spaz();                            //解码成功
               
               for (i=2;i>=0;i--)               //数据转换
                  {
                   D=DATA;                     //
                   DATA>>=8;                        //
                  }
               
               i=0;                               //转换完毕
               while (1)                        //输出显示   
                  {
                   if (!(PINB&(1<<0)))            //按键检查
                  {
                       delay_nms(20);               //防误处理
                       if (!(PINB&(1<<0)))            //
                          {
                           i++;                         //显示值加
                           spaz();
                          }
                       while (!(PINB&(1<<0)))         //按键弹起
                          {
                           delay_nms(20);               //防误处理
                          }
                       }
                   if (i>2) break;                  //
                   PORTD=D;                      //输出显示   
                  }
                }
          }
}

miraclelife 发表于 2008-3-28 16:01:00

顶,收藏研究一下再说,如果不用中断岂不是很消耗CPU?

ivws 发表于 2008-3-28 16:05:23

http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_241061.JPG
(原文件名:2272.JPG)
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_241062.JPG
(原文件名:2271.JPG)

plc_avr 发表于 2008-3-28 16:06:41

顶! 和2272解码相比,哪个更好距离更远?

ivws 发表于 2008-3-28 16:15:09

该解码程序流程我已用于量产的商业产品上,从没有出现过误码。如用PIC单片机解码距离和PT2272一样远。上面只解码成功后输出编码显示。其它功能可以扩展。

cjbcjb 发表于 2008-3-28 16:33:21

收下了

fshong 发表于 2008-3-28 17:57:36

楼主,能提供原理图吗?

TYMCU 发表于 2008-3-28 20:02:00

楼主确定可靠么
只用解码估计还行,加上液晶、时钟芯片什么的估计就危险了

eagle2006 发表于 2008-3-28 20:06:00

楼上说的没错,多用几个资源,你的延时就不准确了

imjzd 发表于 2008-3-28 20:14:17

单片机解码可行,但总感觉抗干扰能力不怎么好。比硬解码还是差一点。

shabby 发表于 2008-3-28 20:47:23

解一个码要多久时间?

qxs5264 发表于 2008-3-28 23:23:05

做个记号,不错

boat030 发表于 2008-3-28 23:36:37

晕,不用定时器和中断那肯定要加要消耗大量的CPU资源,要么禁中断,要是开了中断,难以得到准确的时间,不用中断而且占用大量CPU时间,CPU不可能当个PT2272用吧!想必这个系统一扩展就难以适应了.

sourceForge 发表于 2008-3-29 00:19:12

註釋很詳細, 頂!

ivws 发表于 2008-3-29 10:31:44

接收模块在无信号状态下是收到很多杂波,如果用中断的话。MCU反而经常被中断,无法正常处理其它事情。如果是红外接收模块的话就可以,原为红外接收模块在无信号的状态下是高电平。可以多加液晶屏或其它模块,因为解程序是在限定的时间内如果没有正常(合适的电平)的脉冲出现,就会返回。在MCU外理其它任务后,调用解码程序就可以。我用PIC单片机解码已经做出量产的产品,从没出现误码。

christmas108 发表于 2008-3-29 14:05:57

楼主,你没看见“缺电路图,不能加酷”,快点加原理图吧。兄弟们等着。

armok 发表于 2008-3-29 14:30:09

有电路图了。COOL !

Etual 发表于 2008-3-29 15:33:47

加液晶可以, 如果系统要求加4位数码管,那情况会是怎么样呢?
扫描数码管程序放在主程序, 走不通, 接一个完整的 2262 码程序 30多ms 的
放中断扫描数码管也不形, 如果主程序在解码的过程中中断去扫描数码管了,那解码出错.
(很巧, 后果是, 1个码也收不到.)

楼主是做防盗器的不? 防盗器除了收码之外,没啥实时的操作,都是逻辑操作为多,楼主的那样防到主程序倒是没有问题.

就解码的方法来说, 楼主的办法没有错, 确实是行的通.

软解码跟硬解码没有的比, 我的 100多米就死翘翘了, 跟 2272没的比. 可能是技术问题吧,hoho

还有,解码还是用汇编比较爽,时间比较好精确的控制.

我一般是放倒中断里面做解码程序, 是时钟中断, 而不是 外部中断里面, 也就是每隔固定的时间采样无线接受脚的电平.(50us左右)
这样就可以调整整个系统了, 其他程序跟平时那样就可以了. 只是这个中断的有限级别比较高, 否则收码效果会受影响.
当然这样作会有误差,误差就是一个 +- 中断时间,那样测量出来的脉冲宽度会不是很准. 难道这个就是解码距离不能更加远的原因
吗? (我一般只能到100米左右), 也请楼主指教指教.

linyu0395 发表于 2008-3-29 15:46:07

现在基本上都用2260了

还有软件延时解码的距离实在不敢恭维而且占用很大的cpu   精度不够

ivws 发表于 2008-3-30 09:31:53

这要怎么说好呢,你先看看这个http://www.dianyuan.com/bbs/d/58/198344.html 用的就是这个解码流程,只不过用的是PIC的单片机,也是我自己做的。单片同时要接收解码,还要检测交流过零。

avr_c 发表于 2008-3-30 11:09:02

【18楼】 linyu0395 林'还有软件延时解码的距离实在不敢恭维而且占用很大的cpu   精度不够'
呵呵,
软件延时解码的距离丝毫不比中断解码差,反而在对付周期性的干扰上面有很大的效果。,
如;控制直流电极,

ssyniuej 发表于 2008-3-30 12:00:17

我用中断来解码,这个占用资源应该非常大,是无法正常进行其他功能吧?无线解码是干扰非常大,我处理方法是用双中断来相互处理。出现干扰的时候会自动关闭一段时间,因为无线接收一旦收到正常信号后,就好多了,一般来说软解码距离不如用专用芯片。但用软解码主要是灵活!我当时所做的代码会从引导中来测量出时间长度,这样就可以在一定范围内均可解码。而不必非对应一种电阻。

avr1008 发表于 2008-3-30 23:09:04

现在的摩托车防盗器95%都是用软件解码,软件声音,关键是成本呀!

akak47 发表于 2008-3-31 08:19:41

收藏.

ivws 发表于 2008-3-31 09:01:42

只要软件处理得好,接收距离不是问题,很多红外报警器都是采用软件。不过接收距离还和单片机的类型有关,像AVR,89C,等它的端口有对接收板有很大的干扰,晶振频率越高,干扰就大。像PIC,义隆,的单片机就没有很大的干扰,我用PIC12C508做软件解码,距离的PT2272解码一样远。控制要比硬件解码灵活。

ruan 发表于 2008-5-4 22:03:57

我编译了怎么会出现下面的错误,请教是为什么
C:\iccv7avr\bin\imakew -f 2272.mak
    iccavr -o 2272 -g -e:0x20000 -ucrtatmega.o -bfunc_lit:0xe4.0x20000 -dram_end:0x21ff -bdata:0x200.0x21ff -dhwstk_size:30 -beeprom:0.4096 -fihx_coff -S2 @2272.lk   -lcatm128
!ERROR file 'crtatmega.o': undefined symbol '_main'
C:\iccv7avr\bin\imakew.exe: Error code 1
Done: there are error(s). Exit code: 1. Sun May 04 22:00:56 2008

xingzhang 发表于 2008-5-4 22:58:59

这个先记下,还没时间仔细看

hanlin 发表于 2008-5-5 00:51:58

我晕,看样楼主还是个用汇编比较习惯的人.

今天刚好搞这东西.

以前在上大学的时候用这东西做过小区车辆管理系统.无线的地方就是用的这个模块.

但是接收部分我没有用单片机.而是直接将模块连接到max232上与电脑通信.上位机是用vb+access数据块做的一个系统.

下位机(发射)部分用了一块89c2051.当时做的时候pt2262和2272都没用.直接用串口发送接收.因为要求的距离不是很远.当时实际测试无线距离为30m(可以穿墙).

最近又买了几块拿来搞一搞,其实我觉得距离要是不太远的话.pt2262和pt2272都用不到.只要软件协议写的好都可以解决.

接收端没有接收到信号的时候是高低电平来回跳(真的很烦人).但是接收到信号后就会很稳定了.你协议写的不错的话用串口就ok了.我用的就是串口发送接收的.效果很不错.误码率基本是0.

ndust 发表于 2008-5-5 08:31:27

记号

zlutian 发表于 2008-5-5 08:47:11

mark

kimiyang 发表于 2008-5-5 09:09:59

我是用一片2051单独解码 解码后通过串口发送地址码 和数据码。发射端选用不同的震荡电阻 接受端可用拨码开关设置!

sharkbing 发表于 2008-5-5 13:02:08

这东西我只做过双路的,学习一下

ljxh401 发表于 2008-5-5 15:09:22

如果avr有低电平达到多长时间才中断的设置就好了,做这个解码就舒服多了
不知道avr有没有这样的设置

tomason 发表于 2008-5-6 11:18:50

版主:其实我想问一下,图的最右边10引脚,接PB的是什么来的?是不是你万能板上那个现成的线路板模块?是不是PT2272解码模块来的?

sciencehero 发表于 2008-5-6 12:03:07

收藏!

liangxihui 发表于 2008-5-23 01:36:12

楼主,PB0是做什么的阿?

liangxihui 发表于 2008-5-23 11:06:23

我觉得你的程序只解一组码就输出抗干扰能力不行

madha 发表于 2008-5-23 13:13:57

记号

aysyjgw 发表于 2008-5-23 18:53:19

顶起

phone 发表于 2008-5-23 19:13:53

主要是要处理好干扰的问题。

hzn1948 发表于 2008-5-24 10:45:17

我是这样处理的:
信号输入正跳变中断程序只做一件事:定时记数器清零
在主程序中加入解码程序
解码程序从等待信号电平变低后读记数值开始
这样可以大幅度减少干扰信号引起的机器时间占用

microyao 发表于 2008-5-24 11:10:49

标记一下.2272两块多钱一个啊.

csw20066 发表于 2008-7-15 15:09:00

做个记号,学习学习。

ahfong2006 发表于 2008-7-15 15:30:38

距离跟软硬解码有关?如果距离远了不太正常,只能说是冗余度设计得不好。

yanrz 发表于 2008-7-19 21:46:02

厉害!!

maskiss 发表于 2008-7-19 22:29:57

路过

waltonzxh 发表于 2008-7-19 23:32:13

楼主用下面这段代替计时器有什么优势啊,自己通过指令执行个数推算时间还不如让定时器算.

while (!(PINC&(1<<4)))               //低位计数
            {      
               asm("nop");               //
               i++;                        //计数增加
                                       
               if (i>224) goto end;      //限时解码
                }         
               
/*低电平是否过窄*/               
               
         if (i<96) goto end;                  //对比宽度                                 
      }

panxiaoyi 发表于 2008-7-20 04:04:07

收藏

wsl16805 发表于 2008-7-21 17:05:25

记号.

ailanxue 发表于 2008-8-16 20:00:31

unsigned long decode(void)               //无线解码
{
   unsigned long DATA;                  //记录数据
   unsigned char count,i;               //暂时计数


我改成
unsigned long decode(void)               //无线解码
{
   unsigned long DATA;                  //记录数据
   unsigned char count;
   unsigned int i;               //暂时计数
为什么一进主程序调用这个函数就没反应了?在decode函数后加个亮灯的指令 灯都不亮


大家帮帮忙看看

lzf713 发表于 2008-8-17 00:56:03

留下痕迹,方便以后查阅

qiuhuawei 发表于 2008-8-17 09:27:33

记号

xxmmtt 发表于 2008-8-17 21:42:15

留下痕迹,方便以后查阅

jom520 发表于 2008-10-24 18:12:17

註釋很詳細,&nbsp;頂!

huanxian 发表于 2008-10-24 21:26:33

頂!

realize 发表于 2008-10-25 08:04:37

d

gx_huang 发表于 2008-10-25 10:11:27

软件解码,主要是基于成本考虑。

另外,CPU的高频谐波对接收灵敏度有很大影响,初学者和对RF不熟悉者还是用硬件解码的好。

ivws 发表于 2008-10-25 11:06:10

不知道你们有没有试过....举个例子...



比如说用一PT2262&nbsp;315MHz的遥控器..3.3M电阻





一号接收方案:



315M&nbsp;超外差接收板..PT2272&nbsp;M4&nbsp;接收解码..(电阻配对)...



1.遥控器放在手上不动..按下发射键...接收正常...



2.按下发射键不放开,&nbsp;不停的挥动手中的遥控器...这时接收已经不正常...PT2272的输出不断跳动...





二号接收方案:

同样的接收板...发射遥控器...



采用软件解码处理后...这种情况得已很好的解决...



用软件解码..在解决成本的问同时..可靠性还得以提高...当然不同的单片机型类..不一样的解码程式...接收距离也不一样..

sdwflml 发表于 2009-6-12 10:53:39

不错,我也实验一下

sunyouyuan 发表于 2009-6-12 13:03:09

记号一下 正在搞红外学习空调控制器 或许有用

vv3g 发表于 2009-6-13 01:42:02

mark

wshdtb 发表于 2009-7-2 13:52:07

请问一下作者,DATA*=2;    //数据左移 ,相乘的话数据怎么能左移呢,我按照你的电路图作了一个,刷到M8后运行后,出现几个灯一起亮的情况,不知是怎么回事?

ivws 发表于 2009-7-2 14:17:36

这是语言的技巧DATA <<= 1; DATA *= 2; 是一样的.....

这说明已经收到解码信号..是不是用1M的频度呀..

D.lovers 发表于 2009-7-2 22:07:44

mark

csclz 发表于 2009-7-2 22:17:47

whimsy 发表于 2009-7-2 23:44:22

mark

wnju 发表于 2009-7-6 19:01:13

顶一个

czhaii 发表于 2009-7-7 14:01:58

cqgxh 发表于 2009-7-10 11:14:06

我也来发表一个用PIC做的,不好意思,用了定时器。不过抗干扰还好。

yangyi 发表于 2009-7-10 11:43:10

用硬件解码会好很多,但整个系统的成本会增加。

flyerhacker 发表于 2009-7-10 12:37:33

收下了

sange 发表于 2009-7-11 15:23:38

mark

onebobo126com 发表于 2009-7-12 11:16:41

看看

kugel 发表于 2009-7-12 13:58:12

mark

Stitch 发表于 2009-7-12 15:29:59

Mark

aohuahua 发表于 2009-7-12 16:39:02

mark!

youth007 发表于 2009-7-15 10:10:17

我正在做这个模块但是苦于没有资料!谢了楼主顶死你

wanghengzhi 发表于 2009-7-15 14:18:40

好东西,标注!

CCAO_75 发表于 2009-7-15 15:32:57

hao

ql-dz.com 发表于 2009-7-15 19:46:12

学习啦.

xiaojian 发表于 2009-7-15 19:58:07

留个记号

hsztc 发表于 2009-7-21 22:05:57

今天试了下楼主的程序,可以使用。

不过好像有个缺点,需要改进。

PT2262发出来的码的每一位都是三种状态的 “0”,“1”,“三态”

也就是说如果地址是8位,数据是4位的话,这个不重复的地址(密码)只有2^8=256个,正常应该要有3^8=6561个。

不知说的对不对

oldfang 发表于 2009-7-21 22:17:51

MARK

xicanlin 发表于 2009-7-22 00:38:57

我的遥控芯片是PT2213的芯片~~有什么区别的?

cnzhy88 发表于 2009-7-29 12:45:18

记号

weifeng99 发表于 2009-7-29 16:03:35

以后肯定会用到!

kanprin 发表于 2009-7-30 23:07:57

我也顶一下,不知道能否说说解码的原理?

ajoe 发表于 2009-7-31 09:11:27

记下

cqgxh 发表于 2009-7-31 16:14:48

【81楼】 hsztc


今天试了下楼主的程序,可以使用。

不过好像有个缺点,需要改进。

PT2262发出来的码的每一位都是三种状态的 “0”,“1”,“三态”

也就是说如果地址是8位,数据是4位的话,这个不重复的地址(密码)只有2^8=256个,正常应该要有3^8=6561个。

不知说的对不对



你可以参考一下《用PIC对PT2262进行三态解码(6561个地址),地址码设置方便》,这个帖子

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3447443&bbs_page_no=1&search_mode=4&search_text=cqgxh&bbs_id=9999

imzhujun 发表于 2009-8-1 09:10:36

Mark,没准以后可以借鉴

hzxiaobao 发表于 2009-8-19 07:12:27

刚买了模块,准备做实验,可以参考下,谢谢!

fy024 发表于 2009-8-19 08:35:21

不错啊!支持

canback 发表于 2009-8-19 09:52:38

mark

seawind319 发表于 2009-8-19 10:14:37

2262发码,单片机软件解码还是可行的
我们公司一款产品就是用无线收发方式的 就是2262,软件解码,距离可达到30m(12V发射)
用了一年多了还算比较稳定

master5888 发表于 2009-8-19 11:43:09

mark

victor_1106 发表于 2009-8-27 14:26:41

mark

kanprin 发表于 2009-8-27 20:56:02

if (i>192) goto end;//限时解码
if (!((56>i)&(i>24))) goto end;   //电平合法
if (!((168>i)&(i>72))) goto end;    //电平合法   
if (i>224) goto end;      //限时解码
if (i<96) goto end;                  //对比宽度


while (PIND&(1<<PD2))         //高位计数
{      
        asm("nop");         //
        i++;                  //计数增加
                                  
        if (i>192) goto end;//限时解码
}
这个循环周期应该是5,在1M的时钟频率下,一个周期应该是1us,也就是一个循环5us,5*192=960us
在3.3M的电阻下,基本频率是f=10K,也就是100us,那么高电平时间为4*100=400us或12*100=1200us
不知道楼主那些常数是如何得来的? 根据什么来估算正确的范围呢 ? 也望知情的兄弟解答一下,谢谢。

harng 发表于 2009-8-28 16:58:33

好东西

icer1 发表于 2009-8-28 18:48:52

马克

mengyubianyuan 发表于 2009-9-3 03:31:18

看看
页: [1] 2 3
查看完整版本: 最精间的PT2262解码程序与大家共享