原创 [原创]数据接收时检测时间是否溢出的方法!

2008-8-23 15:34 2596 7 7 分类: MCU/ 嵌入式

[原创]数据接收时检测时间是否溢出的方法!



大家经常使用到用MCU来接收外部发送的波形,如接收方波、计算波形频率、红外接收等,如果数据出现长期的高电平或低电平,我们将作如何处理?现总结几种个人常用的方法,很可能此举是班门弄斧,各位见笑了。


1)利用看门狗,在合适的程序处喂狗,一旦数据长期高或低则系统复位;此举简单易用,但很多产品要求当出现无数据时必须给出提示,也可能系统复位时要求显示一个“欢迎XX”之类的提示符,那么此时用WDT来做似乎就不是那么的好了。


2)建立一个子函数来检测数据是否溢出,此举相对来说比较麻烦,因为接收一段数据其数据位可能是N位,也就是说我们得在这N个地方分别调用这个子函数来检测数据是否发生了时间溢出,不太实用。
其一可用一个“循环超时”来做:
 unsigned int counter="0";
 while(没有有效数据 && ++counter)
   ;//没有有效数据时等待
 if(counter==0)
 {
  do something;//等待接收时超时
  return;
 }
 do otherthing;//有效数据到来
 
其二可在定时中断里定义一个time_counter值,每次中断其值加1,当加到一定值时置TIME_OVER_FLAG标志为1,在主接收程序中检测TIME_OVER_FLAG是否为1,另外接收程序中一检测到有效数据时必须清time_counter的值;
 timerx_ovf_interrupt()//定时中断函数
 {
  if(++time_counter==COUNTER_MAX);
  {
   time_counter=0;
   TIME_OVER_FLAG=1;
  }
 }
 .....
 check_data()//检测数据
 {
  if(收到一个有效数据)//主程序
  {
   do sth..;
   time_counter=0;
  }
  else if(TIME_OVER_FLAG)//如果时间溢出
  {
   do sth....;//说明时间溢出了
  }
 }
 
3)利用定时中断,溢出将出错处理函数段的pc压入堆栈,覆盖原有堆栈,定时中断函数一检测到时间溢出时,则将溢出将出错处理函数段的pc覆盖原有堆栈中的pc值.以下为本人在应用在Sonix上的一例:


;定时中断检测TIME_COUNTER是否溢出


 INCMS TIME_COUNTER
 JMP EXIT_Isr;没有溢出退出


 MOV A,#0X86
 B0MOV STKP,A;一检测到溢出则复位堆栈地址为初始值
 MOV A,#TIME_OVER$M;将出错处理程序的pc压入堆栈,使程序跳出中断时执行                                         ;出错处理程序
 B0MOV STK0H,A
 MOV A,#TIME_OVER$L
 B0MOV STK0L,A
 
 ;同样,此程序必须在主程序中一检测到有效数据则清TIME_COUNTER的值,此方法简单实用,经本人测试暂没发现问题,但可能其适用范围有限。因为进入中断时不知压了几层堆栈,也不知主程序跑到哪了?我用此法的场合是:主程序接收数据+中断数码管显示+蜂鸣器报警。
 
-------------------------------------------------------------------
以上为本人的一点经验,忘各路英雄拍砖!!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条