稳定可靠增量EC11程序
稳定可靠增量EC11程序CPU是PIC24FJ64GA006,占用RF4、RF5,其中CN18(RF5)边缘中断,返回全局变量EC11_VAL,用定时器TMR3 计数两个脉冲之间小于5MS就每次加减20,如果调节范围不大可不用定时器。
#define EC11_A_RF5
#define EC11_B_RF4
void __attribute__((__interrupt__,no_auto_psv)) _CNInterrupt(void) //外部中断(DS3231,1秒)
{
static uchar m_RF5,int_nu,int_nu1;
extern int EC11_VAL;
_CNIF=0;
if(m_RF5!=_RF5) //CN18(RF5)中断
{
if(EC11_A==0 && EC11_B==0 && int_nu==0)
{
int_nu=1;
TMR3=0;
}
if(EC11_A==1 && EC11_B==1 && int_nu==1)
{
++EC11_VAL;
int_nu=0;
int_nu1=0;
if( TMR3<300) EC11_VAL=EC11_VAL+20; //0.0625*256*300=4800us
}
if(EC11_A==0 && EC11_B==1 && int_nu1==0)
{
int_nu1=1;
TMR3=0;
}
if(EC11_A==1 && EC11_B==0 && int_nu1==1)
{
--EC11_VAL;
int_nu1=0;
int_nu=0;
if( TMR3<600) EC11_VAL=EC11_VAL-20; //0.0625*256*600=9600us
}
__delay32(4800);//300Us
m_RF5=_RF5;
}
本帖最后由 机器人天空 于 2014-11-13 11:27 编辑
mark学习一下楼主的中断方式,以前普通IO口每秒读取一次也不会漏检
http://www.amobbs.com/thread-5550656-1-1.html 机器人天空 发表于 2014-11-13 11:13
mark学习一下楼主的中断方式,以前普通IO口每秒读取一次也不会漏检
http://www.amobbs.com/thread-5550656- ...
中断好,不用时不占用CPU。 楼主你的是上升沿下降沿一起触发,还是其中一种? 能否说下你的思路,还是有点看不明白,我的做法是顺时针:AB=11,01,00,10;逆时针:AB=11,10,00,01通过判断测试用0010、0001来识别
本帖最后由 lyl3257 于 2014-11-13 12:01 编辑
wwwdege 发表于 2014-11-13 11:42
楼主你的是上升沿下降沿一起触发,还是其中一种?
只中断一相,上升沿下降沿都中断,另一相中断后读取,最好用示波器或逻辑分析仪看一下,中断的前沿有不规则的抖动。倒数第二句延时就是消抖动的(不让进来的太快) 我有20个EC11 要读取 问LZ的程序怎么使 RAMILE 发表于 2014-11-13 12:02
我有20个EC11 要读取 问LZ的程序怎么使
一样用中断只是要40个CPU退 lyl3257 发表于 2014-11-13 12:04
一样用中断只是要40个CPU退
没有这么多io中断,何解 学习一下 RAMILE 发表于 2014-11-13 12:06
没有这么多io中断,何解
IO扩张啊,如PCF8574T lyl3257 发表于 2014-11-13 11:32
中断好,不用时不占用CPU。
是的,以后用你这种方法{:lol:} lyl3257 发表于 2014-11-13 11:54
只中断一相,上升沿下降沿都中断,另一相中断后读取,最好用示波器或逻辑分析仪看一下,中断的前沿有不规 ...
嗯 谢谢 我试一下你的方法 谢谢分享!
页:
[1]