OpenEdv-开源电子网

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

原子哥来看看怎么回事????

[复制链接]

33

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-2-23
在线时间
26 小时
发表于 2015-9-1 10:39:05 | 显示全部楼层 |阅读模式
5金钱
这是中断://-----------------------------------------------------
void EXTI9_5_IRQHandler(void)
{
EXTI->R=1<<5;  
Q_ang--;
}

这是主程序:
        Q_ang=50;
         extiinnt(1);//中断开
          while(lcdXX2!=0)
           {
               if(Q_ang==0)
                {
               Q_ang=50;
               lcdXX2=lcdXX2-15;
                }
             if(lcdXX1!=lcdXX2)
               {
                lcdXX1=lcdXX2;
                 LCD_ShowxNum(100,210,lcdXX2,10,16,0);
              }
         }
      extiinnt(0);//中断关
出现的问题是中断里Q_ang减到=0时不回来执行 while(lcdXX2!=0)里面的Q_ang=50和后面的程序Q_ang直接==255了,而不是Q_ang=50,不管中断多少次就是0-255之间跳,好像程序回不来 while()里

是不是跟个有关呢???

//开关中断
void extiinnt(u8 en)
{
EXTI->R=1<<5;  清标志
if(en==1)EXTI->IMR|=1<<5;///不屏障中断
if(en==0)EXTI->IMR&=~(1<<5);///屏障中断
}

最佳答案

查看完整内容[请看2#楼]

Q_ang--改为if(Q_ang)Q_ang-- 这样改一下不就可以了么,一定就会运行到 if(Q_ang==0)  {         Q_ang=50;         lcdXX2=lcdXX2-15;  }
新手学STM
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2014-10-31
在线时间
8 小时
发表于 2015-9-1 10:39:06 | 显示全部楼层
Q_ang--改为if(Q_ang)Q_ang--
这样改一下不就可以了么,一定就会运行到
if(Q_ang==0)
 {
        Q_ang=50;
        lcdXX2=lcdXX2-15;
 }
回复

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
639
金钱
639
注册时间
2014-6-20
在线时间
169 小时
发表于 2015-9-1 10:49:24 | 显示全部楼层
要先处理中断,再清中断标志   
改成
void EXTI9_5_IRQHandler(void)
{

Q_ang--;
EXTI->R=1<<5;  
} 、
试试(如有错误,勿怪)
回复

使用道具 举报

33

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-2-23
在线时间
26 小时
 楼主| 发表于 2015-9-1 10:59:47 | 显示全部楼层
回复【2楼】Fliger:
---------------------------------一样的
新手学STM
回复

使用道具 举报

3

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2014-10-31
在线时间
8 小时
发表于 2015-9-1 11:26:06 | 显示全部楼层
你lcdXX2的初值呢?
lcdXX1=lcdXX2;这句话又有什么用呢.
还有可以Q_ang--改为if(Q_ang)Q_ang--
回复

使用道具 举报

33

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-2-23
在线时间
26 小时
 楼主| 发表于 2015-9-1 11:28:05 | 显示全部楼层
我发现问题了是中断太快的原因,中断速度慢就没问题,
但我用的是光电编码器(1000CP的)来中断
请问题如何解决为问题呢?我用89C51和12C60S2都问题,速度可以很快可以达到1分钟800(800*1000)以上转的速度都没问题呀!
新手学STM
回复

使用道具 举报

33

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-2-23
在线时间
26 小时
 楼主| 发表于 2015-9-1 11:39:27 | 显示全部楼层
回复【6楼】brook_z:
---------------------------------
真的也,,,,多谢多谢,if(Q_ang)Q_ang-- 有什么不同吗,能给我说下吗????
新手学STM
回复

使用道具 举报

3

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2014-10-31
在线时间
8 小时
发表于 2015-9-1 11:45:39 | 显示全部楼层
由于你中断过快,当你中断把Q_ang减到0之后,你程序没有运行到你要运行的地方,而你又没有做等待,下一次中断来0就会减成0xff;
加个条件就是当减到0之后不会继续往下减而变成0xff;然后会一直等待,直到运行到你给他赋值的地方
回复

使用道具 举报

33

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-2-23
在线时间
26 小时
 楼主| 发表于 2015-9-1 11:53:50 | 显示全部楼层
回复【8楼】brook_z:
---------------------------------
懂了,谢谢你的讲解
新手学STM
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 06:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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