AVR定时器使用范例

合集下载

AVR定时计数器0,1,2的相位可调PWM模式彻底应用

AVR定时计数器0,1,2的相位可调PWM模式彻底应用

/***********AVR定时计数器0,1,2的相位可调PWM模式彻底应用***********************FileName : adjustablePWM.cAuthor : 沧海麒麟Date : 2011.05.28Version : 1.0Clock Frequency :8 MHZDescription : 适用于ATmega16(L)AVR的3个定时计数器相位频率PWM模式查询与中断的基本应用*/#include <iom16v.h> //常用头文件,如有需要可以查库文件include#include <avrdef.h>#include <macros.h>#include <string.h>#include <math.h>//#include "delay.c"//#include "LCM1602.c"#define uint unsigned int#define uchar unsigned char/*****************T/C0*********************************/void Timer0PCPWM_Init(uchar temp);void Timer0PCPWM_NquiryMode(uchar temp);//T/C0查询方式函数void Timer0PCPWM_InterruptMode(uchar temp);//T/C0中断方式函数/*****************T/C2*********************************/void Timer2PCPWM_Init(uchar temp);void Timer2PCPWM_NquiryMode(uchar temp);//T/C2查询方式函数void Timer2PCPWM_InterruptMode(uchar temp);//T/C2中断方式函数/*****************T/C1**********************************/void Timer1PCPWM_10_Init(uint top,uint temp);//T/C1波形产生模式:CTC4 void Timer1PCPWM_11_Init(uint top,uint temp);//T/C1波形产生模式:CTC12 void Timer1PCPWM_A_NquiryMode(uint temp);//T/C1比较匹配A查询方式函数void Timer1PCPWM_B_NquiryMode(uint temp);//T/C1比较匹配B查询方式函数void Timer1PCPWM_InterruptMode(uint temp);//T/C1中断方式函数void main(void){//占空比为1/5Timer0PCPWM_Init(51);//245HzTimer2PCPWM_Init(51);Timer1PCPWM_10_Init(1249,250);//50HZ//Timer1PWM_14_Init(1249,250);while (1);}/*******定时计数器的函数*******************//*与8位T/C0相关的寄存器1:T/C0计数寄存器TCNT0,输出比较寄存器OCR0,定时计数器中断屏蔽寄存器TIMSK 定时计数器中断标志寄存器TIFR,T/C0控制寄存器TCCR02:每计数一次需要的时间是(1/Xtal)*N us在此程序中Xtal=8,N定义为与分频系数N:1,8,64,256,10241 : TCCR0|=0x01;//0:无时钟,系统不工作8 : TCCR0|=0x02;64 : TCCR0|=0x03;256 : TCCR0|=0x04;1024: TCCR0|=0x05;//0x06:时钟由T0引脚输入,下降沿触发 0x07:时钟由T0引脚输入,上升沿触发*//***********************************************************/void Timer0PCPWM_Init(uchar temp){//Foc0pwm = Fclk/(510N)DDRB |= 0X08;TCNT0 = 0x00;TCCR0 = 0x40|0x20|0x03; //PWM设置|OC0触发方式的设置|预分频设置OCR0 = temp;//在此程序中Xtal=8,N定义为与分频系数N:1,8,64,256,1024//1 : TCCR0|=0x01;//0:无时钟,系统不工作//8 : TCCR0|=0x02;//64 : TCCR0|=0x03;//256 : TCCR0|=0x04;//1024: TCCR0|=0x05;}/********************************************************/void Timer0PCPWM_NquiryMode(uchar temp)//T/C0查询方式函数while(!(TIFR&0x02));TIFR=0x02;OCR0 = temp;//Focnpwm = Fclk/N(1+TOP)}/*********************************************************/void Timer0PCPWM_InterruptMode(uchar temp)//T/C0中断方式函数{CLI(); //disable all interruptsTCCR0 = 0x00; //stopTCNT0 = 0x00;TCCR0 = 0x40|0x20|0x03; //PWM设置|OC0触发方式的设置|预分频设置OCR0 = temp;MCUCR = 0x00;GICR = 0x00;TIMSK = 0x02; //timer interrupt sourcesSEI(); //re-enable interrupts //SREG|=BIT(7);//开启总中断}/*********************************************************/#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP //20void timer0_comp_isr(void){//compare occured TCNT0=OCR0}/***********************************************************//*与8位T/C2相关的寄存器1:T/C2计数寄存器TCNT0,输出比较寄存器OCR2,定时计数器中断屏蔽寄存器TIMSK 定时计数器中断标志寄存器TIFR,T/C2控制寄存器TCCR22:每计数一次需要的时间是(1/Xtal)*N us在此程序中Xtal=8,N定义为与分频系数N:1,8,64,256,10241 : TCCR2|=0x01;//0:无时钟,系统不工作8 : TCCR2|=0x02;32 : TCCR2|=0x03;64 : TCCR2|=0x04;128 : TCCR2|=0x05;256 : TCCR2|=0x06;1024: TCCR2|=0x07;*//***********************************************************/void Timer2PCPWM_Init(uchar temp){//Foc0pwm = Fclk/(510N)DDRD |= 0X80;TCNT2 = 0x00;TCCR2 = 0x40|0x20|0x04; //PWM设置|OC2触发方式的设置|预分频设置OCR2 = temp; //Focnpwm = Fclk/N(1+TOP)}/***********************************************************/void Timer2PCPWM_NquiryMode(uchar temp)//T/C2查询方式函数{while(!(TIFR&0x80));TIFR=0x80;OCR2 = temp;}/***********************************************************/void Timer2PCPWM_InterruptMode(uchar temp)//T/C2中断方式函数{CLI(); //disable all interruptsTCCR2 = 0x00; //stopTCNT2 = 0x00; //set count//temp=6,N=64:2000us;计数250次TCCR2 = 0x40|0x20|0x04; //PWM设置|OC2触发方式的设置|预分频设置OCR2 = temp;MCUCR = 0x00;GICR = 0x00;TIMSK = 0x80; //timer interrupt sourcesSEI(); //re-enable interrupts //SREG|=BIT(7);//开启总中断}#pragma interrupt_handler timer2_comp_isr:iv_TIM2_COMP //4void timer2_comp_isr(void){//compare occured TCNT2=OCR2}/***********************************************************//*与16位T/C1相关的寄存器1:T/C1计数寄存器TCNT1H和TCNT1L,输出比较寄存器OCR1A(H/L)和OCR1B(H/L), 定时计数器中断屏蔽寄存器TIMSK,定时计数器中断标志寄存器TIFR,T/C1控制寄存器TCCR1A和TCCR1B2:每计数一次需要的时间是(1/Xtal)*N us在此程序中Xtal=8,N定义为与分频系数N:1,8,64,256,1024//1 : TCCR1B=0x01;//0:无时钟,系统不工作//8 : TCCR1B=0x02;//64 : TCCR1B=0x03;//256 : TCCR1B=0x04;//1024: TCCR1B=0x05;//0x06:时钟由T1引脚输入,下降沿驱动 0x07:时钟由T1引脚输入,上升沿驱动*//***********************************************************/void Timer1PCPWM_10_Init(uint top,uint temp){DDRD |= 0x30;TCNT1H = 0x00;TCNT1L = 0x00;TCCR1A = 0x80|0x20|(1 << WGM11)|(0 << WGM10); //OC1A&OC1B的触发方式设置|PWM 设置TCCR1B = (1 << WGM13)|(0 << WGM12)|0x03;//PWM设置|预分频设置ICR1 = top; //Focnpwm = Fclk/(2N*TOP)OCR1A = temp;OCR1B = temp;}/***********************************************************/void Timer1PCPWM_11_Init(uint top,uint temp){DDRD |= 0x30;TCNT1H = 0x00;TCNT1L = 0x00;TCCR1A = 0x80|0x20|(1 << WGM11)|(1 << WGM10); //OC1A&OC1B的触发方式设置TCCR1B = (1 << WGM13)|(0 << WGM12)|0x03;//PWM设置|预分频设置OCR1A = top; //Focnpwm = Fclk/(2N*TOP)OCR1B = temp;//说明还有8 9 10位相位修正PWM可用}/******************************************************************/void Timer1PCPWM_A_NquiryMode(uint temp)//T/C1比较匹配A查询方式函数{while(!(TIFR&0x10));TIFR = 0x10;OCR1A = temp; //Focnpwm = Fclk/(2N*TOP)}/*********************************************************/void Timer1PCPWM_B_NquiryMode(uint temp)//T/C1比较匹配B查询方式函数{while(!(TIFR&0x08));TIFR = 0x08;OCR1B = temp; //Focnpwm = Fclk/(2N*TOP)}/*******************中断方式函数视具体情况而定***************************/ void Timer1PCPWM_InterruptMode(uint temp)//T/C1中断方式函数{CLI(); //disable all interruptsDDRD |= 0x30;TCNT1H = 0x00;TCNT1L = 0x00;TCCR1A = 0xA0|(1 << WGM11)|(1 << WGM10); //OC1A&OC1B的触发方式设置|PWM设置 TCCR1B = (1 << WGM13)|(1 << WGM12)|0x03;//PWM设置|预分频设置OCR1A = temp;OCR1B = temp; //Focnpwm = Fclk/(2N*TOP)MCUCR = 0x00;GICR = 0x00;TIMSK = 0x18; //timer interrupt sourcesSEI(); //re-enable interrupts //SREG|=BIT(7);//开启总中断}/*********************************************************/#pragma interrupt_handler timer1_compa_isr:iv_TIM1_COMPA //7void timer1_compa_isr(void){//compare occured TCNT1=OCR1A}#pragma interrupt_handler timer1_compb_isr:iv_TIM1_COMPB //8void timer1_compb_isr(void){//compare occured TCNT1=OCR1B}。

