找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1037|回复: 4
打印 上一主题 下一主题
收起左侧

AC11编码器程序由51单片机改为AVR的问题

[复制链接]
跳转到指定楼层
楼主
ID:611626 发表于 2021-9-9 18:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//函数在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;//                                  标志位清零
            }                       //                                                   
         }                 
}
请教高人,哪里的问题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2021-9-9 21:09 | 只看该作者
EC11放定时器中断函数中进行,1m扫描一次,随便换什么单片机都一样
回复

使用道具 举报

板凳
ID:611626 发表于 2021-9-10 16:32 | 只看该作者
Y_G_G 发表于 2021-9-9 21:09
EC11放定时器中断函数中进行,1m扫描一次,随便换什么单片机都一样

51不用定时器中断都可以,为啥AVR不行
回复

使用道具 举报

地板
ID:161164 发表于 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;

你要确保你的读取代码是正确可用的
回复

使用道具 举报

5#
ID:401564 发表于 2021-9-10 18:23 | 只看该作者
宏达工控 发表于 2021-9-10 16:32
51不用定时器中断都可以,为啥AVR不行

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

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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