AVR定时器使用范例

合集下载

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定时器溢出定★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/*******************************************************************************Platform: ATmega16_Basic_V1.1开发板(/)1.Project : 范例16:TC0定时器溢出定时实验(ICC)2.Clock F : 内部1MHz3.Software: ICCAVR7.14C4.Author : 林夕依然5.Version : 10.04.166.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 : 2008-12-15 PM 10:41:53// Target : M16// Crystal: 1.0000Mhz#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)/1MHz=19.968msOCR0 = 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定时器使用范例

AVR定时器使用范例
}
#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/*定时器期望设定时间*/

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定时器1的CTC模式设置

AVR定时器1的CTC模式设置

AVR定时器1的CTC模式设置
在CTC模式编程的时候,要执行的步骤如下:
1. 将PD4~PD5 设置为输出(默认为低电平)。

DDRD|=BIT(4)|BIT(5);
2. 决定比较输出模式,试验中为模式电平取反。

TCCR1A=0x50;
3. 决定方波产生模式位,试验中是模式4, 亦即
WGM12=1。

TCCR1B|=BIT(3);
4. 决定分频N,这里就假设去1 吧,无预分频。

TCCR1B|=BIT(0);
5. 在步骤3 中,方波产生模式位为4,换句话说就是OCR1A 决定匹配的最大值。

CTC模式实际上就是比较输出模式,输出占空比相同的脉冲频率=时钟晶振/2N(1+OCRnA)
如:四个指令就可以配置好CTC模式(8M,输出2KHz): DDRD|=0X30;
TCCR1A=0X50;
TCCR1B=0X09;
OCR1A=1999;
#include ;
#include ;
void main()
{
DDRD|=0X30; //set PD4 and PD5 iS out
TCCR1A=0X50; //开启OC1A OC1B
TCCR1B=0X09; //配合TCCR1A,设置OC1A和OC1B为CTC 模式,CTC时钟源选择系统8M时钟
OCR1A=999; //设置OC1A的输出频率为4KHZ
OCR1B=59999; //设置OC1B的输出频率为200/3Hz
}。

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单片机16位定时器TC1实例

AVR单片机16位定时器TC1实例
最新的gcc是20100110版的他升级很快每个版本编程时有地方会不同你在老版本下通过到新版本下不一定通过所以需要固定一个版本使用并且要认真看看gccavr的帮助文件都是英文的建议打印出来仔细看这很重要关于教材上的定义中断的方式在2010下肯定不能用所以需要看帮助里的中断定义方面的改动和其余的勘误说明
8MHZ/1024=8000000HZ/1024=7812.5HZ,每个计数脉冲的周期时间为1/7812.5=0.128ms,计时200ms的计数器值为:65635-200ms/0.128ms=63972=0xF9E4,则TCNT1H付初值为0xF9,TCNT1L付初值为0xE4.//函数功能:实现PA口的led亮0.1S,灭0.9S
#include
#define uchar unsigned char
/********以下是端口初始化函数********/
void port_init()
{
DDRA= 0xFF;//PA设置为输出口
PORTA = 0xFF;//PA输出高电平
}
/********定时器1初始化********/

TCNT1H = 0xCF;//计数器置初值
TCNT1L = 0x2C;
TCCR1A |= 0x00;//普通端口模式
AVR单片机16位定时器TC1实例
第一篇:AVR单片机16位定时器TC1实例
T/C1是16位定时器/计数器,它的计数器由两个8位寄存器TCNT1H,TCNT1L构成,TCNT1H是高8位寄存器,TCNT1L是低8位寄存器。最大计算值为2的16次幂,十六进制是0xFFFF=65535.例如:定时200ms,晶振8MHZ,分频系数1024,计数时钟频率为

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汇编例程]AVR单片机用定时器1产生PWM波形实验

[AVR汇编例程]AVR单片机用定时器1产生PWM波形实验

[AVR汇编例程]AVR单片机用定时器1产生PWM波形实验AVR单片机的定时器功能非常强大,除了一般的定时、计数功能外,还具有PWM波形发生,捕获和比较等功能。

本实验演示AVR单片机的定时器产生PWM波形的方法。

我们配置定时器1(Timer1)工作在10位相位修正PWM波形产生模式。

该程序用AVR- Studio-4 开发,在AVR单片机Atmega48上调试通过。