AVR按时器程序

AVR按时器程序

要求是用按时器编写一个周期为2s的方波程序。

每隔一秒输出口跳变一次的那种。

GCC,Mega16,8M外部晶振其他看注释,熔丝位设为外部晶振,#include<avr/io.h>#include<avr/interrupt.h>int main(void){DDRB = 0xff;PORTB = 0xff;TCNT1H = 15535/256;TCNT1L = 15535%256; //计50000次才溢出TIMSK |= (1 << TOIE1);//使能中断TCCR1B |= (1 << CS11);//8分频sei();while(1){}}volatile unsigned int i;SIGNAL(SIG_OVERFLOW1){TCNT1H = 15535/256;TCNT1L = 15535%256;i ++;if(i >= 20) //晶振为8M,8分频,每次溢出为跳50000次,1s/ ((1/8000000)*50000*8)=20{ //因此循环20次i = 0;PORTB ^= 0xff; //PB口接led,实现1s翻转。

}}实验17:TC0定时器溢出定★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/*******************************************************************************开发板()1.Project : 范例16:TC0按时器溢出按时实验(ICC)2.Clock F : 内部1MHz3.4.Author : 林夕仍然5.6.Updata :ments:1、以学习板LED为硬件电路2、TC0用作按时器,明白得TC0溢出中断的原理3、用程序生成向导配置TC0,溢出中断,产生1ms/20ms延时(只产生其中之一,不用的需要注释掉)4、按时公式:Time=PRE*(MAX-TCNT0+1)/F_cpu单位S ,其中,PRE为与分频数5、进行此实验需要安装上LED_EN短路块****************************************************************** *************///ICC-AVR application builder : 2020-12-15 PM 10:41:53// Target : M16#include <iom16v.h>#include <macros.h>void port_init(void){PORTA = 0x00;DDRA = 0xFF;PORTB = 0xFF;DDRB = 0x00;PORTC = 0xFF; //m103 output onlyDDRC = 0x00;PORTD = 0xFF;DDRD = 0x00;}//TIMER0 initialize - prescale:8/256// WGM: Normal// desired value: 1mSec/20ms// actual value: 1.000mSec (0.0%)/19.968ms(0.16%)void timer0_init(void){TCCR0 = 0x00; //stop//TCNT0 = 0x83; //set count T=PRE*(MAX-TCNT0+1)/F_cpu=8*(255-130)/1MHz=1msTCNT0 = 0xB2; //set count T=PRE*(MAX-TCNT0+1)/F_cpu=256*(255-178+1)OCR0 = 0x7D; //set compare 程序中未利用//TCCR0 = 0x02; //start timer 8分频TCCR0 = 0x04; //start timer 256分频}#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVFvoid timer0_ovf_isr(void){//TCNT0 = 0x83; //reload counter value 重载TCNT0,使TC0重复从0x83-0xff 计数TCNT0 = 0xB2; //reload counter value 重载TCNT0,使TC0重复从0xB2-0xff计数PORTA^=BIT(7)|BIT(6); //翻转PB6/PB7口,实现两个LED灯的1ms距离亮灭}//call this routine to initialize all peripheralsvoid init_devices(void){//stop errant interrupts until set upCLI(); //disable all interruptsport_init();timer0_init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x01; //timer interrupt sourcesSEI(); //re-enable interrupts//all peripherals are now initialized}//void main(void){init_devices();//insert your functional code here... }。

