基本信息
文件名称:Arduino 系列:Arduino Gemma (基于 ATtiny85)_(13).高级功能:定时器与中断.docx
文件大小:20.75 KB
总页数:10 页
更新时间:2025-06-24
总字数:约4.14千字
文档摘要

PAGE1

PAGE1

高级功能:定时器与中断

定时器

定时器是单片机中非常重要的一个组件,它允许在指定的时间间隔内执行特定的任务。对于基于ATtiny85的ArduinoGemma,定时器主要用于生成定时中断、控制延时和实现精确的时间测量。ATtiny85内部有两个8位定时器,分别为Timer0和Timer1。这些定时器可以配置为不同的模式,以满足不同的应用需求。

Timer0

Timer0是一个8位定时器,它具有以下几种工作模式:

正常模式:定时器从0计数到255,然后重新从0开始。

CTC模式(ClearTimeronCompareMatch):定时器达到预设值后清零,并生成中断。

快速PWM模式:定时器从0计数到255,然后从255计数回0,用于生成PWM信号。

相位正确PWM模式:定时器从0计数到255,然后从255计数回0,用于生成更精确的PWM信号。

Timer1

虽然ATtiny85只有一个8位定时器(Timer0),但可以通过软件模拟实现一个16位定时器的功能。Timer1的工作模式与Timer0类似,但具有更高的精度和更大的计数范围。

定时器配置

配置定时器通常涉及以下几个步骤:

选择定时器模式:通过设置控制寄存器(如TCCR0A和TCCR0B)来选择定时器的工作模式。

设置预分频器:预分频器用于减慢定时器的计数速度,从而实现更长的时间间隔。

设置比较值:在CTC模式下,设置OCR0A寄存器来指定定时器达到的值。

启用中断:通过设置相应的中断使能位(如TIMSK0)来启用定时器中断。

示例:使用Timer0生成1秒定时中断

以下是一个使用Timer0生成1秒定时中断的示例代码。我们将使用CTC模式和预分频器来实现这一功能。

//定义定时器中断服务例程

ISR(TIMER0_COMPA_vect){

//在这里执行定时任务

staticintcount=0;

count++;

if(count=10){

count=0;

//每10次中断(1秒)执行一次任务

digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));//切换LED状态

}

}

voidsetup(){

//设置LED管脚为输出

pinMode(LED_BUILTIN,OUTPUT);

//配置Timer0为CTC模式

TCCR0A=0;//清零TCCR0A

TCCR0B=0;//清零TCCR0B

TCCR0A|=(1WGM01);//设置CTC模式

//设置预分频器为1024

TCCR0B|=(1CS02)|(1CS00);

//设置比较值为244(244*64*0.0625=100ms)

OCR0A=244;

//启用Timer0比较匹配中断

TIMSK0|=(1OCIE0A);

//启动定时器

TCCR0B|=(1CS02)|(1CS00);

//使能全局中断

sei();

}

voidloop(){

//主循环中不需要其他操作

}

中断

中断是单片机在执行正常程序时,由于外部事件或内部条件的触发而暂时停止当前任务,转去执行中断服务例程(ISR)的一种机制。中断可以显著提高系统的响应速度和效率。ArduinoGemma支持多种中断源,包括定时器中断、外部中断和I2C中断等。

外部中断

外部中断通常由外部硬件事件触发,例如按钮按下或传感器变化。ATtiny85支持两个外部中断源,分别是INT0和INT1。这些中断源可以通过配置相应的寄存器来启用和选择触发条件。

示例:使用外部中断检测按钮按下

以下是一个使用外部中断检测按钮按下的示例代码。我们将使用INT0中断源来检测按钮状态。

//定义按钮管脚

constintbuttonPin=2;

//定义LED管脚

constintledPin=1;

//中断服务例程

ISR(INT0_vect){

//按钮按下时切换LED状态

digitalWrite(ledPin,!digitalRead(ledPin));

}

v