AVR定时器0完全资料

Atmega16

    

 

       



 

于定时器0相关的寄存器有 SREG 全局中断  bit7   I

TIMSK中断屏蔽寄存器    bit  0:1   TOIE0  OCIE0


TOIE0中断溢出允许标志位   

OCIE0输出比较允许标志位

TCCR0  timer0控制寄存器 bit0:7


FOC0强制输出比较;仅在非PWM模式有效

WGM00:WGM01 模式控制位;

COM01:COM00 各PWM模式中 具体设置位:





CS00 CS01 CS02  时钟选择位   于定时器2公用


TCNT0   定时器0寄存器八位放置定时器初值

OCR0    定时器0比较匹配寄存器与TCNT0值比较

TIFR   中断标志寄存器 


TOV0   定时器0溢出中断标志位

OCF0   比较匹配中断标志位

下边我们编程先从简单的定时器计数开始

           程序部分

#include<iom16v.h>
#include"dis.h"     //595驱动显示头文件
unsigned  char  i,temp;
void   inittimer0(void)//定时器0初始化函数
{
TCCR0|=(1<<CS00)|(1<<CS02);//普通计数模式,1024分频
TCNT0=0X00;                //赋值
SREG=0X80;               //全局中断打开
TIMSK|=(1<<TOIE0);        //定时器0溢出中断使能
}
void   main(void)
{
DDRC|=0X07;       //595控制端口初始化
inittimer0();     //定时器初始化
dis(0);       //显示函数
while(1){}
}
#pragma interrupt_handler timer0_ovf:10
void  timer0_ovf(void)///定时器中断
{ 
  i++;
  if(i>=4)
  {
    i=0;
    temp++;dis(temp);//数值自加,显示;
    }
}               仿真部分



T0输入产生中断程序及仿真

下边源码中更改TCCR0的配置可决定那种跳变沿触发

下降沿触发 TCCT0|=(1<<CS02)|(1<<CS01);

上升沿触发 TCCT0|=(1<<CS02)|(1<<CS01)|(1<<CS00);

注意这里的上升沿是T0口处于低电平状态,发生了高电平的跳变,配置不需要改变,上升沿下降沿端口配置是一样的

//通过T0引脚触发中断
#include<iom16v.h>
void   initTimer0(void)
{
     TCCR0|=(1<<CS02)|(1<<CS01);//下降沿触发,(1<<CS00)上升沿触发
     TCNT0=0XFE;      //赋值通过按键将寄存器值填满产生中断
     TIMSK|=(1<<TOV0);  //定时器0溢出中断
     SREG|=0X80;      //全局中断
     PORTD|=(1<<PD0);      //初始化T0引脚
     DDRC=0XFF;      //中断产生动作端口初始化
}
void  main(void)
{
initTimer0();
while(1);
}
#pragma interrupt_handler timer0_ovf:10
voidtimer0_ovf(void)
{
  TCNT0=0XFE;    //寄存器重装
  PORTC=~PORTC;    //动作
} 




下边介绍定时器0 的PWM功能,通过上边对定时器的了解下边也会很简单的掌握。选择相位修正模式,WGM00=1;WGM01=0;无分频,CS02=0;CS01=0;CS00=1;

比较匹配选择在升序计数发生比较匹配将清零OC0,降序计数发生时比较匹配将OC0置位.相应控制位COM00=0,COM01=1;TCCR0|=(1<<WGM00)|(1<<COM01)|(1<<CS00);

比较匹配寄存器赋值,比较匹配中断向量为:20

#include<iom16v.h>           
void  initpwmt0(void)          //编写人张小强日期13,09,17
{
TCCR0|=(1<<WGM00)|(1<<COM01)|(1<<CS00);//相位修正PWM
TIMSK|=(1<<OCIE0);            //输出匹配使能
SREG|=0X80;              //全局中断使能
TCNT0=0X00;              //定时器寄存器
OCR0=0X80;                //比较匹配寄存器
DDRB|=(1<<DDB3);            //比较匹配输出引脚初始化
}
voiddelaymsPWM(unsigned  int  z)
{
unsigned  int  x,y;
for(x=1000;x>0;x--)
  for(y=z;y>0;y--);
}
void  main()
{
initpwmt0();              
while(1)
{   
  OCR0++;delaymsPWM(10);        //定时自加
}
}                    //比较匹配中断
#pragma interrupt_handler timer0_comp:20
voidtimer0_comp(void)
{}





至此定时器0大体应用功能讲解完毕,

以上是AVR定时器0完全资料的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>