ATMEGA16定时器的使用
ATmega16 的EEPROM的使用
ATmega16 包含512 字节的EEPROM 数据存储器。
它是作为一个独立的数据空间而存在的,可以按字节读写。
EEPROM 的寿命至少为100,000 次擦除周期。
EEPROM 的访问由地址寄存器、数据寄存器和控制寄存器决定。
通过SPI和JTAG及并行电缆下载EEPROM数据的操作请分别参见P260、P265及P250。
EEPROM 读/ 写访问EEPROM 读/ 写访问EEPROM 的访问寄存器位于I/O 空间。
EEPROM的写访问时间由Table 1给出。
自定时功能可以让用户软件监测何时可以开始写下一字节。
用户操作EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路中,上电/ 下电时VCC 上升/ 下降速度会比较慢。
此时CPU 可能工作于低于晶振所要求的电源电压。
请参见P20“ 防止EEPROM 数据丢失” 以避免出现EEPROM 数据丢失的问题。
为了防止无意识的EEPROM 写操作,需要执行一个特定的写时序。
具体参看EEPROM控制寄存器的内容。
执行EEPROM 读操作时,CPU 会停止工作4 个周期,然后再执行后续指令;执行EEPROM 写操作时,CPU 会停止工作2 个周期,然后再执行后续指令。
EEPROM 地址寄存器-EEARH和EEARL· Bits 15..9 – Res: 保留保留位,读操作返回值为零。
· Bits 8..0 – EEAR8..0: EEPROM 地址EEPROM地址寄存器– EEARH和EEARL指定了512字节的EEPROM空间。
EEPROM地址是线性的,从0 到511。
EEAR 的初始值没有定义。
在访问EEPROM 之前必须为其赋予正确的数据。
EEPROM 数据寄存器-EEDR· Bits 7..0 – EEDR7.0: EEPROM 数据对于EEPROM 写操作,EEDR 是需要写到EEAR 单元的数据;对于读操作,EEDR 是从地址EEAR 读取的数据。
AVR单片机教程14—第十四课 ATmega16L的定时计数器学习
——————————————————————————第十四课ATmega16L的定时/计数器学习本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书实验器材,可登陆周兴华单片机培训中心网购部自助购买!ATmega16L有两个8位定时/计数器(T/C0、T/C2)和一个16位定时/计数器(T/C1)。
每一个计数器都支持PWM(脉冲宽度调制)输出功能。
PWM输出在电机控制、开关电源、信号发生等领域有着广泛的应用。
ATmega16L的定时/计数器时钟是可以选择的。
它的时钟部分包括预分频器和一个多路选择器。
预分频器可被认为是单片机开发中一个有多级输出的分频器。
ATmegal6L用一个10位的计数器把输入时钟分为4种可选择的分频输出。
多路选择器可设置使用某一个分频输出,或者不使用分频输出和使用外部引脚输人时钟。
图9-1为预分频器的基本结构。
——————————————————————————图9-1 预分频器的基本结构9.2 ATmega16L定时/计数器的时钟选择1.使用系统时钟这种情况下使用系统时钟作为预分频器的输入,不过系统时钟的频率一般比较高,所以一般只能实现比较短的定时。
预分频比可通过设置TCCRx的CSx2、CSxl和CSx0来选定。
表9-1给出一个预分频设置值和分频比关系。
TCCRx同步计数器0和1Pck=CK 同步/异步计数器2 Pck=f(AS2)210CSx2CSx1CSx0Tck0,Tck1Tck2000Pck(系统时钟)Pck(系统时钟/异步时钟)001Pck/8Pck/8010Pck/64Pck/32011Pck/256Pck/64100Pck/1024Pck/128101引脚Tx下降沿Pck/256110引脚Tx上升沿Pck/512111Pck Pck/1024表9-1 预分频设置值和分频比关系2.使用异步时钟ATmegal6L的T/C2可以使用外部的异步时钟作为时钟源,这时可以在单片机的TOSC1和TOSC2——————————————————————————两个引脚之间接一个石英晶体或者陶瓷振荡器,和内部的振荡器连接起来。
Atmega16的定时器time0
Atmega16的定时器time0分类:AVR 2007-09-01 05:04 3180人阅读评论(2) 收藏举报依照AVR使用范例--定时器应用范例/avr_examples/timer.html。
使用ICC application builder快速配置定时器后生成的代码如下://ICC-AVR application builder : 2007-8-28 0:55:55// Target : M16// Crystal: 7.3728Mhz#include <iom16v.h>#include <macros.h>void port_init(void){PORTA = 0x00;DDRA = 0x00;PORTB = 0x00;DDRB = 0x00;PORTC = 0x00; //m103 output onlyDDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}TIMER0 initialize - prescale:1024 /*定时器预分频,预分频由TCCRn的CS02,CS01,CS00确定,详情查看数据手册*/// WGM: Normal/*定时器,也由TCCRn确定*/// desired value: 20mSec/*定时器期望设定时间*/// actual value: 19.861mSec (0.7%)/*定时器实际定时时间,误差比例*/void timer0_init(void){/*定时器停止,TCCR0寄存器完全控制timer0的运行情况,详细可参考数据手册。
*/ TCCR0 = 0x00; //stopTCNT0 = 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}#pragma interrupt_handler timer0_ovf_isr:10void timer0_ovf_isr(void){TCNT0 = 0x71; //reload counter value}//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 sourcesSEI(); //re-enable interrupts//all peripherals are now initialized}下面我们一步一步按顺序来分析。
ATMEGA16定时器0
ATMEGA16定时器0(2013-04-09 21:51:35)转载▼分类:AVR标签:avr定时器0MEGA16定时器0T/C0 是一个八位定时器,主要有定时、外部事件计数、产生PWM 波形这几个功能,我们在使用这些功能之前,首先要设置T/C0 工作在合适的工作模式下。
T/C0 有四种工作模式,分别是普通模式、CTC 模式、快速PWM、相位可调的PWM 模式四种。
模式设置通过T/C0 的控制寄存器TCCR0 来完成。
1.普通模式在此模式下,T/C0 的计数寄存器TCNT0 在时钟的驱动下不停累加。
当计满后(计数值达到最大,8 位寄存器最大计数值为0xff),由于数值的溢出寄存器清零重新开始累加。
当计数器溢出后,TIFR 中的溢出标志位TOV0 会置位,也可触发中断。
所以我们可以通过查询或中断的方式得知定时器的溢出从而进行相关处理。
此模式适合定时与计数。
关于定时和计数,这里的定时功能是T/C0 在对时钟计数达到一定的值后引发中断,达到了定时功能,然而本质的过程是计数工作。
那么这里所说的计数功能是外部事件计数。
实例:T/C0 定时实验,将T/C0 设置为普通模式,对1024 分频的系统时钟进行计数,计满发生中断,40 次中断递增一个计数用的变量,主函数则不停显示这个变量。
第一步:开总中断,SREG |= 0X80;第二步:开T/C0 溢出中断第三步:模式设置、分频设置、匹配输出模式设置T/C0 控制寄存器用于设置工作模式,时钟分频和波形输出模式。
这里T/C0 设置为普通模式,WGM00-WGM01设置为00。
此模式下定时器的TOP 值,也就是能够达到的最大计数值为0xFF。
TOV0 在计数器计满后置位,也就是计到MAX,八位的定时器计数达到255 为计满。
低三位设置定时器时钟。
T/C0 在系统时钟的分频或外部时钟的驱动下递增或递减。
系统时钟也就是晶振的大小是11.0592MHZ。
此实验中,设置为1024 分频。
ATmega16定时计数器0,1,2的普通模式彻底应用
while(!(TIFR&0x04));
TIFR=0x04;
TCNT1H=tempH;
TCNT1L=tempL;
}
void Timer1_InterruptMode(void)//T/C1中断方式函数
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
//Timer2_NquiryMode(6);
cnt=cnt+1;
//DisplayNumber(8,0,num++);
if(cnt==10)
{
cnt=0;
PORTA=0xff;
DisplayNumber(8,1,num);
PORTA=0x00;
num++;
if(num==60)num=0;
}
}
}*/
DisplayString(0,0,Table);
while(1)
{
//DisplayNumber(8,0,num++);
if(cnt==10)//cnt=500使用Timer0,2时。cnt=10使用Timer1时
{
cnt=0;
PORTA=0xff;
DisplayNumber(8,1,num);
PORTA=0x00;
TIFR=0x01;
TCNT0=temp;
}
void Timer0_InterruptMode(void)//T/C0中断方式函数
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
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寄存器了。
ATmega16单片机定时器讲解
13
3.2.2、ATmega16单片机定时器的特殊功能寄存器
计数寄存器--TCNT0:
位[7:0]: T/C0计数器的值。 根据计数器的工作模式,在每一个clkT0时钟到来时,计数器进行
加1、减1或清零操作。MCU 可以对这8位数据进行读写访问。
6
3.2、ATmega16单片机定时器T/C0的组成原理及特殊功能寄存器
ATmega16单片机配置了3个定时器, 它们是8位的定时器T/C0、8位的定时器 T/C2和16位的定时器T/C1,这些定时器 的工作原理基本相同,我们主要以8位定 时器T/C0为例说ATmega16单片机定时器 使用方法。
2
N分频设计
3
编写书上的例5-6 用CTC中断和溢出中断
4
秒表两个按键一开一关
5
表两个按键
34
3.5.2、ATmega16单片机定时器的设计应用
硬件设计:5V源自AVVcccc 517 Vcc 27 Vcc 38
R1 10K
4 /RE T
C0 4.7u
ATm eg a1 6
AJ1
C7 33 OSC1 C6 33
12 PD .3(/INT1)
8 XTAL1
7 XTAL2
L1 R21~28
L2 R29~36
L3 R37~44
L4 R45~52
dp g f e d c b a
dp g f e d c b a
dp g f e d c b a
13 12 11 10 6 5 4 3 PC.6 25 1
2 U8 74HC164
ATmega16单片机的使用
ATmega16单片机的使用——实验一 Atmega16定时器T/C0实现按键扫描——实验二 ATmega16单片机的ADC使用举例指导老师:黄刚班级:0720222姓名:李锋锐学号:28试验《一》 Atmega16定时器T/C0实现按键扫描(一)实验目的:用ATmega16实现同时对两个按键定时扫描,要求扫描周期为10MS ,当AJ1按下,LED2点亮,并且BELL 蜂鸣声,当AJ1松开,LED2熄灭,BELL 不响;当AJ2按下,LED3点亮,并且BELL 发出蜂鸣声,当AJ2松开,LED3熄灭,BELL 不响。
(二)实验原理(硬件设计):如图5-37所示,端口PD.3、PD.4为输入端,分别接AJ1和AJ2;端口PD.6、PD.7为输出模式,分别接LED2和LED3;端口PA.4为输出,通过三极管T1来控制蜂鸣器。
图5-36 基于Atmega16单片机定时器的按键扫描电路图(三)实验原理(软件设计):选用外部7.3728MHz 的晶振为系统时钟,按键扫描间隔定位10ms ,定时器T/C0采用CTC 模式,T/C0时钟选择1024分频后的系统时钟,并启用中断。
利用CTC 模式的工作原理,OCR0应赋的值由以下方程确定:361010)10(1024103728.71-⨯=+⨯⨯⨯OCR 于是:)(即0x47710=OCR 。
允许比较匹配中断,在中断程序里做标志位设置,判断标志位满足条件时,程序再读取键盘的状态,确定有无键按下以及按下键的具体操作。
程序如下:(1) L5-6.c#include<iom16.h> #include"key.h"#define Led2 PORTD_Bit6//定义led2 #define Led3 PORTD_Bit7//定义led3 #define Bell PORTA_Bit4//定义bell unsigned char flag=0;void port_init(void);void timer0_init(void);//************************主程序****************************//void main(void){port_init();timer0_init();SREG_Bit7=1;//使能全局中断TCCR0=0x0D;// 定时器工作模式为CTC模式,定时器时钟源来自预分频器的1024分频 while(1){if(flag==1){flag=0;switch(read_key()){case 0:Led2 =1; // Led2灯不亮Led3=1; //Led3灯不亮Bell =0; //蜂鸣器不响break;case 1:Led2 =0; //led2灯亮Led3=1; //Led3灯不亮Bell =1; //蜂鸣器响break;case 2:Led2 =1; //led2灯不亮Led3=0; //Led3灯亮Bell =1; //蜂鸣器响break;}}}}//*******************端口初始化程序*****************************//void port_init(void){DDRD=0xc0;PORTD=0x18;//PD.3( AJ1 )和PD.4( AJ12)方向输入,上拉有效,PD.6(Led2)和//PD.7(Led3)方向输出DDRA=0x10;PORTA=0x00;//PA.4(Bell)方向输出}//******************定时器寄存器初始化程序*(***********************//void timer0_init(void){TCCR0=0x00;TCNT0=0x00;OCR0=0x47; //7.3728MHz的系统时钟(OCR0=0X48)10msTIMSK=0x02; //TC0比较匹配中断使能}//******************定时器0比较匹配中断服务程序***********************// #pragma vector=TIMER0_COMP_vect__interrupt void TIMER0_COMP_isr(void){SREG_Bit7=0;//关闭全局中断flag=1; //标志位置位SREG_Bit7=1; //打开全局中断}(2) key.h#include<iom16.h>#define AJ1 PIND_Bit3//定义按键1#define AJ2 PIND_Bit4//定义按键2unsigned char read_key(){static unsigned char key_state=0;unsigned char key_return=0;switch((key_state)){case 0:if(!AJ1||!AJ2){key_state=1;}break;case 1:if(!AJ1||!AJ2){switch((PIND&0x18)){case 0x10://AJ1按下,返回1key_return=1;break;case 0x08://AJ2按下,返回2key_return=2;break;}key_state=2;}else{key_state=0;}break;case 2:if(AJ1&&AJ2){key_state=0;}if(!AJ1){key_return=1;}if(!AJ2){key_return=2;}break;default: break;}return ( key_return);}四、实验结果:ATmega16可实现同时对两个按键定时扫描,扫描周期为10MS,当AJ1按下,LED2点亮,并且BELL蜂鸣声,当AJ1松开,LED2熄灭,BELL不响;当AJ2按下,LED3点亮,并且BELL发出蜂鸣声,当AJ2松开,LED3熄灭,BELL不响。
Almel ATmega16 ATmega16 微控制器 说明书
PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) AREF GND AVCC PC7 (TOSC2) PC6 (TOSC1) PC5 (TDI) PC4 (TDO)
声明
本数据手册的典型值来源于对器件的仿真,以及其他基于相同产生工艺的 AVR 微控制器 的标定特性。本器件经过特性化之后将给出实际的最大值和最小值。
•
•
具有 16KB 系统 内可编程 Flash 的8位 微控制器 ATmega16 ATmega16L
•
•
• • • •
本文是英文数据手册的中文 翻译,其目的是方便中国用 户的阅读。它无法自动跟随 原稿的更新,同时也可能存 在翻译上的错误。读者应该 以英文原稿为参考以获得更 准确的信息。
2466G–AVR–10/03
PA0 - PA7 VCC PC0 - PC7
PORTA DRIVERS/BUFFERS
PORTC DRIVERS/BUFFERS
GND
PORTA DIGITAL INTERFACE
PORTC DIGITAL INTERFACE
AVCC
MUX & ADC
AREF PROGRAM COUNTER
ADC INTERFACE
XTAL2 MCU CTRL. & TIMING RESET
INSTRUCTION DECODER
Y Z
CONTROL LINES
ALU
INTERRUPT UNIT
INTERNAL CALIBRATED OSCILLATOR
AVR CPU
STATUS REGISTER
EEPROM
PROGRAMMING LOGIC
Atmega16定时器
定时计数器应用例图
例1录像
例2录像
例3录像
例4录像
事件捕获原理
捕获原理框图如下图所示: 当外部捕获事件发生时,立即打开闸门电路将定 时器/计数器的当前值装入捕获寄存器。一旦定时 器/计数器的当前值被装入捕获寄存器,捕获标志 位ICF立即置1并同时产生输入捕获中断请求2。
事件捕获原理
捕获寄存器 溢出标志ICF S2 中断请求 捕获事件 S0 闸门电路
6.1.2 计数器原理
启动计数 器工作的 开关
当S1合上,若检测 到有有效脉冲输入 时,计数器加1 中断请求 开放与禁 止开关
S1
计数器 初值寄存器
S2 溢出标志TF
当S2合上并 且TF=1时, 可向CPU请 求中断
当计数器加到 256时,溢出标 志由0变成1
默认初值为0, 可根据需要 设置初值
6.1.2 计数原理
6.1.1 定时计数器概述
采用单片机定时/计数器定时:为了使用方便, 解决上述两种方式的弊端并增加单片机的控制功 能,把定时计数逻辑电路集成在单片机芯片中, 称之为定时计数器。
ATmegal6内部有3个通用定时器/计数器:2个 8位的定时器/计数器:T/CO、T/C2,1个16位的 定时器/计数:T/C1。3个通用定时器/计数器除 了能够实现通常的定时计数功能外,还具有捕获, 比较、脉宽调制输出(PWM)实时时钟等超强功能; 我们这一节主要介绍定时计数的基本原理及应用。
T0/T2控制寄存器TCCR0/TCCR2:
-
-
-
-
(T/C1)
CSn2
CSn1
CSn0
返回例1
返回例2
返回例3
M16的中断控制系统
中断标志寄存器TIFR 0 1 0 0 0 1 0 1 状态寄存器SREG|=0X80 1 0 0 0 0 0 0 0
最全面的AVRmega16定时计数器的学习笔记
定时计数器学习笔记ATmega16一共配置了2个8位和1个16位,共3个定时计数器,它们是8位的定时计数器T/C0、T/C2和16位的定时计数器T/C1。
一、学习和使用定时计数器时,必须注意以下的基本要素:1、脉冲信号源。
脉冲信号源是指输入到定时计数器的计数脉冲信号。
通常用于定时计数器计数的脉冲信号可以由外部输入引脚提供,也可以由单片机内部提供。
2、计数器类型。
计数器类型是指计数器的计数运行方式,可分为加一(减一)计数器,单程计数或双向计数等。
3、计数器的上下限。
计数器的上下限指计数单元的最小值和最大值。
一般情况下,计数器的下限值为零,上限值为计数单元的最大计数值,即255(8位)或65535(16位)。
需要注意的是,当计数器工作在不同模式下时,计数器的上限值并不都是计数单元的最大计数值255或65535,它将取决于用户的配置和设定。
4、计数器的事件。
计数器的事件指计数器处于某种状态时的输出信号,该信号通常可以向MCU申请中断。
如当计数器计数到达计数上限值255时,产生“溢出”信号,向MCU申请中断。
二、8位定时计数器T/C0、T/C2(一)T/C0、T/C2的特点:(1)单通道计数器。
(2)比较匹配时清零计数器(自动重装特性,Auto Reload)。
(3)可产生无输出抖动(glitch-free)的,相位可调的脉宽调制(PWM)信号输出。
(4)频率发生器。
(5)外部事件计数器(仅T/C0)。
(6)带10位的时钟预分频器。
(7)溢出和比较匹配中断源(TOV0、OCF0和TOV2、OCF2)。
(8)允许使用外部引脚的32kHz手表晶振作为独立的计数时钟源(仅T/C2)。
(二)寄存器1、TCNT0——TC0计数寄存器TCNT0是T/C0的计数值寄存器。
写TCNT0寄存器将在下一个定时器时钟周期中阻塞比较匹配。
因此,在计数器运行期间修改TCNT0的内容,有可能将丢失一次TCNT0与OCR0的匹配比较操作2、OCR0——输出比较寄存器8位寄存器OCR0中的数据用于同TCNT0寄存器中的计数值进行匹配比较。
单片机ATMEGA16应用案例
图 1 电路图
现代制造技术与装备2016年12月-正文-20170105.indd 155
2017/1/6 9:55:20来自 1562.2 控制逻辑
现代制造技术与装备
2016 第 12 期 总第 241 期
void PRINT_INT0(void) //pd2 print 打印信号用于 触发 CCD 拍照处理 { CCD_result=PIND;CCD_result&=BIT(6); //PD6 取拍 照检测结果,合格为零不合格 1 if(CCD_result==0) label_queue|=BIT(7); // 不 合 格给 label_queue 队列第一位置 1,即做剔除标志 label_queue=(label_queue>>1); // 队列右移一位 label_test=label_queue; //label_test 重 新赋值 label_test&=BIT(4); // 出标位是否有 剔除标志 if(label_test!=0) *((unsigned char*)&convey_queue+3)|=0x3e;// 如 果标签队列第四位为 1,它有剔除标志,给输送队列变量第 三字节赋值 0x3e(二进制 00111110),使输送队列里同时 产生 5 个位的剔除(原因后面会有说明)。 ccdtrig_num=100;// 给触发拍照延时及时长,这是 一个时间常数,在定时器 0 time0 定时中断里继续处理, 会产生拍照触发信号,它的延时是用于消抖(标签刚送完 停顿时会有一个抖动),延时后再发拍照信号。 } 3.2 定时器中断程序 time0 用于产生拍照触发脉冲,它先经过一段延时,之后再 发一个脉冲。 void time0(void) { TCNT0=6; //250us if(ccdtrig_num>0) //CCD 拍照触发 { ccdtrig_num--; // 触发延时消抖 if(ccdtrig_num<30) // 给触发脉冲 PORTC|=BIT(0); //PC0 输出到 CCD_TRIG else PORTC&=~BIT(0); } } 3.3 外部中断程序 INT2 输送带队列:用一个无符号长整型变量,程序中定义
AVR教程系列一(12):ATmega16 简介(六)
A VR教程系列一(12):ATmega16 简介(六) ATmega16 操纵与状态寄存器MCUCSRAVR 操纵与状态寄存器提供了有关引起AVR复位的复位源的信息。
Bit 4 – JTRF: JTAG 复位标志通过JTAG 指令AVR_RESET 能够使JTAG 复位寄存器置位,并引发MCU 复位,并使JTRF 置位。
上电复位将使其清零,也能够通过写”0” 来清除。
Bit 3 – WDRF: 看门狗复位标志看门狗复位发生时置位。
上电复位将使其清零,也能够通过写”0” 来清除。
Bit 2 – BORF: 掉电检测复位标志掉电检测复位发生时置位。
上电复位将使其清零,也能够通过写”0” 来清除。
Bit 1 – EXTRF: 外部复位标志外部复位发生时置位。
上电复位将使其清零,也能够通过写”0” 来清除。
Bit 0 – PORF: 上电复位标志上电复位发生时置位。
只能通过写”0” 来清除。
为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复位。
假如在其他复位发生之前将此寄存器复位,则后续复位源能够通过检查复位标志来熟悉。
ATmega16 基准电压使能信号与启动时间ATmega16 具有片内能隙基准源,用于掉电检测,或者者是作为模拟比较器或者ADC的输入。
ADC 的2.56V 基准电压由此片内能隙基准源产生。
电压基准的启动时间可能影响其工作方式。
启动时间列于Table 16。
为了降低功耗,能够操纵基准源仅在如下情况打开:1. BOD 使能 ( 熔丝位BODEN 被编程)2. 能隙基准源连接到模拟比较器(ACSR 寄存器的ACBG 置位)3. ADC 使能因此,当BOD 被禁止时,置位ACBG 或者使能ADC 后要启动基准源。
为了降低掉电模式的功耗,用户能够禁止上述三种条件,并在进入掉电模式之前关闭基准源。
ATmega16 看门狗定时器看门狗定时器由独立的1 Mhz 片内振荡器驱动。
Atmega16定时器0快速PWM
PWM:脉冲宽度调制,图中T为脉冲周期,t为高电平时间,t与T的比值t/T称为占空比,脉宽调制指的是调整t的大小,即改变脉冲的占空比,占空比值越大,输出的电压越高。
改变占空比就改变输出的电压,常用于实现D/A,调节电压或电流,改变电动机的转速等。
快速PWM模式:它的计数方式是TCNT0由0开始计数到255式,计数加1返回到0,然后继续加1计数,相对于相位PWM修正模式(由0计数到255,再从255计数到0),只有一个斜坡,因此PWM输出频率高。
在快速PWM模式下,计数器的最大值决定了PWM 的频率,而比较寄存器OCR0决定了占空比的大小。
T/C0是8位计数器,输出PWM的频率=系统时钟频率/(分频系数*255)。
PWM产生过程:定时器启动后,当TNCT0和OCR0的值相等时,输出引脚OC0(PB3)清0,当TNCT0到255时OC0置位,在程序运行过程中改变OCR0中的数值,就改变了OC0输出的占空比。
//函数功能:控制PB3引脚上的发光二极管由亮到灭,再由灭到亮(代码来自轻松玩转A VR单片机c语言cd)#include<avr/io.h>#include<avr/interrupt.h>#define uchar unsigned char#define uint unsigned intunsigned int count;/*********以下是延时函数*********/void Delay_ms(uint xms){int i,j;for(i=0;i<xms;i++)for(j=0;j<1140;j++);}/********以下是端口初始化函数********/void port_init(){DDRB|=(1<<PB3); //PB3配置为输出(为1时用或符号|)PORTB&=(0<<PB3); //PB3输出0(为0时与符号&)}/********定时器0初始化********/void timer0_init(){TCCR0|=(1<<WGM01)|(1<<WGM00);//定时器0快速PWM模式TCCR0|=(1<<COM01)|(1<<COM00);//比较匹配发生时OC0A置位,计数到TOP时OC0清零TCCR0|=(1<<CS02)|(0<<CS01)|(1<<CS00); //定时器1024分频OCR0=0;sei();}/*********以下是主函数*********/void main(void){port_init();timer0_init();while(1){for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗{OCR0=count; //比较匹配寄存器赋值Delay_ms(20); //延时一段时间,以观察效果}//Delay_ms(3000); // LED最暗时,延时一段时间for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮{OCR0= count;Delay_ms(20);}//Delay_ms(3000); //LED最亮时,延时一段时间}}。
Atmega16的定时器time0
Atmega16的定时器time0Atmega16的定时器time0分类:AVR 2007-09-01 05:04 3180人阅读评论(2) 收藏举报依照AVR使用范例--定时器应用范例/avr_examples/timer.html。
使用ICC application builder快速配置定时器后生成的代码如下://ICC-AVR application builder : 2007-8-28 0:55:55// Target : M16// Crystal: 7.3728Mhz#include#includevoid port_init(void){PORTA = 0x00;DDRA = 0x00;PORTB = 0x00;DDRB = 0x00;PORTC = 0x00; //m103 output onlyDDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}TIMER0 initialize - prescale:1024 /*定时器预分频,预分频由TCCRn的CS02,CS01,CS00确定,详情查看数据手册*/// WGM: Normal/*定时器,也由TCCRn确定*/// desired value: 20mSec/*定时器期望设定时间*/// actual value: 19.861mSec (0.7%)/*定时器实际定时时间,误差比例*/void timer0_init(void){/*定时器停止,TCCR0寄存器完全控制timer0的运行情况,详细可参考数据手册。
*/ TCCR0 = 0x00; //stopTCNT0 = 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}#pragma interrupt_handler timer0_ovf_isr:10void timer0_ovf_isr(void){TCNT0 = 0x71; //reload counter value}//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 sourcesSEI(); //re-enable interrupts//all peripherals are now initialized}下面我们一步一步按顺序来分析。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ATMEGA16定时器的使用[日期:2012-01-07 ] [来源:本站编辑作者:佚名] [字体:大中小] (投递新闻)/*本程序简单的示范了如何使用ATMEGA16的定时器AVR定时器的要点介绍T0工作于CTC模式,输出1KHz/2KHz 50%占空比的方波T1工作于快速PWM模式兼输入捕捉T2工作于相位修正PWM模式,输出490Hz的8bit PWM波出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器对于定时器,AVRstudio的软件仿真是不准确的。
*/#include <AVR/io.h>#include <AVR/signal.h>#include <AVR/interrupt.h>//时钟定为8MHz,F_CPU=8000000//管脚定义#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) //输出低电平,灯灭//全局变量volatile unsigned int ICP_Time; //记录ICP输入捕捉事件的发生时刻volatile unsigned char T2PWM; //设置T2的PWM值volatile unsigned char T0OCR; //设置T0的时间值//仿真时在watch窗口,监控这些变量。
void timer0_init(void) //CTC模式输出1KHz/2KHz方波{OCR0 = T0OCR; //设定TOP值//TOP=8000000/(2*64*1000)-1=61.5 选61 1.008KHz(0.992mS)//TOP=8000000/(2*64*2000)-1=30.25 选30 2.016KHz(0.496ms)TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(1<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);//64分频,CTC模式,OC0取反输出方波}void timer1_init(void){OCR1A = 39062; //设定TOP值.时间5S(0.2Hz)//TOP=8000000/(1024*0.2)=39062.5OCR1B = 15624; //设定OC1B的PWM值约2秒钟40%TCCR1A = (1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);TCCR1B = (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) //输入捕捉中断{ICP_Time=ICR1; //读取ICP输入捕捉事件的发生时刻}SIGNAL(SIG_OUTPUT_COMPARE1A)//T1输出比较A匹配中断{//在WGM1=15 快速PWM模式下,TOP=39062等同于5S左右的定时中断T2PWM+=10;OCR2=T2PWM; //修改T2的PWM值if (T0OCR==61)T0OCR=30; //改成1KHzelseT0OCR=61; //改成2KHzOCR0=T0OCR; //修改T0的时间值}void timer2_init(void)//相位修正PWM模式{OCR2 = T2PWM; //设定PWM值(最大值固定为255,8bit)TCCR2 = (0<<WGM21)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(0<<CS22)|(1<<CS21)|(1<<CS20);//32分频,相位修正PWM模式,PWM频率为490Hz,OC2正向PWM输出//fPWM=fclk_IO/(2*N*TOP)=8000000/(2*32*255)=490Hz}int main(void){//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻PORTA =0xFF; //不用的管脚使能内部上拉电阻。
PORTC =0xFF;PORTB =~ (1<<PWM0); //低电平,灯灭DDRB = (1<<PWM0); //输出PORTD =~((1<<PWM1A)|(1<<PWM1B)|(1<<PWM2)); //低电平,灯灭DDRD = (1<<PWM1A)|(1<<PWM1B)|(1<<PWM2); //输出T2PWM=0x80;T0OCR=30;ICP_Time=0x0000;timer0_init();timer1_init();timer2_init();TIMSK = (1<<TICIE1)|(1<<OCIE1A); //使能T1输入捕捉中断,T1输出比较A匹配中断(作定时用)sei(); //使能全局中断while (1){if (ICP_Time>15624)PWM1A_ON(); //如果数值大于15624(约2秒),OC1A输出高电平elsePWM1A_OFF(); //否则输出低电平}}/*程序运行效果引脚OC0(每5秒钟切换)交替输出1KHz和2KHz的50%占空比方波,接到无源蜂鸣器上,能听到不同频率的声音引脚OC1B输出0.2Hz的40%占空比的PWM波,精度39061级(略大于15bit)引脚OC2输出490Hz的PWM波,精度8bit,每5秒钟PWM值增大10级,对应的LED 亮度将会随之变化)ICP由引脚ICP1上的按键触发,ICP_Time将会记录下时间发生的时刻(相对于T1定时器的本次计数开始时间),如果数值大于15624(约2秒),OC1A输出高电平,否则输出低电平(刚好跟OC1B反相)如果使用AVR-51实验板作本实验,注意输出电平和LED的关系。
还有蜂鸣器的声音较大,耳朵比较难受)*//*附录AVR定时器的要点介绍(大部分摘自M16中文手册,未能一一测试)M16的T1 16位定时器一共有15种工作模式,其他2个8位定时器(T0/T2)相对简单,除了T2有异步工作模式用于RTC应用外(可以利用溢出中断和比较匹配中断作定时功能)分5种工作类型1 普通模式WGM1=0跟51的普通模式差不多,有TOV1溢出中断,发生于TOP时1 采用内部计数时钟用于ICP捕捉输入场合---测量脉宽/红外解码(捕捉输入功能可以工作在多种模式下,而不单单只是普通模式)2 采用外部计数脉冲输入用于计数,测频其他的应用,采用其他模式更为方便,不需要像51般费神2 CTC模式[比较匹配时清零定时器模式] WGM1=4,12跟51的自动重载模式差不多1 用于输出50%占空比的方波信号2 用于产生准确的连续定时信号WGM1=4时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断WGM1=12时,最大值由ICF1设定,TOP时产生ICF1输入捕捉中断注:WGM=15时,也能实现从OC1A输出方波,而且具备双缓冲功能计算公式:fOCn=fclk_IO/(2*N*(1+TOP))变量N 代表预分频因子(1、8、32,64、256,1024)。
3 快速PWM模式WGM1=5,6,7,14,15单斜波计数,用于输出高频率的PWM信号(比双斜波的高一倍频率)都有TOV1溢出中断,发生于TOP时比较匹配后可以产生OCF1x比较匹配中断.WGM1=5时, 最大值为0x00FF,8位分辨率WGM1=6时, 最大值为0x01FF,9位分辨率WGM1=7时, 最大值为0x03FF,10位分辨率WGM1=14时,最大值由ICF1设定,TOP时产生ICF1输入捕捉中断(单缓冲)WGM1=15时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断(双缓冲,但OC1A 将没有PWM能力,最多只能输出方波)改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值注意,即使OCR1A/B设为0x0000,也会输出一个定时器时钟周期的窄脉冲,而不是一直为低电平计算公式:fPWM=fclk_IO/(N*(1+TOP))4 相位修正PWM模式WGM1=1,2,3,10,11双斜波计数,用于输出高精度的,相位准确的,对称的PWM信号都有TOV1溢出中断,但发生在BOOTOM时比较匹配后可以产生OCF1x比较匹配中断.WGM1=1时, 最大值为0x00FF,8位分辨率WGM1=2时, 最大值为0x01FF,9位分辨率WGM1=3时, 最大值为0x03FF,10位分辨率WGM1=10时,最大值由ICF1设定,TOP时产生ICF1输入捕捉中断(单缓冲)WGM1=11时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断(双缓冲,但OC1A 将没有PWM能力,最多只能输出方波)改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值可以输出0%~100%占空比的PWM信号若要在T/C 运行时改变TOP 值,最好用相位与频率修正模式代替相位修正模式。
若TOP 保持不变,那么这两种工作模式实际没有区别计算公式:fPWM=fclk_IO/(2*N*TOP)5 相位与频率修正PWM模式WGM1=8,9双斜波计数,用于输出高精度的、相位与频率都准确的PWM波形都有TOV1溢出中断,但发生在BOOTOM时比较匹配后可以产生OCF1x比较匹配中断.WGM1=8时,最大值由ICF1设定,TOP时产生ICF1输入捕捉中断(单缓冲)WGM1=9时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断(双缓冲,但OC1A 将没有PWM能力,最多只能输出方波)相频修正修正PWM 模式与相位修正PWM 模式的主要区别在于OCR1x 寄存器的更新时间改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值可以输出0%~100%占空比的PWM信号使用固定TOP 值时最好使用ICR1 寄存器定义TOP。