AVR学习笔记四、定时计数器1实验

AVR学习笔记四、定时计数器1实验

A VR学习笔记四、定时/记数器1实验-------基于LT_Mini_M164.1 定时/计数器1的计数实验4.1.1 实例功能ATmega16的T/C1是一个16位的多功能定时计数器,其主要特点有:●真正的16位设计,允许16位的PWM。

● 2个独立的输出比较匹配单元。

●双缓冲输出比较寄存器。

●一个输入捕捉单元。

●输入捕捉躁声抑制。

●比较匹配时清零计数器(自动重装特性,Auto Reload)。

●可产生无输出抖动(glitch-free)的,相位可调的脉宽调制(PWM)信号输出。

●周期可调的PWM波形输出。

●频率发生器。

●外部事件计数器。

●带10位的时钟预分频器。

● 4个独立的中断源(TOV1、OCF1A、OCF1B、ICF1)。

在前面的实例中,我们已经学习了AVR单片机的定时/计数器0,本实例和下一个我们学习定时/计数器1,从上面的介绍我们可以看出,ATmega16单片机的定时/计数器1功能更为强大,值得我们深入学习。

定时/计数器的基本功能都是定时、计数等,掌握了一个定时/计数器的用法就能很容易的掌握其他定时/计数器的用法,所以我们不在学习定时/计数器1的定时、计数等基本功能。

在接下来的两个实例中,我们将学习定时/计数器1的增强功能。

在本实例中,我们利用ATmega16单片机的定时/计数器1的输入捕捉功能实现对按键时间的捕捉,并检测两次按键之间的时间间隔,然后通过LED指示实例运行效果。

本实例共有3个功能模块,分别描述如下:●单片机系统:使用定时/计数器1的输入捕捉功能检测按键的按下,并判断两次按键按下的时间间隔,然后通过LED灯的亮灭指示按键按下次数。

●外围电路:按键检测电路以及显示运行结果的LED显示电路。

●软件程序:熟悉掌握ATmega16单片机的定时/计数器1的输入捕捉中断程序的编写。

3.1.2、器件和原理本实例首先介绍ATmega16单片机的定时/计数器1的输入捕捉功能,然后详细介绍如何利用定时/计数器1实现对外部事件进行输入捕捉。

AVR定时器控制交通灯

AVR定时器控制交通灯

