kl800.com省心范文网

ATmega16定时器中断


ATmega16 定时器/计数器中断及编程
Atmega16 内部有三个定时器/计数器 T/C0,T /C1.T/C2, 其中 T/C0,T/C2 为 8 为定时器, T/C1 为 16 定时器,这里从高级语言编程的使用出发,简要介绍 T/C0 的使用。 定时器中断的过程是:当中断发生时,程序控制立即从主程序转移到中断服务程序, 执行完中断服务程序后再返回到主程序的中断处继续执行后续的程序。利用中断可以节省 CPU 资源。 先了解几个寄存器。 MCUCR---MCU 控制寄存器;MCUCSR-----MCU 控制与状态寄存器;GICR-----通用控制寄 存器;GIFR-----通用中断标志寄存器;TIFR---定时器中断标志寄存器,TIMSK----定时器 中断屏蔽寄存器。这几寄存器保留默认设置即可,需要编程时了解并设置的寄存器为 TCCR0----T/C0 控制寄存器,TCNT0----T/C0 的计数初始值,OCR0----输出比较寄存器, OC0/PB3----输出比较引脚。 TCCR0 为 8 位寄存器, 从高位到低位的名称依次是: FOC0, WGM00, COM01, COM00, WGM01, CS02,CS01,CS00. TCCR0 各个控制位的作用: (1) CS02,CS01,CS00 控制时钟选择和预分频,如 100 表示预分频为 256

(2) WGM01,WGM00 控制波形产生模式,分为普通模式(用于普通计时),CTC 模式 (用于频率发生),快速 PWM 模式(用于 PWM 调速,功率调节),相位修正 PWM 模式。如 10 表示 CTC 模式。 (3) COM01, COM00 控制比较匹配输出模式。 在不同的波形产生模式下其逻辑值功能 表不同,如在普通模式或 CTC 模式下 01 表示比较匹配发生 OC0 取反。 (4)FOC0,中断标志位,设为零即可。 至于上述控制位的逻辑值功能表可查阅 Atmega16 的中文数据手册, 在官方网上会有英 文版。 完成 TCCR0 的设定,接下来是设置 TCNT0,OCR0 寄存器了。根据所选择的波形产生模式 的不同,T/C0 工作原理不同,下面分别介绍它们的设置方法。 (1) 普通模式:TCNT0 从设定的初始值不断增加,到最大值 0xFF 时产生溢出 中断, TCNT0 回到初始值开始新一轮的计时。 可以看到, 只需设定 TCNT0 的初始值, 而把 OCR0 设为 0x00。 定时时长 t=N*(0xFF-TCNT0)/f N 为预分频,如 256;f 为单片机的晶振频率,如 8.00MHz

(2) CTC 模式:TCNT0 从 0x00 增加到最大值 OCR0,发生比较匹配中断,TCNT0 回到 0x00 开始新一轮计时。假设每次发生中断时,把一固定输出端口的值取反,则在该端 口将输出对称的矩形波。可以看到,只需根据计算公式设定出比较匹配值 OCR0,把计时处 置 TCCT0 设为 0x00. 矩形波频率 f’=f/(2*N*(1+OCR0)) f 为单片机的晶振频率,如 8.00MHz (3) 快速 PWM 模式:TCNT0 从 0x00 增加到 OCR 时发生匹配中断,TCNT0 继续增 加到 0xFF 时发生溢出中断,TCNT0 回到 0x00 开始新一轮计时。假如对某一固定输出端口在 匹配中断时清零,在溢出中断时置位,便可在该端口输出频率不变,脉宽可调的非对称矩形 波。改变 OCR0 的值即可改变波形的脉宽。 (4)相位可调的 PWM 模式。用于需要精确地调节 PWM 波形相位的场合。 下面具体分析 T/C0 的中断程序。 //ICC-AVR application builder : 2010-9-27 11:04:28 // Target : M16 // Crystal: 8.0000Mhz #include <iom16v.h> #include <macros.h> void port_init(void) { PORTA = 0x00; DDRA = 0x01;//set PORTA0 as output port PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //TIMER0 initialisation - prescale:32 // WGM: CTC // desired value: 1KHz // actual value: 1.000KHz (0.0%) void timer0_init(void) { TCCR0 = 0x00; //stop TCNT0 = 0x00; //set count OCR0 = 0x7C; //set compare

//added note: 矩形波频率 f’=f/(2*N*(1+OCR0)) In the function , we have known f (Xtal //Speed) which is 8.00MHz and N(Precsale) which is 32. Since the desired frequency is //1KHz,we can get the value of OCR0 by solving the euqation easily.

TCCR0 = 0x0B; //start timer //added note:TCCR0=0b00001011. (CS02,CS01,CS00)=(011),means //prescale is 32;( WGM01,WGM00)=(10),means wave form mode is CTC //mode;( COM01,COM00)=(00),means OC0 output mode is //disconnected(we now set PORTA0 as output port, not the default //OC0/PB3 output port ) } #pragma interrupt_handler timer0_comp_isr:20 void timer0_comp_isr(void) { //compare occured TCNT0=OCR0 //when compare occured ,toggled PORTA0 if(PORTA0==0) PORTA|=BIT(0); else PORTA&=~BIT(0); //PORTA0=~PORTA0; the sentence has syntax error,so I have replaced it using the above sentences } // the overflow interrupt is not necessray in this program #pragma interrupt_handler timer0_ovf_isr:10 void timer0_ovf_isr(void) { TCNT0 = 0x00; //reload counter value } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); timer0_init();

//default settings MCUCR = 0x00; GICR = 0x00; TIMSK = 0x03; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } // void main(void) { init_devices(); //insert your functional code here... while(1) {;} } 如果只是看主程序,初始化设备后,便一直进行死循环,什么也没有干,其实不然,在启动 定时器后,每次发生中断时,主程序的执行便被打断,程序控制转移到中断服务程序(此处 即为对 PORTA0 取反),完成后再返回到主程序被中断处继续执行(此处为死循环)。


赞助商链接

ATMEGA16定时器0

ATMEGA16定时器0_电子/电路_工程科技_专业资料。ATMEGA16定时器0ATMEGA...//开总中断 TIMSK|=0x01; //开溢出中断 TCCR0 = 0X05; //普通模式/1024...

PROTEUS仿真学习ATmega16定时器T0

ATmega16 定时器 T0 也不例外,它是 8 位的定时器,我们先来认识它的一些寄存 器。 TC0 控制寄存器 中断屏蔽寄存器 中断标志寄存器 状态寄存器 比较寄存器 计数...

Atmega16定时器0快速PWM

Atmega16定时器0快速PWM - PWM:脉冲宽度调制,图中 T 为脉冲周期,t 为高电平时间,t 与 T 的比值 t/T 称为占空比, 脉宽调制指的是调整 t 的大小,即改变...

ATmega16定时器0产生PWM波

ATmega16定时器0产生PWM波_电子/电路_工程科技_专业资料。利用定时器0产生占空比...stm32定时器产生PWM方法 2页 1下载券 ATmega16定时器中断 4页 1下载券 ...

ATmega16单片机的使用

ATmega16单片机的使用 - ATmega16 单片机的使用 ——实验一 Atmega16 定时器 T/C0 实现按键扫描 ——实验二 ATmega16 单片机的 ADC 使用举例 指导老...

Arduino Mega 2560使用手册

USB 接口芯片由 ATmega16U2 替代了 ATmega8U2。 概要 处理器 ATmega2560 工作...当电流超过 500mA 是会断开 USB 连接。 ? ? Arduino Mega2560 提供了自动...