【msp430 launchpad、RF模块】调制、解码无线信号2

上一篇博客【msp430 launchpad、RF模块】调制、解码无线信号中,调制、解码是不同的程序。这篇博客是把两个功能糅合到一起,通过按键进行功能切换。
糅合到一起的过程遇到了一些问题,在此记录一下。

①从发射模式切换到接收模式功能程序会有一点紊乱

原因
发射函数running时,发生按键中断,转入按键中断处理函数,此时将模式转换为接收模式,跳出中断处理函数。接着,程序会恢复中断现场继续执行之前没执行完的发射函数,而此时程序已经切换为接受模式,随时会响应信号接收中断,不论是信号接收中断处理函数还是信号发射函数,都会用到door_signal_buffer,而且二者都会控制led进行状态显示,于是程序就发生紊乱了。

解决办法
不由按键中断处理函数打开接收中断控制位,而由信号发射函数打开。设立一个标志位need_open_dump_signal,而按键中断处理函数只变更这个标志位的状态,由信号发射函数的结束部分根据这个标志位的状态来决定是否打开接收中断控制位。而这个标志位就像一张传话纸条。用户想要切换为接收模式于是按下按键,按键中断处理函数便在给发射函数的传话纸条上写“等你执行完了把接收中断打开哈”,然后按键中断处理函数就走了,发射函数继续运行,当它发完信号后看到传话纸条就顺手把接收中断打开了,然后它就走了。接下来接收函数就上场了

启示
利用中断实现相应功能时,务必注意【中断处理函数中的相应操作】与【中断返回后接着执行的代码】有无冲突、以及如何避免冲突。

②关于信号接收功能的一点矛盾之处

关于这个程序,我有不得不正视的现实:

  1. 如果开启了接收模式,那么程序几乎会一直处于【处理信号接收引脚上升沿中断】的过程中,这会给按键中断检测带来不小的困扰
  2. 如果信号缓冲区的存储采用循环队列的方式,那么异常信号(由信号源发射的有正确同步位但数据位畸形的信号、其他的一些符合格式的干扰信号)会把正确的信号覆盖掉

所以哪怕开启了接收模式,也不能让程序真的一直接收

但我又有如下期望:

  1. 至少要采集n个信号才可以进行发射 <== 毕竟不可能发射空信号吧
  2. 得到的信号能最大程度的精简,最好缓冲区里没有重复的信号 <== 毕竟内存宝贵,都存同样的信号好像感觉有点浪费 <== 需要进行冗余处理,即接收信号时检测到缓冲区已有相同信号,则弃之

分析可得,期望1和期望2在一定程度上互相矛盾!如果进行了冗余处理,那很可能一直采集不够n个信号(除非发生干扰太多的情况),那么程序就会一直处于接收状态,直接导致现实1.
所以,程序里我注释掉了冗余处理函数。程序不做信号冗余处理,缓冲区满了就停止接收信号。

③关于标志位的使用

起初没怎么注意这个问题。要使用某个标志位时,直接0x00或0x01,判断是否为真采用if(flag)形式,判断是否为假采用if(!flag)。可是程序执行过程中两个led的状态很紊乱。所以在确定led切换代码无误后,我开始怀疑程序的流程出现了紊乱。果不其然,当flag为0x01时,不管是if(flag)还是if(!flag)都为真!

启示
想要的功能决定对应的判断条件,也决定了判断条件之间的关系。写代码的过程中,一定要把控好这个关系。


最终程序效果:上电执行默认是接收模式,当信号缓冲区满时led1会有规律地闪烁若干次。按下按键切换到发射模式,发射模式下led2闪亮(因为闪亮次数频繁所以肉眼感觉是常亮)。再次按按键回到接收模式,此时会清空信号缓冲区,重新记录信号。从接收模式切换到发射模式,如果缓冲区未满是不会切换成功的。