//—-——----——---——---—--——-—--———————-————---—--—-—-—-——-----———-————//定时器Timer1练习,用定时器1模拟控制交通灯,定时时间为0.5s//外部定时器,内部时钟1MHz,即1秒时间内有1M次计数次数//--—--———-———--——-—--—--———-—-——--|// 1、东西向绿灯与南北向红灯亮5s;|// 2、东西向绿灯灭,黄灯闪烁5次; |// 3、东西向红灯与南北向绿灯亮5s; |// 4、南北向绿灯灭,黄灯闪烁5次|// 编译环境:IAR//——————----------————---——---———-—|---—————————-—-—---—-----——-—-——-#include〈iom16.h〉#define uint_8 unsigned char#define uint_16 unsigned intuint_8 operation_type=1,Time_Count=0;#define GREEN_EW_ON() PORTC&=~(1〈〈2) //东西向指示灯打开#define YELLOW_EW_ON() PORTC&=~(1〈<1)#define RED_EW_ON()PORTC&=~(1<〈0)#define GREEN_EW_OFF() PORTC|=1〈<2 //东西向指示灯关闭#define YELLOW_EW_OFF() PORTC|=1<〈1#define RED_EW_OFF()PORTC|=1〈<0#define GREEN_SN_ON()PORTC&=~(1<〈5) //南北向指示灯打开#define YELLOW_SN_ON() PORTC&=~(1<<4)#define RED_SN_ON()PORTC&=~(1<〈3)#define GREEN_SN_OFF() PORTC|=1〈<5 //南北向指示灯关闭#define YELLOW_SN_OFF() PORTC|=1<〈4#define RED_SN_OFF()PORTC|=1〈〈3#define YELLOW_EW_BLINK() PORTC^=(1<<1)#define YELLOW_SN_BLINK() PORTC^=(1〈<4)void timer_init(){TCCR1B=0x04;//定时器1设置为256分频TCNT1=65536—(1000000/2)/256;TIMSK|=(1<<2);//打开定时器0和定时器1的中断使能位SREG=0x80;//打开全局中断}int main(){DDRC=0xff;PORTC=0xff;timer_init();while (1);}#pragma vector = TIMER1_OVF_vect__interrupt void TIMER1_server(void){TCNT1=65536—(1000000/2)/256;//YELLOW_EW_BLINK();switch(operation_type){case 1:GREEN_EW_ON();YELLOW_EW_OFF();RED_EW_OFF();RED_SN_ON();GREEN_SN_OFF();YELLOW_SN_OFF();if(++Time_Count!=10)return;Time_Count=0;operation_type=2;break;case 2:GREEN_EW_OFF();YELLOW_EW_BLINK();if(++Time_Count!=10)return;Time_Count=0;operation_type=3;break;case 3:RED_EW_ON();GREEN_EW_OFF();YELLOW_EW_OFF();GREEN_SN_ON();YELLOW_SN_OFF();RED_SN_OFF();if(++Time_Count!=10)return;Time_Count=0;operation_type=4;break;case 4:GREEN_SN_OFF();YELLOW_SN_BLINK();if(++Time_Count!=10)return;Time_Count=0;operation_type=1;break;}}。

4.AVR定时器(Timer)的程序设计

4.AVR定时器(Timer)的程序设计

单片机定时器寄存器
中断屏蔽寄存器
中断标志寄存器
单片机定时器寄存器
8位与16位定时计数器的寄存器大同小异
单片机定时器寄存器
8位与16位定时计数器的寄存器大同小异
定时器设置与中断程序设计
#include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #define CPU_CLOCK_HZ void AVRTimer1Init (void) { TCCR1A = 0; TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10);//CTC方式,1024分频 OCR1A = (CPU_CLOCK_HZ / 1024) / 100; TCNT1 = 0; } 7372800 //初始化Timer1,每10MS中断一次,定时器功能
定时器设置与中断程序设计
//使能Timer1 void AVRTimer1En (void) { TIMSK |= (1<<OCIE1A); } //停止Timer1 void AVRTimer1Dis (void) { TIMSK &=~(1<<OCIE1A); } void main (void) { …… AVRTimer1Init(); sei();//开全局中断 …… while (1) { …… } }
作业
用定时器中断的方式产生一个时间计数器, 用定时器中断的方式产生一个时间计数器,每秒计 数3次,通过发光二极管的闪烁反映。 次 通过发光二极管的闪烁反映。 用IO口实现两个按键,每按增加键一次,时间计数 口实现两个按键, 口实现两个按键 每按增加键一次, 频率增加,反之减少。按键要有快速增加功能。 频率增加,反之减少。按键要有快速增加功能。 频率从100Hz到1Hz,步进为 到 频率从 ,步进为1Hz。用示波器观察。 。用示波器观察。

AVR精确定时的编程