本实验的详细说明和硬件搭建请参考>>;--------------------------------------------------------------------------------------------------;--------单片机入门实验用定时器1产生PWM波形实验 AVR 汇编程序-----------;--------------------------------------------------------------------------------------------------;作者: 超简单工作室;Email:********************;软件版本: AVR Studio 4.13.571 Service Pack 2;创建日期: 2008.5;版本 V1.00;; Target : M48; Crystal: 8.0000Mhz;*****************************************************.include "m48def.inc".org $0000rjmp _main.org $0020_port_init:; PORTB = 0x00;clr R2out 0x5,R2; DDRB = 0x06;ldi R24,6out 0x4,R24; PORTC = 0x00;out 0x8,R2; DDRC = 0x00;out 0x7,R2; PORTD = 0x00;out 0xb,R2; DDRD = 0x00;out 0xa,R2ret_timer1_init:; TCCR1B = 0x00; //stopclr R2sts 129,R2; TCNT1H = 0xFC; //setupldi R24,252sts 133,R24; TCNT1L = 0x01;ldi R24,1sts 132,R24; TCCR1A = 0xE3;ldi R24,227sts 128,R24; TCCR1B = 0x03; //start Timer ldi R24,3sts 129,R24ret_adc_init:; 设置前,先关闭ADCclr R2sts 122,R2; 选择内部AVCC为基准ldi R24,64sts 124,R24; 关闭模拟比较器ldi R24,128out 0x30,R24; 使能ADC,启动ADC单次转换,选64分频ldi R24,198sts 122,R24ret_adc_get:; 启动ADC转换lds R24,122ori R24,64sts 122,R24L5:lds R2,122sbrc R2,6rjmp L5lds R16,120lds R17,120+1ret_main:rcall _port_initrcall _timer1_initrcall _adc_initL9:; adc_v = adc_get(); //ADC转换rcall _adc_get; lt = 1023 - adc_v;ldi R24,0xffldi R25,3movw R12,R24sub R12,R16sbc R13,R17; rt = 1023 - adc_v;sub R24,R16sbc R25,R17movw R10,R24;; OCR1A = lt;sts 136+1,R13sts 136,R12; OCR1B = rt;sts 138+1,R11sts 138,R10rjmp L9ret。

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 在每次比较匹配发生时改变逻辑电平。

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+计数器上限值))

AVR128定时器计数器1详细解读,附详细程序注释,初学者一看就懂的程序哦

AVR128定时器计数器1详细解读,附详细程序注释,初学者一看就懂的程序哦

1:如何设置A VR单片机的时钟?答:可以通过设置熔丝位来确定A VR单片机工作时的时钟是来自外部晶振还是来自内部的振荡器。

熔丝位设置:芯片有如下几种通过熔丝位选择的时钟源。

时钟输入到AVR 时钟发生器,并通往其他合适的模块。

Table 6.时钟源选择芯片时钟选项CKSEL3..0(1)外部晶体/ 陶瓷振荡器1111 - 1010外部低频晶体1001外部RC 振荡器1000 - 0101标定的内部RC 振荡器0100 - 0001外部时钟0000 2.如何操作定时器计数器1,让其工作在定时状态?答:(1)通过设置寄存器TCCR1A,和寄存器TCCR1B中的相应位来给定时器选择分频系数。

(2)向数据寄存器TCNT1H,TCNT1L装初值。

(3)设置定时器/ 计数器中断屏蔽寄存器TIMSK中的第二位TOIE1=1;(4)打开总中断,置SREG中的第4位为‘1’,打开总中断,这里只需使SREG|=0X80即可;(5)在中断函数中重装初值。

