Files
Corwin Perren b300c76103 Added old firmware and pcb design files
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.
2016-05-12 20:04:43 -07:00

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