Atmage16中断学习—定时器/计数器

来源:互联网 发布:php传递参数调用python 编辑:程序博客网 时间:2024/05/16 04:55

(1)定时器/计数器的工实质是什么?

它的实质其实就是一个加1计数器,通过对其内部寄存器的操作来实现计数、定时的功能。

(2)什么是分频器?为什么要用到分频器?

分频器就是将一种频率通过它可以根据具体的需要转换成另一种频率的一种装置。

单片机的系统时钟频率越高,单片机运行的越快,如果其外设的性能不高跟不上单片机运行的速度,就很容易造成程序跑飞。因此,需要将系统时钟降低,所采用的策略就是分频。这样,当系统时钟过高时,就可以利用分频器转化出适合的时钟频率。

上图为Atmage16中T/C0与T/C1共用的预分频器。可以操作CSnn将系统时钟转化为不同的时钟源。可以操作一个单片机的寄存器来实现系统时钟的转化。

T/C0是操作TCCR0寄存器(TC控制寄存器)



T/C1是操作TCCR1B寄存器



(3)Atmage16定时器/计数器介绍

Atmage16共有三个定时器/计数器,分别为:T/C0,T/C1,T/C2 。其中T/C0,T/C2 为8位定时器/计数器;T/C1为16为定时器/计数器。8位计数器的最大值为:2^8-1即255;

16位计数器的最大值为:2^16-1即65535

与定时器相关的寄存器有:  

1、AVR中断寄存器SREG:


BIT7—I为全局中断是能位,如果I清零,怎无论其他中断标志是否置位,都不会产生中断。

2、T/C中断屏蔽寄存器TIMSK


Bit7——T/C2   输入比较匹配中断使能

Bit6——T/C2   溢出中断使能

Bit5——T/C1   输入捕捉中断使能

Bit4——T/C1   输入比较A匹配中断使能

Bit3——T/C1   输入比较B匹配中断

Bit2——T/C1   溢出中断使能

Bit1——T/C0   输出比较匹配中断使能

Bit0——T/C0   溢出中断使能

(4)T/C普通模式


由上图可以很清楚的看出T/C普通模式工作的一般步骤:可以通过外部振荡直接到计数器然后到中断系统;还可以通过熔丝配置然后通过TCCRn控制寄存器操作分频器,然后再通过计数器,然后通过中断屏蔽寄存器TIMSK使能相应的中断,最后通过SREG开启总中断。

所以,如果利用内部RC振荡器做系统时钟,对T/C进行初始化的步骤:

1、操作控制寄存器TCCRn;

2、操作计数寄存器TCNTn(如果是T/C1则TCNT1H、TCNT1L)

3、操作中断屏蔽寄存器TIMSK

4、操作总中断SERG


codeblock编译器下,定时器初始化

定时器0:

void timer0_init(){    SREG |= 0x80;    TIMSK |= 0x01;//T/C0溢出中断使能    TCCR0 |= (1<<2);    TCNT0 = 0;}ISR(TIMER0_OVF_vect){    TCNT0 = 0;    count++;    if(count == 255)    {        count = 0;    }}
定时器1:

void timer1_init(){    SREG |= 0x80;//开通总中断    TIMSK |= 0x04;//T/C1溢出中断使能    TCCR1B |= (1<<0);//无预分频 TCCR1B |= 0x01;    TCNT1H = 0;    TCNT1L = 0;}ISR(TIMER1_OVF_vect){    TCNT1H = 0;    TCNT1L = 0;    count ++;    if(count == 9999)    {        count = 0;    }}
定时器2:

void timer2_init(){    SREG |= 0x80;    TIMSK |= 0x40;//T/C2溢出中断使能    TCCR2 |= (1 << 2);    TCNT2 = 0;}ISR(TIMER2_OVF_vect){    TCNT2 = 0;    count ++;    if(count == 255)    {        count = 0;    }}










0 0