AVR精确定时的编程
定要拿放大镜,针尖,这两样工具一个一个管脚的检验,以防接触不良,我在这上面吃过好大的亏!
如果有一台热风台,就不会再因为焊坏板子而吃亏了,热风一吹,轻轻 一取就OK了,我过去焊坏好多板子,不是因为焊,而是因
为取,引线太细,一取就完蛋了,有了热风台,就不会了。这玩意也不贵,300多就行了。
[duoduo]
步骤2 路径的设置
感觉uc/os太依赖绝对路径了,可能是方便于不同的项目共享。但是却给调试带来很多麻烦,很多莫名其妙的错误都是这个引起的。
由于我们安装的是bc31,而uc/os用的的是bc45,所以必须修改路径。FreeWiny和HComputer都是修改程序的路径设置,我觉得这样
太麻烦,要修改Test.lnk和Test.mak,而且以后每次版本变动都要重新修改。其实只要解压的bc到c:\bc45目录就可以保证命令行
while(1) {
shortdelay( 48 );
}
}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[王为之]
我也是位新手,近来做过一些表贴电路,我觉得,一般的分立元件,当然谁都能焊好了,只要心细手稳,没总题的。关键是表贴的
我总结一下我遇到的问题和走过的弯路,给大家借鉴。
步骤1.BC文件是否齐全
bc的文件是否齐全很重要,网上很多都是精简版,少很多文件,所以注意检查bin目录里面是否有这7个文件
bc.exe IDE
bcc.exe c
make.exe make
tlink.exe 连接
{
asm("_L2: subi R16,1");
asm(" nop")

AVR单片机看门狗定时器WDT操作过程

AVR单片机看门狗定时器WDT操作过程

WDT:(Watch Dog Timer)看门狗定时器,简写WDT,主要有一个专用的定时器组成,当启动看门狗后,定时器开始计数,计数满后将产生一个中断,复位单片机。

作用:单片机很容易收到外界的干扰,如电源电压波动,电机起停,受到干扰后,程序有可能跑飞,不按原来的逻辑顺序执行,跳到另一地方执行,或者陷入一个死循环。

启用看门狗后,如果在设定的定时时间内没有执行清0看门狗定时器的指令,单片机将复位,回到程序的开始处,重新开始执行程序,保证系统的正常运行。

WDE为"1“ 时,看门狗使能,否则看门狗将被禁止。

只有在WDTOE为"1“ 时WDE 才能清
零。

以下为关闭看门狗的步骤:
1. 在同一个指令内对WDTOE 和WDE 写"1“,即使WDE 已经为"1“
2. 在紧接的4 个时钟周期之内对WDE 写"0”
步骤如下:
一、启动看门狗:WDTCR|=(1<<WDTOE)|(1<<WDE);
二、禁止看门狗:WDTCR=0X00; //再次启动看门狗必须先禁止看门狗,
三、WDTCR|=(1<<WDTOE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0); //看门狗定时时间1S
在1s内重复执行上述指令,清0看门狗。

小企鹅diy 科学探究学习网
更多文章转到/wqb_lmkj/blog文章分类单片机。

AVR单片机的定时_计数器

AVR单片机的定时_计数器

新闻 言论 消费AVR 单片机的定时/计数器成都 张晓斌 AVR单片机的型号不同,定时/计数器的数量也不同。

下面以AT90S8515单片机为例,介绍AVR单片机的定时/计数器。

AT90S8515有一个8位定时/计数器TCNT0和一个16位的定时/计数器TCNT1。

二者均可对晶振时钟CK、预定比例器时钟源、或外部引脚脉冲进行计数。

AT90S8515的预定比例器将晶振时钟CK进行8、64、256和1024分频,分别为TCNT0、TCNT1提供不同频率的时钟源,包括:CK、CK/8、CK/64、CK/256、CK/1024、外部源EXT0、EXT1和停止。

定时/控制寄存器TCCR0控制TCNT0的时钟源,TCCR1A、TCCR1B控制TCNT1的时钟源。

定时/计数器溢出标志位在TIFR寄存器中,中断使能位在TIMSK寄存器中。

一、8位定时/计数器TCNT0 1.TCNT0控制寄存器——TCCR0 TCCR0的I/O寄存器地址为$33(RAM地址为$53),复位时值为0。

TCCR0的低3位CS02、CS01、CS00为TCNT0的时钟源选择位(对应关系如表1),高5位未用。

若用T0脚作时钟源,须对数据方向控制寄存器进行相应设置。

2.定时/计数器TCNT0 TCNT0的地址为$32($52),复位时值为0。

TCNT0是可读写的加计数器。

若向TCNT0写入时时钟源正在工作,则数据写入后继续计数。

二、16位定时/计数器TCNT1 1.TCNT1有两个输出比较寄存器OCR1A、OCR1B,用于与TCNT1的计数值进行比较。

输出比较功能包括:比较匹配后的计数器清0,及比较匹配输出引脚上的各种操作。

TCNT1可用于8位、9位、10位的脉冲调制器。

在此模式下,定时器和OCR1A、OCR1B具有集中脉冲双抗误操作独立的PWM能力。

TCNT1具有输入捕获功能,由输入捕获引脚ICP上的信号激活。

捕获信号的设置由TCNT1的控制寄存器TCCR1B来定义。

AVR单片机定时计数器TC0图解教程

AVR单片机定时计数器TC0图解教程

Output Compare Flag 输出比较匹配中断标志,转向中断向量执行中断服 务时硬件自动清零
输出比较寄存器 0 Output Compare Register OCR0
00 PB3 不与 OC0 相连, 作普通 IO 用 TCNT0=OCR0 TCNT0=TOP 01 保留 10 OC0/PB3 11 TCNT0=OCR0 TCNT0=TOP
=
输出比较寄存器 0 Output Compare Register OCR0
00 PB3 不与 OC0 相连, 作普通 IO 用 TCNT0=OCR0 TCNT0=TOP 01 保留 10 OC0/PB3 11 TCNT0=OCR0 TCNT0=TOP
SREG(Status Register) 状态寄存器 初 R/W TCCR0(T/C0 Control Register) T/C0 控制寄存器 初值 R/W Bit 0 RW FOC0 0 RW WGM01 0 RW COM01 0 RW COM00 0 RW WGM00 0 RW CS02 0 RW CS01 0 RW CS00 初值 R/W Bit TIMSK(Timer Interrupt Mask Register) 定时计数器中断屏蔽寄存器 0 RW OCIE2 0 RW TOIE2 0 RW TICIE1 0 RW OCIE1A 0 RW OCIE1B 0 RW TOIE1 0 RW OCIE0 0 RW TOIE0 Bit I T H S V N Z C 0 0 0 0 0 0 0 0
Output Compare Flag 输出比较匹配中断标志,转向中断向量执行中断服 务时硬件自动清零
定时/计数器 Timer0/Counter0 Register TCNT0

AVR单片机定时记数器0实验三

AVR单片机定时记数器0实验三

A VR学习笔记三、定时/记数器0实验-------基于LT_Mini_M163.1 定时/计数器0的计数实验3.1.1、实例功能定时/计数器(Timer/Counter)是单片机中最基本的接口之一,它的用途非常广泛,常用于计数、延时、测量周期、频率、脉宽、提供定时脉冲信号等。

在实际应用中,对于转速,位移、速度、流量等物理量的测量,通常也是由传感器转换成脉冲电信号,通过使用定时/计数器来测量其周期或频率,再经过计算处理获得。

相对于一般8位单片机而言,AVR不仅配备了更多的定时/计数器接口,而且还是增强型的,如通过定时计数器与比较匹配寄存器相互配合,生成占空比可变的方波信号,即脉冲宽度调制输出PWM信号,用于D/A、马达无级调速控制、变频控制等,功能非常强大。

ATmega16一共配置了2个8位和1个16位,共3个定时/计数器,它们是8位的定时计数器T/C0、T/C2和16位的定时/计数器T/C1。

在接下来的几个实例中,我们将逐一学习这些定时/计数器的各种功能和使用方法。

在前面的实例中,我们已经学习了利用单片机的I/O口进行按键的输入检测,并实现了将按键按下次数在数码管上进行显示。

使用的方法是不停的检测端口状态,每检测到一次电平变化记录一次,这样实现起来未免有些重复劳动的嫌疑,那么有没有一种方法可以不用每次都这么辛苦呢?答案是肯定的!我们可以使用定时/计数器的计数功能实现对外部事件(电平变化次数、脉冲个数等)进行计数。

在本实例中,我们利用ATmega16单片机的定时/计数器0的计数功能实现对按键次数的检测,并通过LED的亮灭来指示程序的运行状态。

本实例共有3个功能模块,分别描述如下:●单片机系统:检测按键的按下,通过LED灯的亮灭指示按键按下次数。

●外围电路:按键检测电路以及显示按键状态的LED显示电路。

●软件程序:熟悉掌握ATmega16单片机的定时/计数器0的计数程序的编写。

3.1.2、器件和原理本实例首先介绍ATmega16单片机的定时/计数器0的功能,然后详细介绍如何利用定时/计数器0实现对外部事件进行计数的功能。

AVR-----Timer 1

AVR-----Timer 1

Timer Interrupt Registers (Mask and Flag Registers) are Common to Both Timers
6
Timer/Counter Interrupt Mask (TIMSK)
Bit 7 – TOIE1: Timer/Counter1 Overflow Interrupt Enable Bit 6 – OCE1A: Timer/Counter1 Output Compare A Match Interrupt Enable Bit 5 – OCIE1B: Timer/Counter1 Output Compare B Match Interrupt Enable Bit 3 – TICIE1: Timer/Counter1 Input Capture Interrupt Enable Bit 1 – TOIE0: Timer/Counter0 Overflow Interrupt Enable
Timer/Counter1 Output Compare Register – (OCR1BH & OCR1BL )
12
Timer/Counter1¤X,X\¥ºªû¸ñ¤ ¥é¿ ղ⨩´ä à¯\¥ºªû¸ñ¤ ¥é¿ ¯à¬O¤ñ¸û-p¼Æ¾¹ªº-È©M¿é¥X¤ñ¸û¼È¦s¾¹ OCRlA/OCR1Bªº¤®e;Timer/Counter1ÁÙ¥i¥H¦b¤ñ¸ûµ²ªG ¬Ûµ¥«Ï,²M°£-p¼Æ¾¹,¬O±¨î¤ñ¸û¿é¥X±µ¸}OC1A©M ©Î OC1Bªº°Ê§@¡C
Timer/Counter Interrupt Flag (TIFR)
Bit 7 – TOV1: Timer/Counter1 Overflow Flag Bit 6 – OCF1A: Output Compare Flag 1A Bit 5 – OCF1B: Output Compare Flag 1B Bit 3 – ICF1: Input Capture Flag 1 Bit 1 – TOV0: Timer/Counter0 Overflow Flag

