打印
[AVR单片机]

帮我看看为什么程序会出现这样的现象?

[复制链接]
1818|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
杜专|  楼主 | 2009-12-16 23:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序1:
//2009/12/16
#include <iom16v.h>   //包含型号头文件
#include <macros.h>   //包含"位"操作头文件
int k;
/************************************************
*函数名称: void Timer0_init(void)
*入口参数: 无
*出口参数: 无
*函数功能: Timer0初始化
*创建时间: 2009-09-05 eleShrimp
*修改说明:
/************************************************/
void Timer0_init(void)
{
TCCR0|=0x05;  //普通计时模式,普通端口操作,预分频为64
TCNT0=61;   //频率为2.5KHz        
SREG|=BIT(7);  //开放全局中断
TIMSK|=BIT(TOIE0); //开放TIMER0溢出中断
DDRA|=BIT(PA0);  //配置PA0引脚为输出      
}
/************************************************
*函数名称: void port_init(void)
*入口参数: 无
*出口参数: 无
*函数功能: 端口初始化
*创建时间: 2009-09-01 eleShrimp
*修改说明:
/************************************************/
void port_init(void)
{
PORTA = 0xFF;
DDRA  = 0xFF;
PORTB = 0xFF;
DDRB  = 0xFF;
PORTC = 0xFF; //m103 output only
DDRC  = 0xFF;
PORTD = 0xFF;
DDRD  = 0xFF;
}
/************************************************
*函数名称: void init_devices(void)
*入口参数: 无
*出口参数: 无
*函数功能: 设备初始化
*创建时间: 2009-09-01 eleShrimp
*修改说明:
/************************************************/
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
/************************************************
*函数名称: void main(void)
*入口参数: 无
*出口参数: 无
*函数功能: 完成初始化,等待TIMER0中断
*创建时间: 2009-09-05 eleShrimp
*修改说明:
/************************************************/
void main(void)
{
init_devices( );       //初始化开发板
Timer0_init();    //初始化定时器0
while(1)     //等待中断
{
PORTA ^= 0x02;
}
}
#pragma interrupt_handler Timer0:10
/************************************************
*函数名称: void Timer0(void)
*入口参数: 无
*出口参数: 无
*函数功能: Timer0的溢出中断服务函数
*创建时间: 2009-09-05 eleShrimp
*修改说明:
/************************************************/
void Timer0(void)
{
TCNT0 = 0x3c;
   k=k+1;
   if(k>20)
   {
   k=0;
   PORTA ^= 0x01;
  }
}

相关帖子

沙发
杜专|  楼主 | 2009-12-16 23:40 | 只看该作者
程序2:
//程序调试成功
//2009/12/16
#include <iom16v.h>                        //包含型号头文件
#include <macros.h>                        //包含"位"操作头文件
int k;
/************************************************
*函数名称: void Timer0_init(void)
*入口参数: 无
*出口参数: 无
*函数功能: Timer0初始化
*创建时间: 2009-09-05        eleShrimp
*修改说明:
/************************************************/
void Timer0_init(void)
{
        TCCR0|=0x05;                //普通计时模式,普通端口操作,预分频为64
        TCNT0=61;                        //频率为2.5KHz                                                         
        SREG|=BIT(7);                //开放全局中断
        TIMSK|=BIT(TOIE0);        //开放TIMER0溢出中断
        //DDRA|=BIT(PA0);                //配置PA0引脚为输出                                  
}

/************************************************
*函数名称: void port_init(void)
*入口参数: 无
*出口参数: 无
*函数功能: 端口初始化
*创建时间: 2009-09-01        eleShrimp
*修改说明:
/************************************************/
void port_init(void)
{
        PORTA = 0xFF;
        DDRA  = 0xFF;
        PORTB = 0xFF;
        DDRB  = 0xFF;
        PORTC = 0xFF;        //m103 output only
        DDRC  = 0xFF;
        PORTD = 0xFF;
        DDRD  = 0xFF;
}