3.中断函数格式:#pragma interrupt_handler函数名():中断向量序号void 函数名(){重装初值;其它程序代码.}4.如何计算计数初始值?答:举例说明:若我们设置定时器工作的分频为M分频,时钟频率为fclk,则单片机产生一次中断的时间为t=fclk/m.则若设置定时T则要记的数N为:N=T/t;定时器1 (16位定时器)寄存器TCCR1B = 0x04 设定256预分频要利用定时器定时1秒1,4000000 / 256 = 15625 说明定时器每当1/15625 秒就会触发一次中断2,65535 - 15625 = 49910 //1s/(产生一次中断的时间)计算出要累加多少次才能在1秒后出发定时器1的溢出中断3,49910 <==> C2 F6 将计算后的值换算成16进制4,TCNT1H = 0xC2 ; 对寄存器赋初值TCNT1L = 0xF6 ;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AVRʹÓ÷¶Àý--¶¨Ê±Æ÷Ó¦Ó÷¶Àý±¾Ò³¹Ø¼ü´Ê£º avr¶¨Ê±Æ÷¼ÆËã avr¶¨Ê±Æ÷Ó¦Óà avr¶¨Ê±Æ÷ÖжϷ¶Àý avr¶¨Ê±Æ÷ avr¶¨Ê±Æ÷0±à³Ì avr¶¨Ê±Æ÷µÄÓ¦ÓóÌÐò avr¶¨Ê±Æ÷ʹÓÃÀý³Ì avr¶¨Ê±Æ÷Êä³öÂö³å avr¶¨Ê±Æ÷³ÌÐò avr¶¨Ê±Æ÷³õÖµ±¾ÎÄÏêϸ½éÉÜavr¶¨Ê±Æ÷timerµÄʹÓ÷½·¨£¬PWMµÄÉ趨Óë×¢ÒâÊÂÏͨ¹ýICC¿ìËÙÍê³É²ÎÊýÉ趨£¬²¢Í¨¹ýÒ»¸öʵ¼ÊÀý×Ó¶¨Ê±LEDµÄÏÔʾ½â˵Ïêϸ¹ý³Ì¡£¶¨Ê±Æ÷ÔÚ¹¤³ÌÖÐÓ¦Ó÷dz£¹ã·º£¬avrÓаËλºÍÊ®ÁùλÁ½ÖÖ¶¨Ê±Æ÷£¬AVR¶¨Ê±Æ÷Äܹ»·Ç³£¾«È·µÄ¶¨Ê±£¬ÏÂÃæ½éÉÜʹÓÃICC application builder¿ìËÙʹÓö¨Ê±Æ÷µÄ·½·¨¡£Ê¹ÓÃICC application builder¿ìËÙÅäÖö¨Ê±Æ÷µÚÒ»²½£ºÐ½¨¹¤³Ì±£´æµ½Ìض¨Ä¿Â¼Ï¡£µÚ¶þ²½£ºICC>>Tools>>application builderµÚÈý²½£ºÉèÖõ¥Æ¬»úÐͺź;§ÕñƵÂÊ£¬ÈçÏÂͼ£¬·Ç³£ÖØÒª£¬ÒòΪÕâ»á¹Øϵµ½¶¨Ê±µÄ׼ȷÐÔÉõÖÁÕýÈ·ÐÔ¡£µÚËIJ½£ºÉ趨¶¨Ê±Æ÷Timer0£¬²Ù×÷ÈçÏÂͼ£¬Çë×ÐϸºË¶ÔÿһÏî¡£ÕâÀïÎÒÃÇÌø¹ýÁ˶˿ÚIOµÄÉ趨£¬ÒòΪ¶ÔÎÒÃDz»ÊǺÜÖØÒª¡£µã»÷OK£¬¼ì²éÉú³ÉµÄ³ÌÐò£¬ÏÂͼչʾÁËÉú³ÉµÄ³ÌÐòµÄÏêϸº¬Òå¡£Ä㽫µÃµ½µÄ³ÌÐòÈçÏ£¬»ÒÉ«²¿·ÖΪÌí¼ÓµÄ×¢ÊÍ¡£Ö»½éÉܶ¨Ê±Æ÷²¿·Ö£¬ÆäËûÇë²Î¿¼ÐÂÊÖÈëÃÅÏà¹ØÄÚÈÝ£¬Èç¹ûÄã²¢²»¼±ÓÚÀí½âÕâЩÄÚÈÝ£¬ÇëÌø¹ý¡£/*¶¨Ê±Æ÷µÄ¹¤×÷Ô-ÀíÊÇ£º¶¨Ê±Æ÷ÔÚÔ¤·ÖƵÕâô¶à¸öʱÖÓÖÜÆÚºóʹICNInµÄÖµ¼ÓÒ»£¬µ±TCNTnµ½´ï×î´óֵʱ·¢ÉúÒç³öÖжϡ£Óû§ÔÚÒç³öÖжÏÖÐÌîд¶¨Ê±Æ÷ÖØÔØÓï¾ä£¬¿ªÊ¼ÏÂÒ»´Î¶¨Ê±¹¤×÷£¬Í¨¹ýÉ趨TC NTnµÄÖµºÍOCRnµÄÖµ¿ÉÒÔÉèÖö¨Ê±Æ÷µÄ¶¨Ê±³¤¶Ì¡£*///TIMER0 initialize - prescale:1024 /*¶¨Ê±Æ÷Ô¤·ÖƵ£¬Ô¤·ÖƵÓÉTCCRnµÄCS02,CS01,CS00È·¶¨£¬ÏêÇé²é¿´Êý¾ÝÊÖ²á*/// WGM: Normal/*¶¨Ê±Æ÷*/// desired value: 20mSec/*¶¨Ê±Æ÷ÆÚÍûÉ趨ʱ¼ä*/// actual value: 19.861mSec (0.7%)/*¶¨Ê±Æ÷ʵ¼Ê¶¨Ê±Ê±¼ä£¬Îó²î±ÈÀý*/ void timer0_init(void){TCCR0 = 0x00; //stop/*¶¨Ê±Æ÷Í£Ö¹£¬TCCR0¼Ä´æÆ÷ÍêÈ«¿ØÖÆtimer0µÄÔËÐÐÇé¿ö£¬Ïêϸ¿É²Î¿¼Êý¾ÝÊֲᡣ*/TCNT0 = 0x71; //set count/*¶¨Ê±Æ÷¼Ä´æÆ÷¿ªÊ¼Öµ*/OCR0 = 0x8F; //set compare/*¶¨Ê±Æ÷±È½ÏÖµ*/TCCR0 = 0x05; //start timer/*¶¨Ê±Æ÷¿ªÊ¼*/}#pragma interrupt_handler timer0_comp_isr:20void timer0_comp_isr(void){//compare occured TCNT0=OCR0 /*¶¨Ê±Æ÷±È½ÏÆ¥ÅäÖжϣ¬ÕâÀïûÓÐÌí¼ÓÈκÎÓï¾ä£¬Êµ¼Ê²Ù×÷ÖпÉÒÔÓôËʵÏÖ×ÔÖÆPWM*/}#pragma interrupt_handler timer0_ovf_isr:10void timer0_ovf_isr(void){TCNT0 = 0x71; //reload counter value /*¶¨Ê±Æ÷Òç³öºóÐèÒªÖØÔØTCNTn£¬È»ºóÔÚÖ®ºóÌí¼ÓÓû§³ÌÐò£¬¼Çס²»ÒªÔÚ¶¨Ê±Æ÷ÖжÏÀïÌí¼ÓÌرðºÄʱµÄ³ÌÐò¡£*/}//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 = 0x03; //timer interrupt sources/*ÕâÀïÉ趨ÔÊÐíTimer0±È½ÏÖжϺÍÒç³öÖжϡ£*/SEI(); //re-enable interrupts//all peripherals are now initialized}ÏÂÃæͨ¹ýÓÃͬÑùµÄ·½·¨²Ù×÷×öÒ»¸ö¡°Ð¡Ãë±í¡±£¬LEDÿÃë¸üÐÂÒ»´Î£¬Ð§¹ûÈçÏÂͼ£º±¾³ÌÐòÎÒÃÇÓÃÁ˶¨Ê±Æ÷¶þ£¬ÒòΪtimer0ÊÇ°Ëλ¶¨Ê±Æ÷£¬ÎÞ·¨Íê³ÉÒ»ÃëµÄ¶¨Ê±ÈÎÎñ¡£ÏÂÔØÏà¹ØÎļþ³ÌÐòÈçÏ£º//ICC-AVR application builder : 2006-11-24 11:46:03// Target : M16// Crystal: 7.3728Mhz#include#includeconstled_table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0 x88,0x86,0xc7,0xc4,0x83,0x8b};// 0~~f//¶¨ÒåLEDµÄÊý¾Ý±í£¬×¢Ò⣬ֻÓÐ0µ½9ÊÇÕýÈ·µÄ£¬A-FÎÒûÓÐÈÏÕæд¡£ typedef unsigned char uint8;uint8 i;void port_init(void){PORTA = 0x00;DDRA = 0xFF;PORTB = 0x00;DDRB = 0x00;PORTC = 0x00; //m103 output onlyDDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}//TIMER1 initialize - prescale:1024// WGM: 0) Normal, TOP=0xFFFF// desired value: 1Sec// actual value: 1.000Sec (0.0%)void timer1_init(void){TCCR1B = 0x00; //stopTCNT1H = 0xE3; //setupTCNT1L = 0xE1;OCR1AH = 0x1C;OCR1AL = 0x1F;OCR1BH = 0x1C;OCR1BL = 0x1F;ICR1H = 0x1C;ICR1L = 0x1F;TCCR1A = 0x00;TCCR1B = 0x05; //start Timer}#pragma interrupt_handler timer1_compa_isr:7void timer1_compa_isr(void){//compare occured TCNT1=OCR1A}#pragma interrupt_handler timer1_compb_isr:8void timer1_compb_isr(void){//compare occured TCNT1=OCR1B}#pragma interrupt_handler timer1_ovf_isr:9void timer1_ovf_isr(void) //½«Ã¿ÃëÖ´ÐÐÒ»´Î{//TIMER1 has overflowedTCNT1H = 0xE3; //reload counter high valueTCNT1L = 0xE1; //reload counter low valuei++;if(i==10) i=0; //µÈÓÚʮʱ£¬»Ö¸´ÁãPORTA=led_table[i]; //ÕâÀïʹLED±ä»¯}//call this routine to initialize all peripheralsvoid init_devices(void){//stop errant interrupts until set upCLI(); //disable all interruptsport_init();timer1_init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x1C; //timer interrupt sources /*¶¨Ê±Æ÷ʹÓÃÖжϹæÔòÉ趨*/ SEI(); //re-enable interrupts//all peripherals are now initialized}void main(void) {init_devices(); while(1);}。

相关文档
最新文档