AVR Mega 88定时器程序

AVR Mega 88定时器程序

Mega88定时器程序T/C控制寄存器B--TCCR0BT/C1控制寄存器B—TCCR1BT/C2控制寄存器B—TCCR2B//**********************************//System Clock: 3686400Hz// Timer/Counter0 Clock value: 9.600kHz//cs02 cs01 cs00(TCCR0B:00000CS02、CS01、CS00)// 0 0 0 不工作,无时钟源(T/C停止)// 0 0 1 /1:不分频(系统时钟)// 0 1 0 /8// 0 1 1 /64// 1 0 0 /256// 1 0 1 /1024//*******************************************************//************************T0--8BIT***********************//***************T0为8位定时器/计数器*******************// desired value: 15mSec// actual value: 14.931mSec (0.5%)//************************************void time_init(void){TCCR0A = 0x00; //正常端口操作,普通工作模式TCCR0B=0x00; //T/C不工作TCNT0 = 0x29; //TCNT0=41,即256-3686400×15×10-3/256=40 TIMSK0=0x01; //T/C0中断屏蔽寄存器,T/C0溢出中断使能//TCCR0B=0x04; //256分频//*******************************************************//***********************T1--16BIT***********************//****************T1为16位定时器/计数器*****************// desired value: 195uSec 原50mSec秒钟// actual value: 195.3125uSecTCCR1A = 0x00; //普通端口操作,普通工作模式TCCR1B = 0x00; //下降沿触发输入,T/C不工作TCNT1 = 0xa600; //定时 TCNT2=166,即256-3686400×195×10-6/8=166.144TCCR1B = 0x02; //8分频TIMSK1=0x01; //T/C1中断屏蔽寄存器,T/C1溢出中断使能//******************************************************//System Clock: 3686400Hz// Timer/Counter0 Clock value: 9.600kHz//cs02 cs01 cs00(TCCR0B:00000CS02、CS01、CS00)// 0 0 0 不工作// 0 0 1 /1:不分频(系统时钟)// 0 1 0 /8// 0 1 1 /32// 1 0 0 /64// 1 0 1 /128// 1 1 0 /256// 1 1 1 /1024//************************T2--8BIT**********************//****************T1为8位定时器/计数器*****************//TIMER2 initialize - prescale:1024// WGM: Normal// desired value: 44mSec// actual value: 43.889mSec (0.3%)TCCR2B = 0x00; //stop T/C不工作ASSR = 0x00; //set async mode 异步状态寄存器,TCNT2,OCR2A,OCR2B,TCCR2A,TCCR2B 可以写入新值 TCNT2 = 0x62; //setup 设置,TCNT2=98,即256-368400×44×10-3/1024=97.6OCR2A = 0x9E; //OCR2B = 0x00; //TCCR2A = 0x00; //正常端口操作,普通工作模式TIMSK2=0x01; //enable interrupt T/C2中断屏蔽寄存器,T/C2溢出中断使能//TCCR2B = 0x07; //start 1024分频//*********all t/c hase initialize*********}//*****************key_time**************** 我试了不过还要加TCCR2B = 0x07; //start 才可以定时ATmega16的TCNT0初值设置ATmega16的源程序,其中启动定时器0的程序如下:void StartTimer0(INT8U us) //开始定时器0 {TCCR0 = 0x00; //停止定时器if(us == 20){TCNT0 = 0xE4; //228,20us初始值}else if(us == 40){TCNT0 = 0xC9; //201,40us初始值}TIMSK |= 0x01; //中断允许TCCR0 = 0x02; //启动定时器,8分频}TCNT0是8位寄存器定时值:T=(256-计数初值)*分频数/晶振频率定时初值:T=256-(晶振频率/分频数)*定时值TCCR0 = 0x02设置时钟源来自预分频器。

