标题: AC11编码器程序由51单片机改为AVR的问题 [打印本页]

作者: 宏达工控    时间: 2021-9-9 18:27
标题: AC11编码器程序由51单片机改为AVR的问题
//函数在C51运行正常,改动到ATMEGA8运行不计数,
#define PORTD_BIT   (*((volatile BYTEBIT *)&PORTD))  
#define PIND_BIT   (*((volatile BYTEBIT *)&PIND))   
void ShaoMiao(void)
{    //定义变量:标志          A相         B相
char EC11_Flag=0,Left_Flag=0,Right_Flag=0;//
char EC11_A, EC11_B;//定义两个变量,AC11编码器A相接PD0 B相接PD1
PORTD_BIT.BIT7=EC11_Flag; //状态标志指示灯输出
EC11_A=PIND_BIT.BIT0; //定义编码器A相接PD0状态送变量A
EC11_B=PIND_BIT.BIT1; //定义编码器B相接PD1

if(EC11_A&&EC11_B)  //表示开始第一个脉冲,第二个脉冲两个都为1为转动状
        {
        EC11_Flag =1 ;//  1 在转动状态 0为停止状态;
                PORTD_BIT.BIT7=EC11_Flag; //状态标志指示灯
        }
if(EC11_A!=EC11_B)//第二个信号  A信号不等于B信号 记录下来
            {
     Left_Flag = EC11_A ;    //记录A的信号状态   
            PORTC_BIT.BIT2=Left_Flag; //A指示灯                              
              Right_Flag = EC11_B ;  //记录B的信号状态   
           PORTC_BIT.BIT3=Right_Flag; //B指示灯                          
            }
   
if(EC11_Flag)//结果为真,在转动状态?如果这成立,第二行就不成立了,但是51上可以运行,如果这里条件不成立,下行不执行
         {
          if((EC11_A==0)&&(EC11_B==0))  // 第三个信号,处理第二个信号
            {                        
             if(Left_Flag)  //左转 A相当前低电平计数减                                    
                 {                                
                  count-- ;  //旋转的值减1   
                 }                        
                                 
                         else if(Right_Flag)//右转 B相当前低电平计数减 ==0                !   
                 {
                   count++; //旋转的值加1            
                 }  
                                EC11_Flag = 0;//                                  标志位清零
            }                       //                                                   
         }                 
}
请教高人,哪里的问题
作者: Y_G_G    时间: 2021-9-9 21:09
EC11放定时器中断函数中进行,1m扫描一次,随便换什么单片机都一样
作者: 宏达工控    时间: 2021-9-10 16:32
Y_G_G 发表于 2021-9-9 21:09
EC11放定时器中断函数中进行,1m扫描一次,随便换什么单片机都一样

51不用定时器中断都可以,为啥AVR不行
作者: lkc8210    时间: 2021-9-10 17:03
把51版本的代码也放上来吧~!

51和AVR的最大分别就是IO口的读写方法
51可以sbit P40 = EC11_A;直接读取IO口电平
AVR要写多一步:#define PIND_BIT   (*((volatile BYTEBIT *)&PIND))   EC11_A=PIND_BIT.BIT0;

你要确保你的读取代码是正确可用的
作者: Y_G_G    时间: 2021-9-10 18:23
宏达工控 发表于 2021-9-10 16:32
51不用定时器中断都可以,为啥AVR不行

没有用过AVR,不知道
有可能AVR端口像PIC一样,读取和输出要先设定端口寄存器的,你看一下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1