OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10922|回复: 9

ucosii上运行红外按键任务

[复制链接]

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-7-21
在线时间
1 小时
发表于 2013-7-26 15:57:13 | 显示全部楼层 |阅读模式

 用IAR编译器在ucosii运行红外按键任务时出错,
1.按下键后显示的一直是键值KEYVAL是0,SYMBOL是ERROR,每按一下KEYCNT会增加很多个数
2.全速运行然后break后,程序会显示一直在OS_TaskIdle()的死循环里没出来,
3.在红外中断处设断点,按下按键会到断点,但是一直在if(res>=85&&res<200) 这个条件里。
else if(res>=85&&res<200)  //按键次数加一(2ms)
            {               
                Remote_Rdy=1;//接受到数据
                Remote_Cnt++;//按键次数增加
                break;
            }

4.用到的的红外的中断服务函数是:
void EXTI9_5_IRQHandler(void)
{
 OSIntEnter();
    if(EXTI_GetITStatus(EXTI_Line6) != RESET )//返回非0值表示中断发生
 {
   EXTI_ClearFlag(EXTI_Line6);
   u8 res=0;
      u8 OK=0;
      u8 RODATA=0;     
   while(1)
      {       
        if(RDATA)//有高脉冲出现
        {
            res=Pulse_Width_Check();//获得此次高脉冲宽度      
            if(res==250)
   {
    break;//非有用信号
   }
            if(res>=200&&res<250)OK=1; //获得前导位(4.5ms)
            else if(res>=85&&res<200)  //按键次数加一(2ms)
            {               
                Remote_Rdy=1;//接受到数据
                Remote_Cnt++;//按键次数增加
                break;
            }
            else if(res>=50&&res<85)RODATA=1;//1.5ms
            else if(res>=10&&res<50)RODATA=0;//500us
            if(OK)
            {
                Remote_Odr<<=1;
                Remote_Odr+=RODATA;
                Remote_Cnt=0; //按键次数清零
            }  
        }          
     }    
   //EXTI->R=1<<6;      //清除中断标志位 
   }
   OSIntExit();     

}
5.delay的函数处也因为用了ucosii改为了:

void delay_init(u8 SYSCLK)
{
#ifdef OS_CRITICAL_METHOD  //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
 u32 reload;
#endif
  SysTick->CTRL&=~(1<<2); //SYSTICK使用外部时钟源 
 fac_us=SYSCLK/8;  //不论是否使用ucos,fac_us都需要使用
    
#ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
 reload=SYSCLK/8;  //每秒钟的计数次数 单位为K   
 reload*=1000000/OS_TICKS_PER_SEC;//根据OS_TICKS_PER_SEC设定溢出时间
       //reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右 
 fac_ms=1000/OS_TICKS_PER_SEC;//代表ucos可以延时的最少单位   
 SysTick->CTRL|=1<<1;    //开启SYSTICK中断
 SysTick->LOAD=reload;  //每1/OS_TICKS_PER_SEC秒中断一次 
 SysTick->CTRL|=1<<0;    //开启SYSTICK   
#else
 fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数  
#endif
}           

