OpenEdv-开源电子网

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

旋转编码开关软件问题

[复制链接]

32

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2014-1-4
在线时间
0 小时
发表于 2014-7-20 23:08:09 | 显示全部楼层 |阅读模式
5金钱








最佳答案

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

回复【23楼】TinyBoy: --------------------------------- void EXTI9_5_IRQHandler(void) {   uint8_t encoder_b; if(EXTI_GetITStatus(EXTI_Line6)!=RESET) { EXTI_ClearITPendingBit(EXTI_Line6);     encoder_b = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8); if(encoder_b == 1) { key_num = KEY_LEFT; } else  { ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2014-4-23
在线时间
0 小时
发表于 2014-7-20 23:08:10 | 显示全部楼层
回复【23楼】TinyBoy:
---------------------------------
void EXTI9_5_IRQHandler(void)

 uint8_t encoder_b;

if(EXTI_GetITStatus(EXTI_Line6)!=RESET)
{
EXTI_ClearITPendingBit(EXTI_Line6);    
encoder_b = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8);

if(encoder_b == 1)
{
key_num = KEY_LEFT;
}
else 
{
key_num = KEY_RIGHT;
}
}

if(EXTI_GetITStatus(EXTI_Line7)!=RESET)
{
key_num = KEY_ENTER;
EXTI_ClearITPendingBit(EXTI_Line7);  
}


我没有去检测电平直接这样用也用了,在引脚对地接了103电容后也不用在软件中做滤波处理了,经过一上午的测试基本没问题了,谢谢各位。
回复

使用道具 举报

32

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2014-1-4
在线时间
0 小时
 楼主| 发表于 2014-7-20 23:15:12 | 显示全部楼层
void EXTI0_IRQHandler(void)
{
delay_ms(10);
if(KEY1==0)  
{
LED0=0;
LED1=1;
}  
EXTI->R=1<<0;  //清除LINE0上的中断标志位  
}

//外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
{
delay_ms(10);      
if(KEY1==1)      
{
LED0=1;
LED1=0;
}
EXTI->R=1<<13;     //清除LINE13上的中断标志位  
EXTI->R=1<<15;     //清除LINE15上的中断标志位  
}
回复

使用道具 举报

32

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2014-1-4
在线时间
0 小时
 楼主| 发表于 2014-7-20 23:15:42 | 显示全部楼层
请大家看看,问题出在哪里
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-20 23:33:40 | 显示全部楼层
帮顶....
回复

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2251
金钱
2251
注册时间
2010-12-16
在线时间
204 小时
发表于 2014-7-21 01:20:20 | 显示全部楼层
你的代码就是这么写的,所以就有这个效果.

EXTI0开LED0关LED1,
EXTI15开LED1关LED0.

然后编码开关无论正反转都会<交替>触发两个中断.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-21 08:20:08 | 显示全部楼层
你的程序本来就是这样写的,所以就这样给你亮
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2014-6-27
在线时间
981 小时
发表于 2014-7-21 11:12:55 | 显示全部楼层
用一个中断就可以了吧,一个用普通IO,在中断里面判断旋钮方向就行了。
回复

使用道具 举报

32

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2014-1-4
在线时间
0 小时
 楼主| 发表于 2014-7-21 22:27:26 | 显示全部楼层
我用一个中断,也不行。
回复

使用道具 举报

32

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2014-1-4
在线时间
0 小时
 楼主| 发表于 2014-7-21 22:28:50 | 显示全部楼层
//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY1==0&&KEY2==1)
{
   LED0=0;
LED1=1;
}
else if(KEY1==1&&KEY2==0)
{
   LED1=0;
LED0=1;
}?
回复

使用道具 举报

32

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2014-1-4
在线时间
0 小时
 楼主| 发表于 2014-7-21 22:33:47 | 显示全部楼层
问题是,我往一个方向旋转,比如A信号触发中断,B信号(也就是KEY1==0),应该始终是这个状态,不应该出现KEY1==1的状态,按照上面的时序,应该是这样,但是实际上不是这样的。
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2014-4-23
在线时间
0 小时
发表于 2014-7-29 16:48:07 | 显示全部楼层
回复【10楼】万水千山:
--------------------------------- 
我也是遇到相同的问题,楼主的问题解决了吗?
回复

使用道具 举报

32

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2014-1-4
在线时间
0 小时
 楼主| 发表于 2014-7-29 22:19:12 | 显示全部楼层
问题还没有解决
?  
 if(KEY1==0&&KEY2==1)
 {
      LED11_PWM_VAL++;
  if(LED11_PWM_VAL==900)
    {
  LED11_PWM_VAL=0;
}
   }
  if(KEY1==0&&KEY2==0)
   {
      LED11_PWM_VAL--;
  if(LED0_PWM_VAL==0)
    {
 LED11_PWM_VAL==900;
}
}
上面这个程序,也只控制一个方向,不知道是什么原因?
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2014-6-27
在线时间
981 小时
发表于 2014-7-30 17:31:15 | 显示全部楼层
这个东西用过多了,软件写好一点就行了,用一个中断,一个IO作为输入,在中断里面判断,没问题的。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2014-6-27
在线时间
981 小时
发表于 2014-7-30 17:32:02 | 显示全部楼层
你用电平触发模式
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2014-4-23
在线时间
0 小时
发表于 2014-7-30 17:34:58 | 显示全部楼层
回复【13楼】TinyBoy:
---------------------------------
if(EXTI_GetITStatus(EXTI_Line6)!=RESET)
{
last_b = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8);
do
{
cur_b = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8);
}
while(last_b == cur_b);

