关于溢出中断不管是哪个单片机都是不断累加,使其寄存器溢出触发中断,然后跳转到中断函数处执行中断服务程序。对于定时器初值的设定可以加深对定时器的工作原理的理解。
ATMega16 里面有8位和16位两种定时器,他们何时会溢出这个是固定的,也就是到达他们的计数范围的最大值就会产生中断,8位的定时器的最大计数范围是0~256(2的8次方),就是累加到256后他就会产生中断,16位的定时器最大计数范围是0~65536(2的16次方),累加到65536时他就会产生中断。
而我们所谓的计数初值是就是要设定定时器在什么地方开始计数,以8位定时器为例比如:初值为100,所以定时器从100开始累加,累加了156次,加到256后产生中断,这就是中间消耗的时间和指令周期就是我们要去设定的时间;再比如:初值是200,所以定时器从200开始累加,累加了56次,加到256后产生中断,可以看到第一定时要累加156次才会中断而第二次只要累加56次就会产生中断,显然第一次设定的时间要比第二次的长。
定时器不仅可以定时,而且我们用到定时器的时候往往是需要精确定时的时候。我们可以计算出我们设定的初值会在多长时间后进入中断。
下面的是8位定时器设定的时候需要用的寄存器:
实验平台:ATMega16
晶振: 11.0592 MHz
对初值的计算:
1,11059200 / 1024 = 10800 设定为1024倍分频 ,得到每1秒需要进行多少次累加
2,10800 / 100 = 108 得到10ms 的定时需要进行多少次累加 。
3,256 - 108 = 148 计算范围最大值减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为10ms的时间。
4,148 <==> 0x94 得到十六进制值,赋值给TCNT0
实验代码: 定时10ms
#include
unsigned char flag = 0;
void timer_init(void)
{
TCCR0 = 0x05; //进行1024分频
TCNT0 = 0x94; //赋计数初值
TIMSK_TOIE0 = 1; //开使能
SREG_I = 1; //开总中断
}
#pragma vector = TIMER0_OVF_vect
__interrupt void time0_normal(void)
{
TCNT0 = 0x94; //重新赋初值
flag++;
}
void main(void)
{
timer_init();
DDRB_Bit0 = 1;
while(1)
{
if(flag == 100) //10ms 重复100次,即为1秒
{
PORTB_Bit0 = ~PORTB_Bit0; //让LED闪烁
flag = 0;
}
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
实验平台:ATMega16
晶振:11.0592
16位定时器初值设定:
1,11059200 / 256 = 43200 设定256倍分频,得到每1秒需要进行多少次累加
2,65536 - 43200 = 22336 计算范围最大值减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为1s的时间。
3,22336 <==> 0x57 0x40 得到十六进制值,赋值给TCNT1H , TCNT1L
实验代码: 定时1s
#include
unsigned char flag = 0;
void timer_init(void)
{
TCCR1B = 0x04;
TCNT1H = 0x57;
TCNT1L = 0x40;
TIMSK_TOIE1 = 1;
SREG_I = 1;
}
#pragma vector = TIMER1_OVF_vect
__interrupt void time1_normal(void)
{
TCNT1H = 0x57;
TCNT1L = 0x40;
flag++;
}
void main(void)
{
timer_init();
DDRB_Bit0 = 1;
while(1)
{
if(flag == 1)
{
PORTB_Bit0 = ~PORTB_Bit0;
flag = 0;
}
}
}
关键字:IAR AVR 定时器 溢出中断
引用地址:
IAR For AVR 定时器溢出中断 (使用小结)
推荐阅读最新更新时间:2024-03-16 15:13
IAR 编译错解决Error[e16]
Error : Segment NEAR_Z (size: 0x16d align: 0) is too long for segment definition. At least 0x83 more bytes needed. The problem occurred while processing the segment placement command -Z(DATA)NEAR_I,NEAR_Z,NEAR_N=_..X_SRAM_BASE-_..X_SRAM_END , where at the moment of placement the available memory ranges were DATA:37
[单片机]
IAR Embedded Workbench现已支持性价比出众的新型STM32 MCU系列
IAR Embedded Workbench现已支持性价比出众的新型STM32 MCU系列 IAR携手ST帮助成本敏感型应用的开发人员从8位/16位MCU转向全新的入门级32位STM32 MCU系列 瑞典乌普萨拉–2023年2月23日–意法半导体(STMicroelectronics,以下简称 ST)最近推出了性价比出众的STM32C0系列产品,为开发人员降低了STM32入门门槛。 现在,嵌入式开发软件和服务的全球领导者、ST的授权合作伙伴IAR 宣布支持这款热门STM32微控制器的最新产品系列。性能强大的IAR Embedded Workbench for Arm可帮助开发人员构建紧凑的代码并加以优化,以及提供全面
[单片机]
51单片机定时器与中断的程序设计
P2.0~P2.2 分别接上了独立按键 K0、K1、K2。 P1 接上了 8 个 LED,输出低电平时发光。 要求: 按下 K1 键,P1.7 输出周期为 1s 的方波; 按下 K2 键,P1 输出循环流水灯,每 2 个灯亮 0.5s; 按下 K0 键,停止方波和流水灯的输出。 ;----------------------------------------- ; ORG 0000H JMP START ORG 000BH ; JMP T0_INT T0_INT: MOV TH0, #(65536 - 50000) / 256 MOV TL0, #(65536 - 50000) MOD 256 DJNZ
[单片机]
天龙DENON AVR-1507功放机内部拆解
朋友的一台坏天龙DENON AVR-1507功放机,他说这个功放在地下室放很久了,拿去维修没修好,后来就放弃维修了,我说我来修修看吧,以前有别人修过,检查发现主声道烧了一路,其他完好,这个机器7声道都是75W,采用D2390和B1560功放对管,这是复合管。 之前维修的把D2390换成D1047导致后来又烧了,结果还烧了一片,主声道带AB组的功能,两组同时用的话,很容易过载烧机,于是为了保主声道,我把后置环绕的配件挪到主声道,先修好主声道,再折腾后置环绕,这个后置环绕单独可以关闭输出,平时几乎也不用,这样修好后,估计保险点。 7个声道满功率的话,这变压器能扛得住?
[嵌入式]
使用AVR Studio 设置熔丝位并烧写程序
使用AVRStudio设置AVR熔丝位及烧写程序 AVR Studio是ATMEL指定用于开发AVR MCU的官方软件,其编程功能最为强大。下面介绍使用AVRStudio烧写程序及熔丝快速入门。 ●使用AVRISP方式烧写程序及配置熔丝位 对软硬件进行初始配置,并正确设备连接,就可使用AVRISP进行联机了。 打开AVRStudio,点击主窗口中的图标 前面标有Con的那个图标。出现如下图画面: 正常联机后,将弹出如下窗口: (1)程序编程面板: ● Device里面选择好对应的芯片类型,后面的Erase Device可以擦除芯片。 ● Programming mode编程模式:注意这里必须是ISP mod,表示用的ISP
[单片机]
使用Arduino ISP编程AVR微控制器和Arduino开发板
所有微控制器都需要某种机制来对它们进行编程,即使它们只编程一次。通常,程序代码写在主机上,然后编译或翻译,并使用电缆(通常是USB或RS232)将对象(机器可读)代码从PC(“主机”)下载到MCU(“目标”),通常被称为“编程器”。一旦编程,MCU就像编码一样工作。 一个非常受欢迎的MCU开发板制造商是Arduino,总部位于意大利。许多Arduino开发板都装有AVR微控制器,这也需要烧写器将主机上创建的程序保存到目标MCU的存储器中,例如AVR微控制器。外部编程器通常用于AVR微控制器,并且成本高昂。 在项目开发期间,大多数目标MCU必须进行多次编程,因此将MCU从电路中移除以对其进行编程是不可行的。许多MCU(包括A
[单片机]
STM32高级定时器那些事
首先说下我使用飞、高级定时器的一些坑爹经历,由于开始高级定时器使用不当,造成有如下问题: 1、PWM输出占空比反向(这个也还能接受点) 2、程序烧进去了就不能烧第二次了,下载时候提示如下图(这个够坑爹的了) 错误而提示 仔细看提示信息说是CPU一直在复位,解决的方法是通过出厂IAP用串口擦除芯片程序。需要准备的工作是:USB转串口工具、把BOOT0拉高、使用ISPMCU擦除芯片。 3、从外部flash读取出来的图片不能够正常显示,屏幕显示的是黑色,后来发现是因为SPI1的I/O与TIM8的N通道冲突了。(由此我下决心要找到问题的原因) 通过一番搜寻和查看相关资料,发现造成上述原因是因为我对高级定时器初始化的时候漏掉了部分成员
[单片机]
avr单片机的AD转换实验
AD转换实验。 1、AD转换实验。程序进行周期AD转换,在并转换值显示在数码管上。 2、使用内部1 M晶振。 3、进行此实验需要插上:JP1的所有8个短路块、JP9(A/D)。 4、此实验采用项目化管理,主要文件有ADC、DISP、主程序。 */ #include "iom16v.h" #include macros.h #include "iom16v.h" #include macros.h extern unsigned char get_ad(void);/*AD采样函数*/ extern void Disp_Init(void);/*显示初始化*/ extern unsigned char led_buf ;/*
[单片机]