#ifdef OS_TICKS_PER_SEC //使用了ucos
//延时nus
//nus为要延时的us数.                
void delay_us(u32 nus)
{  
 u32 ticks;
 u32 told,tnow,tcnt=0;
 u32 reload=SysTick->LOAD; //LOAD的值      
 ticks=nus*fac_us;    //需要的节拍数     
 tcnt=0;
 told=SysTick->VAL;         //刚进入时的计数器值
 while(1)
 {
  tnow=SysTick->VAL; 
  if(tnow!=told)
  {    
   if(tnow<told)tcnt+=told-tnow;//这里注意一下SYSTICK是一个递减的计数器就可以了.
   else tcnt+=reload-tnow+told;    
   told=tnow;
   if(tcnt>=ticks)break;//时间超过/等于要延迟的时间,则退出.
  } 
 };             
}
//延时nms
//nms:要延时的ms数
void delay_ms(u16 nms)

 if(OSRunning==TRUE)//如果os已经在跑了    
 {   
  if(nms>=fac_ms)//延时的时间大于ucos的最少时间周期
  {
      OSTimeDly(nms/fac_ms);//ucos延时
  }
  nms%=fac_ms;    //ucos已经无法提供这么小的延时了,采用普通方式延时   
 }
 delay_us((u32)(nms*1000)); //普通方式延时,此时ucos无法启动调度.
}
#else//不用ucos时
//延时nus
//nus为要延时的us数.                
void delay_us(u32 nus)
{  
 u32 temp;      
 SysTick->LOAD=nus*fac_us; //时间加载     
 SysTick->VAL=0x00;        //清空计数器
 SysTick->CTRL=0x01 ;      //开始倒数  
 do
 {
  temp=SysTick->CTRL;
 }
 while(temp&0x01&&!(temp&(1<<16)));//等待时间到达  
 SysTick->CTRL=0x00;       //关闭计数器
 SysTick->VAL =0X00;       //清空计数器 
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{        
 u32 temp;    
 SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
 SysTick->VAL =0x00;           //清空计数器
 SysTick->CTRL=0x01 ;          //开始倒数 
 do
 {
  temp=SysTick->CTRL;
 }
 while(temp&0x01&&!(temp&(1<<16)));//等待时间到达  
 SysTick->CTRL=0x00;       //关闭计数器
 SysTick->VAL =0X00;       //清空计数器       
}
#endif


高人指点问题出在哪了???

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-26 17:41:15 | 显示全部楼层
回复【楼主位】qyanqin:
---------------------------------
移植了delay以后,简单的任务调度,可以么?
不涉及红外什么的.
就是简单的2个任务切换,有无问题?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-7-21
在线时间
1 小时
 楼主| 发表于 2013-7-26 18:20:38 | 显示全部楼层
回复【2楼】正点原子:
回复【楼主位】qyanqin: --------------------------------- 移植了delay以后,简单的任务调度,可以么? 不涉及红外什么的. 就是简单的2个任务切换,有无问题?
------------------------------
之前用了中断检测的普通按键可以用,
那个没有加红外的时候可以用,加上红外后普通按键也能用,但是红外按键返回的是错误的。
回复 支持 反对

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-6-17
在线时间
7 小时
发表于 2013-7-31 10:30:52 | 显示全部楼层
   你的红外是用来做遥控器的吗??
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-7-21
在线时间
1 小时
 楼主| 发表于 2013-7-31 12:04:13 | 显示全部楼层
回复【4楼】ljh407055315:
---------------------------------
是的,还没解决。。。
ucosii不会用
回复 支持 反对

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-6-17
在线时间
7 小时
发表于 2013-7-31 13:28:46 | 显示全部楼层
我最近也在用UCOSII弄NRF24L01发现进外部中断后 就死机了!!不知道怎么搞。。。
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-7-21
在线时间
1 小时
 楼主| 发表于 2013-7-31 14:03:01 | 显示全部楼层
回复【6楼】ljh407055315:
---------------------------------
普通按键中断检测和红外的按键外部中断检测都出了问题,还在解决中
回复 支持 反对

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-6-17
在线时间
7 小时
发表于 2013-7-31 14:25:14 | 显示全部楼层
嗯 要是弄出来了 分享下经验啊!!http://blog.csdn.net/dcx1205/article/details/9107815这个博客看看对你有没有帮助!!
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-7-21
在线时间
1 小时
 楼主| 发表于 2013-8-2 14:30:20 | 显示全部楼层
回复【8楼】ljh407055315:
---------------------------------
3Q,我再调调试试
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-2-11
在线时间
13 小时
发表于 2016-11-22 16:23:46 | 显示全部楼层
您好,请问最后问题解决了么?  我最近在解码遥控器,也是上系统了,但是解不出来,可以进入到定时器的输入捕获,但是其他问题就不清楚了!  方便的话,加个Q:453418435,谢谢!
知识在于分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 17:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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