中断概念
一、在程序运行期间,发生非预期的紧急事件
1、通常是为了避免查询方式的程序设计(它低效因为一直查询,死循环一直不停查询)
2、用的最多的是外部中断与定时器中断(主要产生一些精确地延时,省去了CPU延时CPU延时就不能干其他事情了所以可以提高CPU效率)
3、外部中断:按键程序
4、定时器中断:定时与循环扫描应用场合
二、中断服务程序
1、中断发生时,主程序暂停,跳转到中断服务程序,称为“相应中断”
2、执行完毕后返回主程序继续运行
1、M16具有3个外部中断
2、INT0、INT1:
3、INT2
二、中断相关库函数的头文件
1、 avr/interrupt.h
三、中断服务程序
SIGNAL(SIG_INTERRUPT0)
{
}
四、中断有关的寄存器
1、MCUCR
2、MCUCSR
3、GICR
//ATmega16 技术文档
由:The External interrupt are triggered by the INT0
,INT1
INT0/INT1/INT2 分别对应单片机的16、17、3脚不过在开发过程中INT2不常用。
observe that ,if enabled the interrupts will trigger even if the INT0..2pins are configured as outputs.可得即使中断引脚配置成输出,只要使能了中断,电平发生了变化就会触发。
the feature provides a way
上图不明显但是可以看出高四位 是灰色的是用于其他用途。
ISC01
外部中断有个三个INT1 INT0
看看中断1的控制寄存器
MCUCR
ISC11
0
1
1
我们用的比较多的是后两种方式
MCUCR 这个寄存器有8位就是配置INT0和INT1的触发方式。
中端0的和1是一样所以不再解释了哦,如下图。
下一个寄存器是MCUCSR
这个异步外部中断2 是外部中断2脚激活 SREG 1-bit and 相应的中断屏蔽位GICR 设置。加入ISC2写
0,一个falling edge (下降沿) 开INT2
第三个寄存器是通用外部中断控制寄存器
这个寄存器的高三位用来使能外部中断请求 INT1
第四个寄存器是中断标志寄存器对于初学者一般用不到
当外部中断发生的时候相应的外部中断寄存器就会置1,被单片机内部置1,我们可以将他读出来,但是一般不用去读这个标志位,自动就会进入中断服务程序。所以ATmega16
的三个外部中断主要就样子。而我们用的比较多的就是中断0
这是中断0的,这个在哪查询到的呢?在AVR 单片机GCC程序设计这本电子书,在第四章 功能模块编程示例 4.1首先就是中断服务程序看下图。
你看signame
在新版的AVR GCC 中avr/signal.h
以后就不用包含了,已经没有了。所以只包含avr/interrupt.h就可以了。
跟中断有关的寄存器刚才说过了有(MCUCR/MCUCSR/GICR
外部中断的使用步骤
一、第一步:包含头文件
二、第二步:设置中断触发方式、
三、第3步:使能响应相应外部中断
四、第4步:使能全局中断
五、第五步:编写中断服务程序
SIGNAL(SIG_INTERRUPT0){}
根据以上步骤我们编写一个外部中断0的程序
第一步打开AVR
Studio
首先对所有的AVR 的程序都必须包含的一个头文件#include
INT0 (PD2)接在 K1上,它在常态下属于低电平因为有一个10K的下拉电阻。按下接通电源。
而对于INT1(PD3) 是在 K2上它在常态下属于高电平 。按下到地了低电平。
#include
#include
int main(void){
}
SIGNAL(SIG_INTERRUPT0){
}
SIGNAL(SIG_INTERRUPT1){
}
以上是外部中断就将这么多下面讲定时器、一般单片机分为8位和16位定时器两种,ATmega 16 有2个 TC0 TC2 8位及一个16位的TC1 。2种功能定时、计数、实际就是一个计数的功能讲值保存在计数寄存器里面。
---------------------------------------------------------------------------
定时器的概念
ATmega 16具有3个定时器 0 1 2 。
一、8位定时/计数器的模型
2、1个时钟输入端口,计数寄存器对时钟输入端口的时钟脉冲个数进行加1计数,即每来一个时钟脉冲,寄存器的数值自加1
理解:计数功能保存在计数寄存器里面。
二、如何实现精确定时?
当然定时器的最简单的应用就是溢出方式的应用。ATmega16 具有3个定时器 0 、1 、2定时器0是属于功能最简单的定时器。
三、M16的定时器0(定时器0是一个功能最简单的定时器)
技术文档:
Timer/Counter0 is a general purpose, single compare unit, 8-bit Tim
main features are:
?? Single Compare Unit Counter
?? Clear Timer on Compare Match (Auto Reload) 比较匹配发生时清除定时器(自动加载)
?? Glitch-free, Phase Correct Pu lse Width Modulator (PWM) 无干扰脉冲,相位正确的PWM
?? Frequency Generator 频率发生器
?? External Event Counter 外部事件计数
?? 10-bit Clock Prescaler 10位的时钟分频器(值得注意可以把单片机分频得到时间长点的定时)
?? Overflow and Compare Match Interrupt Sources (TOV0 and
OCF0)
8位Timer/Counter0
1、单通道比较计数器
2、清除比较匹配发生(自动加载)就是比较匹配发生时清除定时器(自动加载)这个初学者不用关心
3、释放干扰脉冲,相位改正脉冲宽度调制器(PWM)就是无干扰脉冲相位正确的PWM
4、频率发生器
5、外部事件计数器
6、10位时钟预分频器(比如单片机晶振16MHZ可以进行一些预分频然后提供时钟给定时器)
7、溢出和比较匹配中断源(TOVO
and OCFO)就是2个中断源一个是溢出中断
比较匹配中断一般应用于PWM
应用时使用。这里只说下TOV0
就是溢出中断。
和定时器0 有关的寄存器我们看8位定时/计数器寄存器的说明。
首先它有一个控制寄存器 TCCR0
Timer/Counter Control
Register – TCCR0
它的从第7位到第3位都是跟PWM有关的,这里我们先不去讲解,而 0 1 2 这3位是非常重要的,看下图,可以通过选择这3位可以对CPU时钟进行预分频然后提供给定时器0使用。
其实经过分频这个定时的时间长度跨度就非常大了。比晶振频率慢了当然时间长了
第2个寄存器叫TCNT0
如下图、这个T/C寄存器
TCNT0
这就是计数寄存器,这个寄存器的数值呢,每来一个定时器的时钟脉冲数值就自动增1
第三个寄存器叫做输出比较寄存器
如下图
第四个叫做TIMSK
第五个寄存器是
列举一下TC0相关相关寄存器
定时器0相关寄存器
T/C 控制寄存器 ----TCCR0
设置时钟频率
T/C寄存器
计数寄存器
T/C 中断屏蔽寄存器 ----TIMSK
需要使用溢出中断时
T/C 中断标志寄存器 ---TIFR
查询是否溢出
下面演示下定时器0溢出方式 用查询模式使用步骤
第一步:设置TC寄存器初值
TCNT0 =55
第二步:开启时钟,同时TC0启动
TCCR0 |= (1<<CS01);
第三步:查询TIFR 寄存器的TOV0位
while(!(TIFR & (1<<TOV0)));
当然要先设置时钟频率TCNR0 对时钟预分频如 要100us
2MHZ 就是0.5 微妙 ,所以定100微妙时长的话,计数200次所以先赋初值 TCNT0
=55
以下代码查询方式使用定时器0 的代码
第一步:包含中断函数头文件
#include
第二步:设置TC寄存器初值
TCNT0 =55;
第三步:使能TC0溢出中断
TIMSK |= (1<<TOIE0);
第四步:编写TCO溢出中断服务程序
SIGNAL(SIG_SIG_OVERFLOW0)
{//此添加中断服务程序代码}
第五步:开启时钟,同时TC0启动
TCCR0 |= (1<<CS01);
第六步:使能全局中断
sei();
看代码用中断实现定时器0