AVR_定时器使用详解

AVR_定时器使用详解
//管脚定义 #define ICPKEY 6 //ICP1 PD6按键模拟 ICP 输入 #define PWM0 3 //OC0 PB3 #define PWM1A 5 //OC1A PD5 #define PWM1B 4 //OC1B PD4 #define PWM2 7 //OC2 PD7
//宏定义 #define PWM1A_ON() PORTD|= (1<<PWM1A) //输出高电平,灯亮 #define PWM1A_OFF() PORTD&=~(1<<PWM1A) //输出低电平,灯灭
int main(void) {
//上电默认 DDRx=0x00,PORTx=0x00输入,无上拉电阻
PORTA =0xFF;
//不用的管脚使能内部上拉电阻。
PORTC =0xFF;
PORTB =~ (1<<PWM0);
//低电平,灯灭
DDRB = (1<<PWM0);
//输出
Hale Waihona Puke PORTD =~((1<<PWM1A)|(1<<PWM1B)|(1<<PWM2)); //低电平,灯灭
(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10); //1024分频,WGM1=15快速 PWM 模式,TOP=OCRnA,ICP 下降沿触发,OC1B 正向 PWM 输出,OC1A 为普通 IO }
SIGNAL(SIG_INPUT_CAPTURE1) //输入捕捉中断 {
PWM 频率 = 系统时钟频率/(分频系数*(1+计数器上限值))

AVR单片机定时器使用总结TC0

AVR单片机定时器使用总结TC0

A VR单片机定时器使用总结T0一、普通模式:普通模式(WGM01:0 = 0) 为最简单的工作模式。

在此模式下计数器不停地累加。

计到8比特的最大值后(TOP = 0xFF),由于数值溢出计数器简单地返回到最小值0x00 重新开始。

在TCNT0 为零的同一个定时器时钟里T/C 溢出标志TOV0 置位。

此时TOV0 有点象第9 位,只是只能置位,不会清零。

但由于定时器中断服务程序能够自动清零TOV0,因此可以通过软件提高定时器的分辨率。

在普通模式下没有什么需要特殊考虑的,用户可以随时写入新的计数器数值。

输出比较单元可以用来产生中断。

但是不推荐在普通模式下利用输出比较来产生波形,因为这会占用太多的CPU 时间。

TCCR0:`该模式一般用来定时中断。

使用步骤:1、计算确定TCNT0初值;2、设工作方式,置初值;3、开中断;二、CTC( 比较匹配时清零定时器)模式在CTC 模式(WGM01:0 = 2) 下OCR0 寄存器用于调节计数器的分辨率。

当计数器的数值TCNT0等于OCR0时计数器清零。

OCR0定义了计数TOP值,亦即计数器的分辨率。

这个模式使得用户可以很容易地控制比较匹配输出的频率,也简化了外部事件计数的操作。

CTC模式的时序图为Figure 31。

计数器数值TCNT0一直累加到TCNT0与OCR0匹配,然后TCNT0 清零。

利用OCF0 标志可以在计数器数值达到TOP 时产生中断。

在中断服务程序里可以更新TOP的数值。

由于CTC模式没有双缓冲功能,在计数器以无预分频器或很低的预分频器工作的时候将TOP 更改为接近BOTTOM 的数值时要小心。

如果写入的OCR0 数值小于当前TCNT0 的数值,计数器将丢失一次比较匹配。

在下一次比较匹配发生之前,计数器不得不先计数到最大值0xFF,然后再从0x00 开始计数到OCF0。

为了在CTC 模式下得到波形输出,可以设置OC0 在每次比较匹配发生时改变逻辑电平。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void) //将每秒执行一次
{
//TIMER1 has overflowed
TCNT1H = 0xE3; //reload counter high value
用户在溢出中断中填写定时器重载语句,开始下一次定时工作,通过设定TCNTn的值和OCRn的值可以设置定时器的定时长短。*/
//TIMER0 initialize - prescale:1024 /*定时器预分频,预分频由TCCRn的CS02,CS01,CS00确定,详情查看数据手册*/
// WGM: Normal/*定时器*/
void timer0_comp_isr(void)
{
//compare occured TCNT0=OCR0 /*定时器比较匹配中断,这里没有添加任何语句,实际操作中可以用此实现自制PWM*/
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
使用ICC application builder快速配置定时器
第一步:新建工程保存到特定目录下。
第二步:ICC>>Tools>>application builder
第三步:设置单片机型号和晶振频率,如下图,非常重要,因为这会关系到定时的准确性甚至正确性。
第四步:设定定时器Timer0,操作如下图,请仔细核对每一项。这里我们跳过了端口IO的设定,因为对我们不是很重要。
// desired value: 20mSec/*定时器期望设定时间*/
// actual value: 19.861mSec (0.7%)/*定时器实际定时时间,误差比例*/
void timer0_init(void)
{
TCCR0 = 0x00; //stop/*定时器停止,TCCR0寄存器完全控制timer0的运行情况,详细可参考数据手册。*/
void timer1_compa_isr(void)
{
//compare occured TCNT1=OCR1A
}
#pragma interrupt_handler timer1_compb_isr:8
void timer1_compb_isr(void)
{
//compare occured TCNT1=OCR1B
程序如下:
//ICC-AVR application builder : 2006-11-24 11:46:03
// Target : M16
// Crystal: 7.3728Mhz
#include
#include
const led_table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x88,0x86,0xc7,0xc4,0x83,0x8b};// 0~~f
AVR使用范例--定时器应用范例
本页关键词: avr定时器计算 avr定时器应用 avr定时器中断范例 avr定时器 avr定时器0编程 avr定时器的应用程序 avr定时器使用例程 avr定时器输出脉冲 avr定时器程序 avr定时器初值
本文详细介绍avr定时器timer的使用方法,PWM的设定与注意事项,通过 ICC快速完成参数设定, 并通过一个实际例子定时LED的显示解说详细过程。定时器在工程中应用非常广泛,avr有八位和十六位两种定时器,AVR定时器能够非常精确的定时,下面介绍使用ICC application builder快速使用定时器的方法。
//定义LED的数据表,注意,只有0到9是正确的,A-F我没有认真写。
typedef unsigned char uint8;
uint8 i;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0x00;
// actual value: 1.000Sec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xE3; //setup
TCNT1L = 0xE1;
OCR1AH = 0x1C;
OCR1AL = 0x1F;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
下面通过用同样的方法操作做一个“小秒表”, LED每秒更新一次,效果如下图:
本程序我们用了定时器二,因为timer0是八位定时器,无法完成一秒的定时任务。下载相关文件
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
点击OK,检查生成的程序,下图展示了生成的程序的详细含义。
你将得到的程序如下,灰色部分为添加的注释。只介绍定时器部分,其他请参考新手入门相关内容,如果你并不急于理解这些内容,请跳过。
/*定时器的工作原理是:定时器在预分频这么多个时钟周期后使ICNIn的值加一,当TCNTn到达最大值时发生溢出中断。
while(1)
;
}

TIMSK = 0x1C; //timer interrupt sources /*定时器使用中断规则设定*/
SEI(); //re-enable interrupts
//all peripherals are now initialized
} Βιβλιοθήκη void main(void)
{
init_devices();
{
TCNT0 = 0x71; //reload counter value /*定时器溢出后需要重载TCNTn,然后在之后添加用户程序,
记住不要在定时器中断里添加特别耗时的程序。*/
}
//call this routine to initialize all peripherals
void init_devices(void)
TCNT1L = 0xE1; //reload counter low value
i++;
if(i==10) i=0; //等于十时,恢复零
PORTA=led_table[i]; //这里使LED变化
}
//call this routine to initialize all peripherals
OCR1BH = 0x1C;
OCR1BL = 0x1F;
ICR1H = 0x1C;
ICR1L = 0x1F;
TCCR1A = 0x00;
TCCR1B = 0x05; //start Timer
}
#pragma interrupt_handler timer1_compa_isr:7
TCNT0 = 0x71; //set count/*定时器寄存器开始值*/
OCR0 = 0x8F; //set compare/*定时器比较值*/
TCCR0 = 0x05; //start timer/*定时器开始*/
}
#pragma interrupt_handler timer0_comp_isr:20
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//TIMER1 initialize - prescale:1024
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Sec
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x03; //timer interrupt sources/*这里设定允许Timer0比较中断和溢出中断。*/
相关文档
最新文档