/************************************************
*函数名称: void init_devices(void)
*入口参数: 无
*出口参数: 无
*函数功能: 设备初始化
*创建时间: 2009-09-01        eleShrimp
*修改说明:
/************************************************/
void init_devices(void)
{
        //stop errant interrupts until set up
        CLI(); //disable all interrupts
        port_init();

        MCUCR = 0x00;
        GICR  = 0x00;
        TIMSK = 0x00; //timer interrupt sources
        SEI(); //re-enable interrupts
        //all peripherals are now initialized
}

/************************************************
*函数名称: void main(void)
*入口参数: 无
*出口参数: 无
*函数功能: 完成初始化,等待TIMER0中断
*创建时间: 2009-09-05        eleShrimp
*修改说明:
/************************************************/
void main(void)
{
        init_devices( );                                   //初始化开发板
        Timer0_init();                         //初始化定时器0
        while(1)                                        //等待中断
        {
        PORTA ^= 0x02;
        }
}

#pragma interrupt_handler Timer0:10
/************************************************
*函数名称: void Timer0(void)
*入口参数: 无
*出口参数: 无
*函数功能: Timer0的溢出中断服务函数
*创建时间: 2009-09-05        eleShrimp
*修改说明:
/************************************************/
void Timer0(void)
{
        TCNT0 = 0x3c;
         k=k+1;
         if(k>20)
         {
         k=0;
         PORTA ^= 0x01;
         }
}

使用特权

评论回复
板凳
杜专|  楼主 | 2009-12-16 23:45 | 只看该作者
程序1
和程序2
的区别 就是在  void Timer0_init(void)
中加了一个DDRA|=BIT(PA0);  

程序1 中加了  DDRA|=BIT(PA0);  
程序2中 没有加  DDRA|=BIT(PA0);  
出现的现象是,当在函数  Timer0_init()加了DDRA|=BIT(PA0)  发光LED闪烁的 慢些

而没有加DDRA|=BIT(PA0) 的发光LED 闪烁的快些,这是为什么啊?

使用特权

评论回复
地板
杜专|  楼主 | 2009-12-17 10:17 | 只看该作者
指的是PA0 口的状态

麻烦大家顶下


我怕帖子沉到湖底去

使用特权

评论回复
5
杜专|  楼主 | 2009-12-17 10:17 | 只看该作者
在次 顶自己的贴

使用特权

评论回复
6
ningling_21| | 2009-12-17 11:06 | 只看该作者
原来是什么现象?
改后是什么现象?

使用特权

评论回复
7
杜专|  楼主 | 2009-12-17 12:22 | 只看该作者
程序1:原来是 PA0的灯 闪 的频率慢些
程序2:改后是 PA0的灯 闪的频率快些

加了这个DDRA|=BIT(PA0);   和没有这个区别怎么大

使用特权

评论回复
8
杜专|  楼主 | 2009-12-17 16:42 | 只看该作者
终于 出水面 了

麻烦大侠指导
谢谢

使用特权

评论回复
9
杜专|  楼主 | 2009-12-17 16:43 | 只看该作者
真的想知道为什么?

使用特权

评论回复
10
杜专|  楼主 | 2009-12-17 20:58 | 只看该作者
难道这么难嘛

使用特权

评论回复
11
wangwo| | 2009-12-17 21:38 | 只看该作者
帮顶!一看那么长的两段程序估计已经吓跑不少人了

使用特权

评论回复
12
杜专|  楼主 | 2009-12-17 22:01 | 只看该作者
上面的程序

timer04.rar

907 Bytes

使用特权

评论回复
13
杜专|  楼主 | 2009-12-18 12:56 | 只看该作者
帖子有沉下去了

我要顶上来

使用特权

评论回复
14
杜专|  楼主 | 2009-12-18 12:56 | 只看该作者
我要顶上来

使用特权

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

本版积分规则

个人签名:在通往牛X的道路上,我们一路狂奔! 本人所有发言均为个人观点。由此帖带来的后果,本人一般不予负责。论坛是论坛!

116

主题

1278

帖子

3

粉丝