/******************************************************************************************************************* *File Name : Timer0.h *Description : the file include the timer0 function define for ATMEGA128. *Date : 2008/06/02 *Author : yuanguiyou --History: ------------------------------------------------------------------------------------------------------------------ *change info: *******************************************************************************************************************/ /******************************************************************************************************************* timer0工作模式描述: 1.普通工作模式。普通模式(WGM01:0 = 0) 为最简单的工作模式。在此模式下计数器不停地累加。计到最 大值后(TOP = 0xFF) 计数器简单地返回到最小值0x00 重新开始。在TCNT0 为零的同一 个定时器时钟里T/C 溢出标志TOV0 置位。此时TOV0 有点象第9 位,只是只能置位, 不会清零。但由于定时器中断例程能够自动清零TOV0,因此可以通过软件提高定时器的 分辨率。在普通模式下没有什么需要特殊考虑的,用户可以随时写入新的计数器数值。 2.CTC( 比较匹配时清除定时器)模式。在CTC 模式(WGM01:0 = 2) 里OCR0 寄存器用于调节计数器的分辨率。 当计数器的数值TCNT0 等于OCR0 时计数器清零。OCR0 定义了计数器的top 值,亦即计数器的分辨率。 这个模式可以在极大程度上控制比较匹配输出的频率,也简化了外部事件计数的操作。 通过设置COM01:0 = 1,可以在CTC 模式下将比较输出模式设置为交替方式。只要比较 匹配发生,OC0 的输出电平就取反。在期望获得OC0 输出之前,首先要将其端口设置为 输出。波形发生器能够产生的最大频率为fOC0 = fclk_I/O/2 (OCR0 = 0x00) 3.快速PWM 模式。快速PWM 模式(WGM01:0 = 3) 可用来产生高频的PWM 波形。快速PWM 模式与其他 PWM模式的不同之处是其三角波工作方式(其他PWM方式为等腰三角形方式)。计数器从 BOTTOM 计到MAX,然后立即回到BOTTOM 重新开始。 4.相位修正PWM 模式。相位修正PWM 模式(WGM01:0 = 1) 为用户提供了一个获得高精度相位修正PWM 波形 的方法。此模式基于双斜线操作。计时器重复地从BOTTOM 计到MAX,然后又从MAX 倒退回到BOTTOM。在一般的比较输出模式下,当计时器往MAX计数时若发生了TCNT0 于OCR0的匹配,OC0将清零为低电平;而在计时器往BOTTOM计数时若发生了TCNT0 于OCR0 的匹配, OC0 将置位为高电平。工作于反向输出比较时则正好相反。与单斜线 操作相比,双斜线操作可获得的最大频率要小 *********************************************************************************************************************/ #ifndef MEGA128_TIMER0_H #define MEGA128_TIMER0_H #ifdef __cplusplus extern "C" { #endif #include #ifndef TIMER_BITS_T #define TIMER_BITS_T uint8_t /*计数器的位数 */ #endif #define NULL ((void*)0) typedef void (*pfIsrFun)(void); /*如果空间受到限制,只需要留下中断处理函数,其余可以改为直接从寄存器进行读写操作*/ typedef struct tagTimer0Param /*计数器的参数 */ { uint8_t ucTCntl; /*基本控制值 */ uint8_t ucOtherCntrl; /*其它控制值 */ TIMER_BITS_T tbTCN; /*计数器值 */ TIMER_BITS_T tbOCR; /*比较器的值 */ pfIsrFun pfTimer0Isr; /*timer0中断处理函数*/ }Timer0Param_t; /*寄存器: T/C 控制寄存器- TCCR0 1.Bit 7 – FOC0: 强制输出比较 2.Bit 6, 3 – WGM01:0: 波形产生模式 这几位控制计数器的计数序列,计数器最大值TOP 的来源,以及使用何种波形.其具体值代表的意义如上工作模式所述。 0 0 普通模式 0 1 相位修正PWM 模式 1 0 CTC( 比较匹配时清除定时器)模式 1 1 快速PWM 模式 3.Bit 5:4 – COM01:0: 比较匹配输出模式 这些位控制输出比较引脚OC0 的行为。若COM01:0 的任意一位或两位都置位,OC0 输 出功能将重载普通端口功能。此时数据方向寄存器 (DDR) 需要按照OC0 功能进行设置。 当OC0 连接到物理引脚上时, COM01:0 的功能依赖于WGM01:0 的设置。 1)普通模式或者CTC模式 0 0 无连接,未用 0 1 OC0取反 1 0 OC0清零 1 1 OC0置位 2)快速PWM模式 0 0 无连接,未用 0 1 保留 1 0 比较匹配发生时OC0 清零,计数到TOP 时OC0 置位 1 1 比较匹配发生时OC0 置位,计数到TOP 时OC0 清零 3)相位修正PWM 模式 0 0 无连接,未用 0 1 保留 1 0 在升序计数时发生比较匹配将清零OC0 ;降序计数时发生比较匹配将置位OC0 1 1 在升序计数时发生比较匹配将置位OC0 ;降序计数时发生比较匹配将清零OC0 4.Bit 2:0 – CS02:0: 时钟选择 0 0 0 无时钟,T/C 不工作 0 0 1 clkT0S/ ( 没有预分频) 0 1 0 clkT0S/8 ( 来自预分频器) 0 1 1 clkT0S/32 ( 来自预分频器) 1 0 0 clkT0S/64 ( 来自预分频器) 1 0 1 clkT0S/128 ( 来自预分频器) 1 1 0 clkT0S/256 ( 来自预分频器) 1 1 1 clkT0S/1024 ( 来自预分频器) T/C 寄存器- TCNT0 定时计数值 输出比较寄存器- OCR0 异步状态寄存器- ASSR 1.Bit 3 – AS0: 异步T/C0。AS0为”0”时T/C0由I/O时钟clkI/O驱动;AS0为”1”时T/C由连接到TOSC1引脚的晶体振荡器驱动 2.Bit 2 – TCN0UB: T/C0 更新中 3.Bit 1 – OCR0UB: 输出比较寄存器0 更新中 4.Bit 0 – TCR0UB:T/C 控制寄存器0 更新中 定时器/ 计数器中断屏蔽寄存器- TIMSK 定时器/ 计数器中断标志寄存器- TIFR */ #define EN_FORC_MASK 0x80 /*强制输出比较 */ #define EN_FORC 0x80 #define DIS_FORC 0x00 #define WAVEMODE_MASK 0x48 #define WAVEMODE_GEN 0x00 /*普通模式 */ #define WAVEMODE_PPWM 0x01 /*相位修正PWM 模式 */ #define WAVEMODE_CTC 0x40 /*CTC( 比较匹配时清除定时器)模式 */ #define WAVEMODE_FPWM 0x48 /*快速PWM 模式 */ #define COMPMODE_MASK 0x03 #define COMPMODE_NONE 0x00 /*WAVEMODE_GEN,WAVEMODE_CTC */ #define COMPMODE_NEG 0x01 #define COMPMODE_CLR 0x02 #define COMPMODE_SET 0x03 #define COMPMODE_CLR_SET 0x02 /*WAVEMODE_FPWM */ #define COMPMODE_SET_CLR 0x03 #define COMPMODE_HCLR_LSET 0x02 /*WAVEMODE_PPWM */ #define COMPMODE_HSET_LCLR 0x03 #define TIMER0_INT_MASK 0x80 #define ENTIMER0_INT 0x80 /*TIMER0中断是否使能 */ #define DISTIMER0_INT 0x00 #define TIMER0_OVF 0 /*TIMER0溢出中断位 */ #define TIMER0_COMP 1 /*TIMER0比较中断位 */ #define CLKSEL_MASK 0x07 #define CLKSEL_NONE 0x00 /*时钟频率选择 */ #define CLKSEL_1 0x01 #define CLKSEL_8 0x02 #define CLKSEL_32 0x03 #define CLKSEL_64 0x04 #define CLKSEL_128 0x05 #define CLKSEL_256 0x06 #define CLKSEL_1024 0x07 #define ASSR_MASK 0x08 #define EN_ASSR 0x08 /*异步模式使能 */ #define DIS_ASSR 0x00 #define ASSR_TCN0UP_MASK 0x04 #define ASSR_0CR0UP_MASK 0x02 #define ASSR_TCR0UP_MASK 0x01 /*Timer0Ioctl使用的各种命令*/ #define IOCTL_GET_TIME_CNTRL 0x00 #define IOCTL_GET_WAVE_MODE 0x01 #define IOCTL_GET_COMP_MODE 0x02 #define IOCTL_GET_CLK_SEL 0x03 #define IOCTL_GET_INT_CFG 0x04 #define IOCTL_GET_ASSR 0x05 #define IOCTL_GET_TIME_COUNT 0x06 #define IOCTL_GET_TIME_COMP_COUNT 0x07 #define IOCTL_GET_TIMER_ISR 0x08 #define IOCTL_SET_TIME_CNTRL 0x09 #define IOCTL_SET_WAVE_MODE 0x0A #define IOCTL_SET_COMP_MODE 0x0B #define IOCTL_SET_CLK_SEL 0x0C #define IOCTL_SET_INT_CFG 0x0D #define IOCTL_SET_ASSR 0x0E #define IOCTL_SET_TIME_COUNT 0x0F #define IOCTL_SET_TIME_COMP_COUNT 0x10 #define IOCTL_SET_TIMER_ISR 0x11 /*定时器初始化函数*/ void Timer0Init(void); /*停止定时器*/ void StopTimer0(); /*根据不同ucCmd,对定时器进行各种操作*/ uint8_t Timer0Ioctl(uint8_t ucCmd,void *pArg); #ifdef __cplusplus } #endif #endif /********************************************************************************************************************** ************************************end of file*********************************************************************** **********************************************************************************************************************/