📄 timer16_drv.h
字号:
///******************************************************************************
//! @file $RCSfile: timer16_drv.h,v $
//!
//! Copyright (c) 2006 Atmel.
//!
//! Use of this program is subject to Atmel's End User License Agreement.
//! Please read file license.txt for copyright notice.
//!
//! @brief This file contains the prototypes and the macros of the
//! low level functions (drivers) of:
//! - 16-bit timer(s)
//! - for AT90CAN128/64/32.
//!
//! This file can be parsed by Doxygen for automatic documentation generation.
//! This file has been validated with AVRStudio-412462/WinAVR-20060125.
//!
//! @version $Revision: 3.11 $ $Name: jtellier $
//!
//! @todo
//! @bug
//******************************************************************************
#ifndef _TIMER16_DRV_H_
#define _TIMER16_DRV_H_
//_____ I N C L U D E S ________________________________________________________
#include "common.h"
//_____ G E N E R A L D E F I N I T I O N S _________________________________
#ifndef FOSC
# error You must define FOSC in "config.h" file
#endif
// ----------
#ifndef TIMER16_1 // 16-bit TIMER 1 Defintion
#define TIMER16_1 0x01
#endif
#ifndef TIMER16_3 // 16-bit TIMER 3 Defintion
#define TIMER16_3 0x03
#endif
#ifndef BOTH_TIMER16 // Both the 16-bit TIMERs Defintion
#define BOTH_TIMER16 0xFF
#endif
//_____ M A C R O S ____________________________________________________________
// ---------- To order the loading (reading) of 16-bit registers
#define Timer16_get_counter() ( timer16_get_counter() ) // c.f. "timer16_drv.c" file
#define Timer16_get_capture() ( timer16_get_capture() ) // c.f. "timer16_drv.c" file
// ---------- Two ways to have a look on the things
#define Timer16_set_pwm_a(value) ( Timer16_set_compare_a(value) ) // c.f. above !
#define Timer16_set_pwm_b(value) ( Timer16_set_compare_b(value) ) // c.f. above !
#define Timer16_set_pwm_c(value) ( Timer16_set_compare_c(value) ) // c.f. above !
#define Timer16_get_pwm_a() ( Timer16_get_compare_a() ) // c.f. above !
#define Timer16_get_pwm_b() ( Timer16_get_compare_b() ) // c.f. above !
#define Timer16_get_pwm_c() ( Timer16_get_compare_c() ) // c.f. above !
// ---------- If no clock, the timer is off !
#define Timer16_off() Timer16_set_clock(TIMER16_NO_CLOCK)
//_____ D E F . & M A C R O S for H W C O N F . _______________________
//----- CARE WITH THE ORDER WHEN 16-BIT REGISTERS ARE READ
// ==================================================
//----- For sensitive 16-bit registers (c.f. temporary reg), the macros are:
//----- * Timer16_get_nnn_low()
//----- * Timer16_get_nnn_high()
//----- For instance, in your main, do not write:
//----- short_temp = ((Timer16_get_nnn_high())<<8) | (Timer16_get_nnn_low());
//----- or
//----- short_temp = (Timer16_get_nnn_low()) | ((Timer16_get_nnn_high())<<8);
//----- because IAR and ImageCraft doesn't evaluate the operandes in the same order!
//-----
//----- The good way to write a READ (load) sequence is in 2 times:
//----- short_temp = Timer16_get_nnn_low();
//----- short_temp |= (Timer16_get_nnn_high() << 8 );
//-----
//----- Otherwise a macro "Timer16_get_nnn()" exits and call "timer16_get_counter()" function
#ifndef USE_TIMER16
# error You must define USE_TIMER16 to TIMER16_1 or TIMER16_3 or BOTH_TIMER16 in "config.h" file
# elif (USE_TIMER16 == TIMER16_1) //!< 16-bit TIMER 1 used
//!< =================================
//!< ------ Only TIMER16_1 used ------
//!< =================================
# define Timer16_select(timer16_num) // Empty !
// ---------- Macros
# define Timer16_clear() ( TCCR1B=0, TCCR1A=0, TCCR1C=0, TCNT1H=0, TCNT1L= 0, OCR1AH=0, OCR1AL=0, \
OCR1BH=0, OCR1BL=0, OCR1CH=0, OCR1CL=0, ICR1H=0, ICR1L=0 )
// ----------
# define Timer16_set_counter(value) ( TCNT1H = ((U8)(value>>8)), TCNT1L = ((U8)(value)))
# define Timer16_get_counter_low() ((U16)(TCNT1L))
# define Timer16_get_counter_high() ((U16)(TCNT1H))
// ----------
# define Timer16_set_compare_a(value) ( OCR1AH = ((U8)(value>>8)), OCR1AL = ((U8)(value)))
# define Timer16_set_compare_b(value) ( OCR1BH = ((U8)(value>>8)), OCR1BL = ((U8)(value)))
# define Timer16_set_compare_c(value) ( OCR1CH = ((U8)(value>>8)), OCR1CL = ((U8)(value)))
# define Timer16_get_compare_a() ( OCR1A ) // The temporary register is not used
# define Timer16_get_compare_b() ( OCR1B ) // The temporary register is not used
# define Timer16_get_compare_c() ( OCR1C ) // The temporary register is not used
// ----------
# define Timer16_set_capture(value) { ICR1H = ((U8)(value>>8)); ICR1L = ((U8)(value)); }
# define Timer16_get_capture_low() ((U16)(ICR1L))
# define Timer16_get_capture_high() ((U16)(ICR1H))
// ----------
# define Timer16_set_mode_output_a(conf) ( TCCR1A = (TCCR1A & (~TIMER16_COMP_MODE_MASK_A)) | (conf << COM1A0) )
# define Timer16_set_mode_output_b(conf) ( TCCR1A = (TCCR1A & (~TIMER16_COMP_MODE_MASK_B)) | (conf << COM1B0) )
# define Timer16_set_mode_output_c(conf) ( TCCR1A = (TCCR1A & (~TIMER16_COMP_MODE_MASK_C)) | (conf << COM1C0) )
# define Timer16_get_mode_output_a() ((TCCR1A & TIMER16_COMP_MODE_MASK_A) >> COM1A0 )
# define Timer16_get_mode_output_b() ((TCCR1A & TIMER16_COMP_MODE_MASK_B) >> COM1B0 )
# define Timer16_get_mode_output_c() ((TCCR1A & TIMER16_COMP_MODE_MASK_C) >> COM1C0 )
// ----------
# define Timer16_set_waveform_mode(conf) { TCCR1A = (TCCR1A & (~TIMER16_WGM_RA_MASK)) | ((conf & 0x3) << WGM10); \
TCCR1B = (TCCR1B & (~TIMER16_WGM_RB_MASK)) | ((conf >> 0x2) << WGM12) }
# define Timer16_get_waveform_mode() (((TCCR1A & TIMER16_WGM_RA_MASK) >> WGM10) | \
(((TCCR1B & TIMER16_WGM_RB_MASK) >> WGM12) << 0x2) )
// ----------
# define Timer16_set_clock(value) ( TCCR1B = (TCCR1B & (~TIMER16_CLK_MASK)) | (value << CS10) )
# define Timer16_get_clock() (((TCCR1B & TIMER16_CLK_MASK) >> CS10) )
// ----------
# define Timer16_set_input_filter() ( TCCR1B |= (1<<ICNC1) )
# define Timer16_clear_input_filter() ( TCCR1B &= ~(1<<ICNC1) )
# define Timer16_get_input_filter() ((TCCR1B & (1<<ICNC1)) >> ICNC1 )
// ----------
# define Timer16_set_input_rising_edge() ( TCCR1B |= (1<<ICES1) )
# define Timer16_set_input_falling_edge()( TCCR1B &= ~(1<<ICES1) )
# define Timer16_get_input_capture_edge()((TCCR1B & (1<<ICES1)) >> ICES1 )
// ----------
# define Timer16_set_compare_force_a() ( TCCR1C |= (1<<FOC1A) )
# define Timer16_set_compare_force_b() ( TCCR1C |= (1<<FOC1B) )
# define Timer16_set_compare_force_c() ( TCCR1C |= (1<<FOC1C) )
# define Timer16_clear_compare_force_a() ( TCCR1C &= ~(1<<FOC1A) )
# define Timer16_clear_compare_force_b() ( TCCR1C &= ~(1<<FOC1B) )
# define Timer16_clear_compare_force_c() ( TCCR1C &= ~(1<<FOC1C) )
# define Timer16_get_compare_force_a() ((TCCR1C & (1<<FOC1A)) >> FOC1A )
# define Timer16_get_compare_force_b() ((TCCR1C & (1<<FOC1B)) >> FOC1B )
# define Timer16_get_compare_force_c() ((TCCR1C & (1<<FOC1C)) >> FOC1C )
// ----------
# define Timer16_overflow_it_enable() ( TIMSK1 |= (1<<TOIE1) )
# define Timer16_overflow_it_disable() ( TIMSK1 &= ~(1<<TOIE1) )
# define Timer16_compare_a_it_enable() ( TIMSK1 |= (1<<OCIE1A) )
# define Timer16_compare_a_it_disable() ( TIMSK1 &= ~(1<<OCIE1A) )
# define Timer16_compare_b_it_enable() ( TIMSK1 |= (1<<OCIE1B) )
# define Timer16_compare_b_it_disable() ( TIMSK1 &= ~(1<<OCIE1B) )
# define Timer16_compare_c_it_enable() ( TIMSK1 |= (1<<OCIE1C) )
# define Timer16_compare_c_it_disable() ( TIMSK1 &= ~(1<<OCIE1C) )
# define Timer16_capture_it_enable() ( TIMSK1 |= (1<<ICIE1) )
# define Timer16_capture_it_disable() ( TIMSK1 &= ~(1<<ICIE1) )
# define Timer16_get_overflow_it_mask() ((TIMSK1 & (1<<TOIE1) ) >> TOIE1 )
# define Timer16_get_compare_a_it_mask() ((TIMSK1 & (1<<OCIE1A)) >> OCIE1A )
# define Timer16_get_compare_b_it_mask() ((TIMSK1 & (1<<OCIE1B)) >> OCIE1B )
# define Timer16_get_compare_c_it_mask() ((TIMSK1 & (1<<OCIE1C)) >> OCIE1C )
# define Timer16_get_capture_it_mask() ((TIMSK1 & (1<<ICIE1) ) >> ICIE1 )
// ----------
# define Timer16_clear_overflow_it() ( TIFR1 |= (1<<TOV1) )
# define Timer16_clear_compare_a_it() ( TIFR1 |= (1<<OCF1A) )
# define Timer16_clear_compare_b_it() ( TIFR1 |= (1<<OCF1B) )
# define Timer16_clear_compare_c_it() ( TIFR1 |= (1<<OCF1C) )
# define Timer16_clear_capture_it() ( TIFR1 |= (1<<ICF1) )
# define Timer16_get_overflow_it() ((TIFR1 & (1<<TOV1) ) >> TOV1 )
# define Timer16_get_compare_a_it() ((TIFR1 & (1<<OCF1A)) >> OCF1A )
# define Timer16_get_compare_b_it() ((TIFR1 & (1<<OCF1B)) >> OCF1B )
# define Timer16_get_compare_c_it() ((TIFR1 & (1<<OCF1C)) >> OCF1C )
# define Timer16_get_capture_it() ((TIFR1 & (1<<ICF1) ) >> ICF1 )
# elif USE_TIMER16 == TIMER16_3 //!< 16-bit TIMER 3 used
//!< =================================
//!< ------ Only TIMER16_3 used ------
//!< =================================
# define Timer16_select(timer16_num) // Empty !
// ---------- Macros
# define Timer16_clear() { TCCR3B=0; TCCR3A=0; TCCR3C=0; TCNT3H=0; TCNT3L= 0; OCR3AH=0; OCR3AL=0; \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -