打印
[AVR单片机]

新手求助:mega8单片机不能正常读取引脚状态

[复制链接]
4002|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qinfangxiaoran|  楼主 | 2012-12-19 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qinfangxiaoran 于 2012-12-19 12:00 编辑

使用ATmega8控制一小电机运转,IO口为PORTB.0,在电机运转过程中会触发一行程开关,用PORTB.1脚接收此开关的信号,信号宽度约为250ms(高电平)。用示波器观察此引脚,可以观察到正确信号。而且很理想,高电平5V,低电平0V。用PORTD.3引脚控制一LED来指示开关状态,源代码如下所示。现在的情况是,在一块电路板上LED可以正确指示出开关状态,但同样的程序在另一同样的电路板上指示灯却处于常亮状态,诚心求解!急!
开发环境:AVR Studio4.1 + GCC
外部晶振:7.3728M
熔丝位设置:D9FF。
附源代码:
#include <avr/io.h>                        //包含必要头文件
#include <util/delay.h>
#include "Mega8Usart.c"                //包含串口程序文件

#define Fosc 7372800                //定义晶振频率
#define Boud 9600                        //定义通信波特率
typedef struct _bit_struct                //定义寄存器或端口的8个位
{
        unsigned char bit0:1;
        unsigned char bit1:1;
        unsigned char bit2:1;
        unsigned char bit3:1;
        unsigned char bit4:1;
        unsigned char bit5:1;
        unsigned char bit6:1;
        unsigned char bit7:1;
}BitField;

#define GetBitField(addr) (*((volatile  BitField *) & (addr)))         //定义一个宏,用于取得位值

//端口定义
#define MotoRun GetBitField(PORTB).bit0                //PORTB.0,Moto Control Pin
#define TravelSwitch GetBitField(PINB).bit1        //PORTB.1,Travel Switch Pin
#define UsartDirect GetBitField(PORTB).bit2                //PORTB.2,Usart Direct Select Pin
#define LedGreen GetBitField(PORTD).bit3                 //LED指示灯引脚定义

unsigned char MotoRunCircle(void);     //函数声明,电机转动一周

void MotoRunTest(void);        //电机测试函数
void UsartTest(void);           //通信测试函数

int main(void)
{
    unsigned char i = 0;  
        unsigned char HostAddress,MotoState,temp;
        unsigned char ReceData[5];
         
        DDRB |= 0x05;
    PORTB = 0xff;
        DDRC = 0xc0;
        DDRD = 0x3c;
    UsartInit();
        UsartDirect = 1;

        while(1)
        {
                temp = PINB;
                if(TravelSwitch)
                        LedGreen = 0;
                else
                        LedGreen = 1;
        }
}


相关帖子

沙发
huangxz| | 2012-12-19 23:53 | 只看该作者
现在的情况是,在一块电路板上LED可以正确指示出开关状态,但同样的程序在另一同样的电路板上指示灯却处于常亮状态,

检查下配置位(熔丝位)是不是一样的,如果是一样的,还是检查硬件吧。

使用特权

评论回复
板凳
qinfangxiaoran|  楼主 | 2012-12-20 08:54 | 只看该作者
非常感谢关注。
熔丝位是一样的,程序也是一样的。硬件上也没有看出什么问题。
另外还有一个问题,就是如果在程序中调用延时函数,如_delay_ms(),就会出现电机控制不好的现象,有时正常转动一周,有时转起来不停,有时又稍稍动一下就不动了。
给我的感觉是单片机处于不稳定工作状态,但又不知道是哪里的问题。

使用特权

评论回复
地板
huangxz| | 2012-12-20 13:57 | 只看该作者
硬件问题直接包含电压是不是稳定,avr一般工作在5v,也有3.3v的,其实从你运行的现象来看,基本可以定位是硬件问题了。
有时候晶振不稳定,比如匹配电容不合适啊,也会造成单片机运行不稳定。
另外电机控制部分的代码你在帖子上没给出,不知道是何种电机,直流电机,步进电机.....?
不同电机的控制方式是不一样的 ,delay_ms()是纯指令延时,在电机控制中延时一般希望用中断实现,纯指令延时把cpu的执行占用太多,不建议使用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

0

粉丝