专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

avr单片机定时器0溢出中断程序

作者:huqin   来源:本站原创   点击数:  更新时间:2014年03月02日   【字体:

       2014年2月17日22:26:32  
       芯片名称:  AVR (艾特梅尔公司)mega16A 微控制器芯片;
       开发板:  自主研发的 YF-A1芯片开发板;  (YF :是本人名字缩写 )

        第53次试验,用逻辑分析仪捕捉,输出于IO口的数字,脉冲信号,脉冲信号宽度:1.5~1.8微妙,每9~11个脉宽1.5us的信号时序中,夹杂着一个脉宽位为3微妙的高脉冲信号.
       我用了好几个小时都计算不出定时器0内部的时钟频率........哪里出错了呢?
      外部用12兆晶体整荡器;
      我的计算结论是:定时器0内部频率为32khz     ,但是这显然有问题.
      定时器时钟为内部8分频  TCCR0=0X02; TCNTO初始值250,即每6个时钟周期溢出一次,每溢出一次,PB口电平取反一次,      就这样反向计算    脉宽  1.5us ÷  6  ==每一个被分频的时钟时间  ÷ 8 =时钟频率;

/*   
    写这个程序我用了3个多小时,反复实验.苍天不负有心人额,,哎╮(╯▽╰)╭,,,,,

       程序名:   定时器0溢出中断

    概述:   定时器每一毫秒溢出一次,溢出500次,即0.5秒 ,LED灯跳变一次,我发现,如果
  不将所有io口初始化,芯片将变得极其不稳定,无法正常工作,定时器0 溢出标志位
  TOV0 一旦溢出,进入中断服务程序后,将自动清零,再无需软件清零,我似乎明白了硬
  件清零的意思;

       finish time :2014年2月28日20:40:21;

*/


#include <avr/io.h>
#include <avr/interrupt.h>
#include<avr/signal.h>

typedef unsigned char uint8;
typedef unsigned  int uint16;

volatile uint16 a=0;

void io(void)
{
  DDRA=0XFF;
  PORTA=0X00;

  DDRB=0XFF;
  PORTB=0X00;

  DDRC=0XFF;
  PORTC=0X00;

  DDRD=0XFF;
  PORTD=0X00;


}

 

int main(void)
{

   io();
  
   TIMSK=0X01; // 溢出中断使能;

   sei();     //全局中断使能;

   TCNT0=69;  //定时器初始值1毫秒溢出;

   TCCR0=3;    //64分频定时器开始运行!;

   PORTB=4;    //8位LED共阳极使能;
  

   while(1);  //死循环;
 

 

}

 

SIGNAL(SIG_OVERFLOW0)  //中断服务程序;
{
   static uint16 s=0; //  静态变量;
  
   TCNT0=69;  //重设定时器初始值;
 
    s++;      
   if(s==502)   //每500毫秒PA口电平跳变一次!
   { s=0;
     PORTA^=0XFF;
    
}
 
 
 //  TIFR=0X01;//将定时器0溢出标志位和比较匹配标志位置一清零;

}

关闭窗口

相关文章