My codes are here.

)EV1527中断解码 ① 设定定时器中断时间,设定为 80us,80us 进入中断进行解码。具体中断时间多少由自己 软件设定,但是中断时间不能太大。 ② 设定同步码解码范围,同步码定为 5.6ms - 16ms。进入中断判断到低电平,低电平判断 一直累加 Count_Lead++,累积低电平的采集时间,判断到高电平,就判断此时 Count_Lead 的值是否在 70 跟 200之间。(备注:5.6ms/80us=70 16ms/80us=200)。 ③ 引导头通过进入数据判断,刚开始是数据高电平,累积高电平的时间 Count_Data_Hi++, 当判断到低电平时候,判断 Count_Data_Hi 是否在 80us -2.4ms 之间。这里还没进行数据 0 跟 1 的区分,先把 Count_Data_Hi 的值保存在 Hi_Cnt 里面。 (备注:80us/80us=1 2.4ms/80us=30)。 ④ 高电平判断通过,开始判断低电平,累积低电平的时间 Count_Data_lo++,当判断到高电 平时候,判断 Count_Data_Lo 是否在 80us -2.4ms 之间。这里还没进行数据 0 跟 1 的区分, 先把 Count_Data_Lo 的值保存在 Lo_Cnt 里面。 (备注:80us/80us=1 2.4ms/80us=30)。 ⑤ 对 0 跟 1 进行区分,把 24bit 数据整理成三个 byte,存在数组 RfData[0],RfData[1], RfData[2]数组里面。 ⑥ 进行相应功能码的操作。 具体解码方法参考例子程序,因为不同的震荡电阻,1527 出来的编码长度不同,例子 程序是参考 1 lck=100us 波形来做的。具体时间参数可以根据自己的 1527 发射实际长度来 编写。
本人非专业人士,只是一个小小程序员,arduino纯属爱好,所发文章仅限于本人智商,如有问题,请大家指正。 近期对智能家居比较敢兴趣,其中存在几个无线传输的模块,起初选用的2.4G的nRL24L01模块,那个东西真是折腾死人,弄了一个星期都没找到问题点。最后在收拾元件箱子的时候,发现一套以前买的433Mhz模块,就想干脆用这个吧。在各种方式的search,找到了一个lib - RCSwitch,看了例子还比较好用,可以传输24bit的值。立刻装上测试。 315\433射频模块介绍: 当发射电压为3V时,空旷地传输距离约20~50米,发射功率较小,当电压5V时约100~200米,当电压9V时约300~500米,当发射电压为12V时,为最佳工作电压,具有较好的发射效果,发射电流约60毫安,空旷地传输距离700~800米,发射功率约500毫瓦。外接天线:10cm(发射模块天线:10cm,接收模块天线:30cm)多芯或单芯普通导线。 在实际测试中,随便接了跟电线,传输能达到5米,无丢包现象。这个射频模块的穿墙效果,应该会比2.4G的好很多。我家里以前一套315Mhz的报警器,全屋传输无压力。 接线很简单,只有三个脚,两个是电源,一个是数据。 发射端 VCC GND DATA- arduino 10脚(可以变更,在代码中调整) 接收端 VCC GND DATA- arduino 2脚(使用终端2则使用3脚,在代码中调整) 程序使用RCSwitch附带示例修改,传感器值使用随机数替代。 传输思路是将24bit的值分开,前12位为传感器ID,后12位为传感器值,12bit,可以到4096,应该够用了。 其他的控制编码器的例子还没有试,下次测试好了再来。 说明: 还忘了一个重要的东西,在lib中有个代码需要修改,不然会接受到4个重复的值。由于本人对中断不是很熟悉,不知道4个重复值造成的原因,只是测试出改了一个值,请各位大师给予解答。 [pre lang="arduino" line="1"]void RCSwitch::handleInterrupt() { if (repeatCount == 6) { // 需要将 2改为 6repeatCount == 2 if (receiveProtocol1(changeCount) == false){ if (receiveProtocol2(changeCount) == false){ if (receiveProtocol3(changeCount) == false){ //failed } } } repeatCount = 0; } }[/pre] RF射频模块发射端程序部分截图: RF射频模块接收端程序部分截图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值