if((last_b == 1)&&(cur_b == 0))   
{
key_num = KEY_RIGHT;
}
if((last_b == 0)&&(cur_b == 1))
{
key_num = KEY_LEFT;
}
EXTI_ClearITPendingBit(EXTI_Line6);    
}

我这样写的,还是有问题,
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2014-4-23
在线时间
0 小时
发表于 2014-7-30 17:36:02 | 显示全部楼层
回复【15楼】taven_song:
---------------------------------
我用的下降沿触发模式
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2014-6-27
在线时间
981 小时
发表于 2014-7-30 17:55:50 | 显示全部楼层
我用下降沿触发不稳定,用电平触发模式就可以了。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2014-6-27
在线时间
981 小时
发表于 2014-7-30 17:56:47 | 显示全部楼层
/*
外中断1服务函数,用于编码器解码
解码方法:中断低电平触发,进入中断之后,检测组合脚的电平来判断编码器的旋钮方向

*/
interrupt [EXT_INT1] void ext_int1_isr(void)
{      
        EIMSK&=~0x02;//一进入,禁止中断   
        if(!fencoderRoate)//上次扭编码器动作处理完成或者没有扭动过编码器,进入中断,说明编码器有动作
        {
                if(encoderSignal) 
                        fRoateDirection=left;
                else
                        fRoateDirection=right; 
                fencoderRoate=true;//编码器动作
        }

}
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2014-6-27
在线时间
981 小时
发表于 2014-7-30 17:57:24 | 显示全部楼层
我用AVR写的,你参考一下,希望能帮到你。
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2014-4-23
在线时间
0 小时
发表于 2014-7-30 17:59:59 | 显示全部楼层
明天测试一下,
回复

使用道具 举报

5

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2014-4-23
在线时间
0 小时
发表于 2014-7-31 09:39:24 | 显示全部楼层
回复【19楼】TinyBoy:
---------------------------------
STM32的这个中断没有电平触发模式,设置为上升和下降沿触发肯定是触发两次,有点纠结了
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2014-6-27
在线时间
981 小时
发表于 2014-7-31 10:18:11 | 显示全部楼层
用任意电平触发,判断电平。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2014-6-27
在线时间
981 小时
发表于 2014-7-31 10:20:49 | 显示全部楼层
没有电平触发的,都要判断电平。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2014-6-27
在线时间
981 小时
发表于 2014-7-31 13:41:55 | 显示全部楼层
嗯,不管怎样,中断里面的代码尽量少最好,不要出现delay。
回复

使用道具 举报

4

主题

178

帖子

0

精华

高级会员

Rank: 4

积分
672
金钱
672
注册时间
2019-7-28
在线时间
61 小时
发表于 2020-4-20 22:06:00 | 显示全部楼层
这时一个A/B边缘检测,你一直按电平检测处理,所以“状态”分析结果很奇怪
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 19:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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