mirror of
https://github.com/caperren/school_archives.git
synced 2025-11-09 13:41:13 +00:00
These are all design documents that I thought I had lost. It's may make me cringe, but it's still cool to use it to see how far I've come.
424 lines
16 KiB
C
424 lines
16 KiB
C
/* This file has been prepared for Doxygen automatic documentation generation.*/
|
|
/*! \file *********************************************************************
|
|
*
|
|
* \brief XMEGA Timer/Counter driver header file.
|
|
*
|
|
* This file contains the function prototypes and enumerator definitions
|
|
* for various configuration parameters for the XMEGA Timer/Counter driver.
|
|
*
|
|
* The driver is not intended for size and/or speed critical code, since
|
|
* most functions are just a few lines of code, and the function call
|
|
* overhead would decrease code performance. The driver is intended for
|
|
* rapid prototyping and documentation purposes for getting started with
|
|
* the XMEGA Timer/Counter module.
|
|
*
|
|
* For size and/or speed critical code, it is recommended to copy the
|
|
* function contents directly into your application instead of making
|
|
* a function call.
|
|
*
|
|
* \par Application note:
|
|
* AVR1306: Using the XMEGA Timer/Counter
|
|
*
|
|
* \par Documentation
|
|
* For comprehensive code documentation, supported compilers, compiler
|
|
* settings and supported devices see readme.html
|
|
*
|
|
* \author
|
|
* Atmel Corporation: http://www.atmel.com \n
|
|
* Support email: avr@atmel.com
|
|
*
|
|
* $Revision: 1569 $
|
|
* $Date: 2008-04-22 13:03:43 +0200 (ti, 22 apr 2008) $ \n
|
|
*
|
|
* Copyright (c) 2008, Atmel Corporation All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
*
|
|
* 3. The name of ATMEL may not be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
|
|
* SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*****************************************************************************/
|
|
#ifndef TC_DRIVER_H
|
|
#define TC_DRIVER_H
|
|
|
|
#include "avr_compiler.h"
|
|
|
|
/* Definition of macros. */
|
|
|
|
/*! \brief Enables the event delay for this TC.
|
|
*
|
|
* This macro enables a one clock cycle delay of event sources for this TC.
|
|
* Mainly used for the high word TC when two TCs are cascaded to form a 32-bit
|
|
* TC.
|
|
*
|
|
* \param _tc The Timer/Counter to enable delay on.
|
|
*/
|
|
#define TC_EnableEventDelay( _tc ) ( (_tc)->CTRLD |= TC0_EVDLY_bm )
|
|
|
|
/*! \brief This macro disables the event delay for this TC.
|
|
*
|
|
* \param _tc The Timer/Counter to disable delay on.
|
|
*/
|
|
#define TC_DisableEventDelay( _tc ) ( (_tc)->CTRLD &= ~TC0_EVDLY_bm )
|
|
|
|
/*! \brief Locks automatic updating of compare and period registers.
|
|
*
|
|
* This macro will lock automatic updates of compare registers from the
|
|
* corresponding buffer registers. To enable automatic updates again, use the
|
|
* \ref TC_UnlockCompareUpdate macro.
|
|
*
|
|
* \param _tc Timer/Counter module instance.
|
|
*/
|
|
#define TC_LockCompareUpdate( _tc ) ( (_tc)->CTRLFSET = TC0_LUPD_bm )
|
|
|
|
/*! \brief Unlocks automatic updating of compare and period registers.
|
|
*
|
|
* This macro will unlock automatic updates of compare registers from the
|
|
* corresponding buffer registers. Note that the output compare registers will
|
|
* not be updated until an update event occurs, e.g. that the counter hits
|
|
* TOP or BOTTOM. To force an update of the compare register from the buffer
|
|
* register, use the \ref TC_ForceUpdate macro.
|
|
*
|
|
* \param _tc Timer/Counter module instance.
|
|
*/
|
|
#define TC_UnlockCompareUpdate( _tc ) ( (_tc)->CTRLFCLR = TC0_LUPD_bm )
|
|
|
|
|
|
/*! \brief Force an update of the output compare and period registers.
|
|
*
|
|
* This macro will trigger a transfer from the output compare and period
|
|
* buffer registers ( CCxBUF and PERBUF ) to the output compare and period
|
|
* registers ( CCx and PER ). Calling this macro has the same effect as an
|
|
* update condition.
|
|
*
|
|
* \param _tc Timer/Counter module instance.
|
|
*/
|
|
#define TC_ForceUpdate( _tc ) ( (_tc)->CTRLFSET = TC_CMD_UPDATE_gc )
|
|
|
|
/*! \brief Restart the Timer/Counter.
|
|
*
|
|
* This macro will restart the timer. The effect of running this command is:
|
|
* - The CNT[H:L] register is cleared.
|
|
* - The direction (DIR ) is reset. (Next clock cycle will increase the counter )
|
|
* - All compare outputs are set to 0.
|
|
* - If a DTI module is connected to the timer, it will be reset as well.
|
|
*
|
|
* \param _tc Timer/Counter module instance.
|
|
*/
|
|
#define TC_Restart( _tc ) ( (_tc)->CTRLFSET = TC_CMD_RESTART_gc )
|
|
|
|
/*! \brief Manually set the count.
|
|
*
|
|
* This macro writes a new value to the CNT[H:L] register.
|
|
* Note that the CNT[H:L] register is not double buffered, so it is recommended
|
|
* that the timer is not running when this macro is used.
|
|
*
|
|
* \param _tc Timer/Counter module instance.
|
|
* \param _count New count value.
|
|
*/
|
|
#define TC_SetCount( _tc, _count ) ( (_tc)->CNT = (_count) )
|
|
|
|
/*! \brief Sets the timer period.
|
|
*
|
|
* This macro sets a new timer period. The period buffer register is not
|
|
* used, so the new period will be valid immediately after the 16-bit write
|
|
* is finished.
|
|
*
|
|
* \param _tc Timer/Counter module instance.
|
|
* \param _period New Timer/Counter period.
|
|
*/
|
|
#define TC_SetPeriod( _tc, _period ) ( (_tc)->PER = (_period) )
|
|
|
|
/*! \brief Sets the timer period ( double buffered ).
|
|
*
|
|
* This macro sets a new timer period. The period buffer register is used,
|
|
* so the new period will be valid after the next update condition.
|
|
*
|
|
* \param _tc Timer/Counter 0 or 1 module instance.
|
|
* \param _period New Timer/Counter period.
|
|
*/
|
|
#define TC_SetPeriodBuffered( _tc, _period ) ( (_tc)->PERBUF = (_period) )
|
|
|
|
/*! \brief Set new compare value for compare channel A. ( Double buffered )
|
|
*
|
|
* This macro sets a new compare value for compare channel A. The compare
|
|
* channel A buffer register is used, so the new period will be valid from the
|
|
* next update condition.
|
|
*
|
|
* \param _tc Timer/Counter 0 or 1 module instance.
|
|
* \param _compareValue New compare value for compare channel A.
|
|
*/
|
|
#define TC_SetCompareA( _tc, _compareValue ) ( (_tc)->CCABUF = (_compareValue) )
|
|
|
|
/*! \brief Set new compare value for compare channel B. ( Double buffered )
|
|
*
|
|
* This macro sets a new compare value for compare channel B. The compare
|
|
* channel B buffer register is used, so the new period will be valid from the
|
|
* next update condition.
|
|
*
|
|
* \param _tc Timer/Counter 0 or 1 module instance.
|
|
* \param _compareValue New compare value for compare channel B.
|
|
*/
|
|
#define TC_SetCompareB( _tc, _compareValue ) ( (_tc)->CCBBUF = (_compareValue) )
|
|
|
|
/*! \brief Set new compare value for compare channel C. ( Double buffered )
|
|
*
|
|
* This macro sets a new compare value for compare channel C. The compare
|
|
* channel C buffer register is used, so the new period will be valid from the
|
|
* next update condition.
|
|
*
|
|
* \note The CCC channel is not available on TCx1.
|
|
*
|
|
* \param _tc Timer/Counter 0 module instance.
|
|
* \param _compareValue New compare value for compare channel C.
|
|
*/
|
|
#define TC_SetCompareC( _tc, _compareValue ) ( (_tc)->CCCBUF = (_compareValue) )
|
|
|
|
/*! \brief Set new compare value for compare channel D. ( Double buffered )
|
|
*
|
|
* This macro sets a new compare value for compare channel D. The compare
|
|
* channel D buffer register is used, so the new period will be valid from the
|
|
* next update condition.
|
|
*
|
|
* \note The CCD channel is not available on TCx1.
|
|
*
|
|
* \param _tc Timer/Counter 0 module instance.
|
|
* \param _compareValue New compare value for compare channel D.
|
|
*/
|
|
#define TC_SetCompareD( _tc, _compareValue ) ( (_tc)->CCDBUF = (_compareValue) )
|
|
|
|
/*! \brief Test whether an overflow has occurred.
|
|
*
|
|
* The return value of this macro indicates if an overflow has occurred.
|
|
*
|
|
* \param _tc Timer/Counter module instance.
|
|
*
|
|
* \return Non-zero if overflow flag is set, zero otherwise.
|
|
*/
|
|
#define TC_GetOverflowFlag( _tc ) ( (_tc)->INTFLAGS & TC0_OVFIF_bm )
|
|
|
|
/*! \brief Clears the Timer/Counter overflow flag.
|
|
*
|
|
* This macro clears the Timer/Counter overflow flag.
|
|
*
|
|
* \param _tc Timer/Counter module instance.
|
|
*/
|
|
#define TC_ClearOverflowFlag( _tc ) ( (_tc)->INTFLAGS = TC0_OVFIF_bm )
|
|
|
|
/*! \brief Test whether an error has occurred.
|
|
*
|
|
* The return value of this macro indicates if an error has occurred.
|
|
*
|
|
* \param _tc Timer/Counter module instance.
|
|
*
|
|
* \return Non-zero if the Timer error flag is set.
|
|
*/
|
|
#define TC_GetErrorFlag( _tc ) ( (_tc)->INTFLAGS & TC0_ERRIF_bm )
|
|
|
|
/*! \brief Clears the Timer/Counter error flag.
|
|
*
|
|
* This macro clears the Timer/Counter error flag.
|
|
*
|
|
* \param _tc Timer/Counter module instance.
|
|
*/
|
|
#define TC_ClearErrorFlag( _tc ) ( (_tc)->INTFLAGS = TC0_ERRIF_bm )
|
|
|
|
/*! \brief Get the status for Compare or Capture channel A.
|
|
*
|
|
* When the TC is in Input Capture mode, the return value of this macro
|
|
* indicates whether there is an unread input capture value available for
|
|
* capture channel A.
|
|
*
|
|
* When the TC is in any other mode, the return value of this macro
|
|
* indicates whether there has been a compare match between channel A and the
|
|
* counter.
|
|
*
|
|
* \param _tc Timer/Counter 0 or 1 module instance.
|
|
*
|
|
* \return Non-zero if Compare or capture has occured, zero otherwise.
|
|
*/
|
|
#define TC_GetCCAFlag( _tc ) ( (_tc)->INTFLAGS & TC0_CCAIF_bm )
|
|
|
|
/*! \brief Clears the Timer/Counter compare or capture A interrupt flag.
|
|
*
|
|
* \param _tc Timer/Counter 0 or 1 module instance.
|
|
*/
|
|
#define TC_ClearCCAFlag( _tc ) ( (_tc)->INTFLAGS = TC0_CCAIF_bm )
|
|
|
|
/*! \brief Get the status for Compare or Capture channel B.
|
|
*
|
|
* When the TC is in Input Capture mode, the return value of this macro
|
|
* indicates whether there is an unread input capture value available for
|
|
* capture channel B.
|
|
*
|
|
* When the TC is in any other mode, the return value of this macro
|
|
* indicates whether there has been a compare match between channel B and the
|
|
* counter.
|
|
*
|
|
* \param _tc Timer/Counter 0 or 1 module instance.
|
|
*
|
|
* \return Non-zero if Compare or capture has occured, zero otherwise.
|
|
*/
|
|
#define TC_GetCCBFlag( _tc ) ( (_tc)->INTFLAGS & TC0_CCBIF_bm )
|
|
|
|
/*! \brief Clears the Timer/Counter compare or capture B interrupt flag.
|
|
*
|
|
* \param _tc Timer/Counter 0 or 1 module instance.
|
|
*/
|
|
#define TC_ClearCCBFlag( _tc ) ( (_tc)->INTFLAGS = TC0_CCBIF_bm )
|
|
|
|
/*! \brief Get the status for Compare or Capture channel C.
|
|
*
|
|
* When the TC is in Input Capture mode, the return value of this macro
|
|
* indicates whether there is an unread input capture value available for
|
|
* capture channel C.
|
|
*
|
|
* When the TC is in any other mode, the return value of this macro
|
|
* indicates whether there has been a compare match between channel C and the
|
|
* counter.
|
|
*
|
|
* \note The CCC channel is not available on TCx1.
|
|
*
|
|
* \param _tc Timer/Counter 0 module instance.
|
|
*
|
|
* \return Non-zero if Compare or capture has occured, zero otherwise.
|
|
*/
|
|
#define TC_GetCCCFlag( _tc ) ( (_tc)->INTFLAGS & TC0_CCCIF_bm )
|
|
|
|
/*! \brief Clears the Timer/Counter compare or capture C interrupt flag.
|
|
*
|
|
* This macro clears the Timer/Counter compare or capture C interrupt flag.
|
|
*
|
|
* \note The CCC channel is not available on TCx1.
|
|
*
|
|
* \param _tc Timer/Counter 0 module instance.
|
|
*/
|
|
#define TC_ClearCCCFlag( _tc ) ( (_tc)->INTFLAGS = TC0_CCCIF_bm )
|
|
|
|
/*! \brief Get the status for Compare or Capture channel D.
|
|
*
|
|
* When the TC is in Input Capture mode, the return value of this macro
|
|
* indicates whether there is an unread input capture value available for
|
|
* capture channel D.
|
|
*
|
|
* When the TC is in any other mode, the return value of this macro
|
|
* indicates whether there has been a compare match between channel D and the
|
|
* counter.
|
|
*
|
|
* \note The CCD channel is not available on TCx1.
|
|
*
|
|
* \param _tc Timer/Counter 0 module instance.
|
|
*
|
|
* \return Non-zero if Compare or capture has occured, zero otherwise.
|
|
*/
|
|
#define TC_GetCCDFlag( _tc ) ( (_tc)->INTFLAGS & TC0_CCDIF_bm )
|
|
|
|
/*! \brief Clears the Timer/Counter compare or capture D interrupt flag.
|
|
*
|
|
* This macro clears the Timer/Counter compare or capture D interrupt flag.
|
|
*
|
|
* \note The CCD channel is not available on TCx1.
|
|
*
|
|
* \param _tc Timer/Counter 0 module instance.
|
|
*/
|
|
#define TC_ClearCCDFlag( _tc ) ( (_tc)->INTFLAGS = TC0_CCDIF_bm )
|
|
|
|
|
|
/*! \brief Reads the first available input capture value for channel A.
|
|
*
|
|
* This macro returns the first available input capture value for
|
|
* capture channel A.
|
|
*
|
|
* \param _tc Timer/Counter 0 or 1 module instance.
|
|
*
|
|
* \return The first available input capture value for channel A.
|
|
*/
|
|
#define TC_GetCaptureA( _tc ) ( (_tc)->CCA )
|
|
|
|
/*! \brief Reads the first available input capture value for channel B.
|
|
*
|
|
* This macro returns the first available input capture value for
|
|
* capture channel B.
|
|
*
|
|
* \param _tc Timer/Counter 0 or 1 module instance.
|
|
*
|
|
* \return The first available input capture value for channel B.
|
|
*/
|
|
#define TC_GetCaptureB( _tc ) ( (_tc)->CCB )
|
|
|
|
/*! \brief Reads the first available input capture value for channel C.
|
|
*
|
|
* This macro returns the first available input capture value for
|
|
* capture channel C.
|
|
*
|
|
* \note The CCC channel is not available on TCx1.
|
|
*
|
|
* \param _tc Timer/Counter 0 module instance.
|
|
*
|
|
* \return The first available input capture value for channel C.
|
|
*/
|
|
#define TC_GetCaptureC( _tc ) ( (_tc)->CCC )
|
|
|
|
/*! \brief Reads the first available input capture value for channel D.
|
|
*
|
|
* This macro returns the first available input capture value for
|
|
* capture channel D.
|
|
*
|
|
* \note The CCD channel is not available on TCx1.
|
|
*
|
|
* \param _tc Timer/Counter 0 module instance.
|
|
*
|
|
* \return The first available input capture value for channel D.
|
|
*/
|
|
#define TC_GetCaptureD( _tc ) ( (_tc)->CCD )
|
|
|
|
|
|
/* Prototyping of functions. Documentation can be found in source file. */
|
|
|
|
void TC0_ConfigClockSource( volatile TC0_t * tc, TC_CLKSEL_t clockSelection );
|
|
void TC0_ConfigWGM( volatile TC0_t * tc, TC_WGMODE_t wgm );
|
|
void TC0_ConfigInputCapture( volatile TC0_t * tc, TC_EVSEL_t eventSource );
|
|
void TC0_EnableCCChannels( volatile TC0_t * tc, uint8_t enableMask );
|
|
void TC0_DisableCCChannels( volatile TC0_t * tc, uint8_t disableMask );
|
|
void TC0_SetOverflowIntLevel( volatile TC0_t * tc, TC_OVFINTLVL_t intLevel );
|
|
void TC0_SetErrorIntLevel( volatile TC0_t * tc, TC_ERRINTLVL_t intLevel );
|
|
void TC0_SetCCAIntLevel( volatile TC0_t * tc, TC_CCAINTLVL_t intLevel );
|
|
void TC0_SetCCBIntLevel( volatile TC0_t * tc, TC_CCBINTLVL_t intLevel );
|
|
void TC0_SetCCCIntLevel( volatile TC0_t * tc, TC_CCCINTLVL_t intLevel );
|
|
void TC0_SetCCDIntLevel( volatile TC0_t * tc, TC_CCDINTLVL_t intLevel );
|
|
void TC0_Reset( volatile TC0_t * tc );
|
|
|
|
void TC1_ConfigClockSource( volatile TC1_t * tc, TC_CLKSEL_t clockSelection );
|
|
void TC1_ConfigWGM( volatile TC1_t * tc, TC_WGMODE_t wgm );
|
|
void TC1_ConfigInputCapture( volatile TC1_t * tc, TC_EVSEL_t eventSource );
|
|
void TC1_EnableCCChannels( volatile TC1_t * tc, uint8_t enableMask );
|
|
void TC1_DisableCCChannels( volatile TC1_t * tc, uint8_t disableMask );
|
|
void TC1_SetOverflowIntLevel( volatile TC1_t * tc, TC_OVFINTLVL_t intLevel );
|
|
void TC1_SetErrorIntLevel( volatile TC1_t * tc, TC_ERRINTLVL_t intLevel );
|
|
void TC1_SetCCAIntLevel( volatile TC1_t * tc, TC_CCAINTLVL_t intLevel );
|
|
void TC1_SetCCBIntLevel( volatile TC1_t * tc, TC_CCBINTLVL_t intLevel );
|
|
void TC1_SetCCCIntLevel( volatile TC1_t * tc, TC_CCCINTLVL_t intLevel );
|
|
void TC1_SetCCDIntLevel( volatile TC1_t * tc, TC_CCDINTLVL_t intLevel );
|
|
void TC1_Reset( volatile TC1_t * tc );
|
|
|
|
|
|
#endif
|