一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2295|回复: 15
收起左侧

[avr] 上了一个选择编码开关,照抄了一段代码,结果出大事鸟,求解

[复制链接]
发表于 2015-7-21 18:36 | 显示全部楼层 |阅读模式
上了一个选择编码开关,照抄了一段代码,结果出大事鸟,求解
先声明楼主论坛菜鸟一枚

AVR16 中断0接了一个旋转编码器,抄的网上的代码,选择编码开关转动的时候后反映,就是结果不正常,上代码先
  1. ISR(INT0_vect)
  2. {
  3.         GICR =0x00;
  4. if (Bit_Get(PIND,2)==1)
  5.         {
  6.                 if (Bit_Get(PIND,1)==0)
  7.                
  8.                 {
  9.                         sumx++;
  10.                 }else
  11.                 {
  12.                         sumx--;
  13.                 }
  14.         }else
  15.         {
  16.                 if (Bit_Get(PIND,1)==0)
  17.                
  18.                 {
  19.                         sumx++;
  20.                 }else
  21.                 {
  22.                         sumx--;
  23.                 }
  24.        
  25.         }
  26.   GIFR  |= (1 << INTF1) | (1 << INTF0);
  27.   GICR =0xC0;//0xC0 */
复制代码
main函数里面这样处理的

  1.            itoa(sumx,strr,10);
  2.           display_string_5x7(5,1,strr)
复制代码
变量定义这样的
  1. uint sumx =1;
  2. uchar strr[25]={0};
复制代码
然后奇怪的事情就来了,选择编码开关的时候数字会变,但是哪个结果啊,变化的也太大了吧,按理应该是转一下加或者减一的,结果差了十万八千里,实在搞不明白了,上坛子请教,
个人感觉是 int 转uchar不对,但是不知道该怎么处理
 楼主| 发表于 2015-7-21 18:37 | 显示全部楼层
补充一下,display_string_5x7(5,1,strr)显示函数肯定是对的,因为显示DS18B20的温度是正常的
发表于 2015-7-21 22:01 | 显示全部楼层
中断函数内部 if 之前加上消抖处理试试
发表于 2015-7-22 09:08 | 显示全部楼层
本帖最后由 xrff_z 于 2015-7-22 09:17 编辑

程序中 if (Bit_Get(PIND,2)==1)这个判断没用啊,是和否执行的程序一样。是不是有什么特殊用途。

(PIND,2接的是什么。编码器的三个脚 1接中断输入,2接地,3接检测判断)

uint sumx =1;感觉也不妥啊,反方向转会不够减啊。因为是Uint,会造成数字变到最大吧。


AVR不太懂,仅供参考。


还有一种编码器,旋转时,只会有1个脚与中间脚接触(没拆过,只是电路上分析出来的,没有利用中断,就按两个普通按钮处理的)。

再补充一点,手感上的转一格,反映到数字上不会一一对应的。转一格,可能会不动,也有可能变好几个。







发表于 2015-7-22 13:03 | 显示全部楼层
消抖没有?
就像热键,按一次可以跳动几次
 楼主| 发表于 2015-7-22 18:45 | 显示全部楼层
blackspider_e 发表于 2015-7-22 13:03
消抖没有?
就像热键,按一次可以跳动几次

现在感觉不是消抖的问题了,用示波器看了看,感觉之前的代码逻辑好像有问题,现在改了一下,可以减少,就是不能增加,等下发示波器的图片,大家帮忙研究一下呢
 楼主| 发表于 2015-7-22 18:51 | 显示全部楼层
今天用示波器看了一下旋转时候的波形,把代码也改了一下
  1. ISR(INT0_vect)
  2. {
  3.         GICR =0x00;
  4.        

  5. if ((Bit_Get(PIND,2)==1)&&(Bit_Get(PIND,1)==0))
  6.                 {
  7.                         step--;
  8.                 }
  9. if ((Bit_Get(PIND,2)==0)&&(Bit_Get(PIND,1)==0))               
  10.                 {
  11.                         step--;
  12.                 }
  13.        
  14.   GIFR  = 0xff;
  15.   GICR =0x40;//0xC0

  16.   
  17. }
复制代码
左旋转的时候基本上按减1在走了,就是右旋的时候居然没反映。
 楼主| 发表于 2015-7-22 18:52 | 显示全部楼层
左旋转的波形,刚才图没贴上

右旋转的波形

右旋转的波形
 楼主| 发表于 2015-7-22 18:55 | 显示全部楼层
左旋波形
无标题.jpg
 楼主| 发表于 2015-7-22 18:56 | 显示全部楼层
xrff_z 发表于 2015-7-22 09:08
程序中 if (Bit_Get(PIND,2)==1)这个判断没用啊,是和否执行的程序一样。是不是有什么特殊用途。

(PIND ...

从波形上看,针脚应该是接对了的

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-28 16:34 , Processed in 0.066301 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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