diff options
Diffstat (limited to 'firmware/libs-device/osccal.h')
| -rw-r--r-- | firmware/libs-device/osccal.h | 34 | 
1 files changed, 13 insertions, 21 deletions
| diff --git a/firmware/libs-device/osccal.h b/firmware/libs-device/osccal.h index 710ce05..af37a43 100644 --- a/firmware/libs-device/osccal.h +++ b/firmware/libs-device/osccal.h @@ -1,10 +1,10 @@  /* Name: osccal.h   * Author: Christian Starkjohann   * Creation Date: 2008-04-10 + * Changes 2013-11-04 cpldcpu@gmail.com   * Tabsize: 4   * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH   * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) - * This Revision: $Id: osccal.h 762 2009-08-12 17:10:30Z cs $   */  /* @@ -14,30 +14,18 @@ oscillator so that the CPU runs at F_CPU (F_CPU is a macro which must be  defined when the module is compiled, best passed in the compiler command  line). The time reference is the USB frame clock of 1 kHz available  immediately after a USB RESET condition. Timing is done by counting CPU -cycles, so all interrupts must be disabled while the calibration runs. For -low level timing measurements, usbMeasureFrameLength() is called. This -function must be enabled in usbconfig.h by defining -USB_CFG_HAVE_MEASURE_FRAME_LENGTH to 1. It is recommended to call -calibrateOscillator() from the reset hook in usbconfig.h: -*/ +cycles, so all interrupts must be disabled while the calibration runs.  +The size optimized assembler implementation includes its own implementation +of usbMeasureFrameLength. Therefore USB_CFG_HAVE_MEASURE_FRAME_LENGTH should  +be set to 0 to avoid including unused code sections. It is recommended to call +calibrateOscillatorASM() from the reset hook in usbconfig.h by including osccal.h: -#ifndef __ASSEMBLER__ -#include <avr/interrupt.h>  // for sei() -extern void calibrateOscillator(void); -#endif -#define USB_RESET_HOOK(resetStarts)  if(!resetStarts){cli(); calibrateOscillator(); sei();} +#include "osccal.h" -/*  This routine is an alternative to the continuous synchronization described  in osctune.h. -Algorithm used: -calibrateOscillator() first does a binary search in the OSCCAL register for -the best matching oscillator frequency. Then it does a next neighbor search -to find the value with the lowest clock rate deviation. It is guaranteed to -find the best match among neighboring values, but for version 5 oscillators -(which have a discontinuous relationship between OSCCAL and frequency) a -better match might be available in another OSCCAL region. +Algorithm used:  See osccalASM.x  Limitations:  This calibration algorithm may try OSCCAL values of up to 192 even if the @@ -53,7 +41,11 @@ deviation! All other frequency modules require at least 0.2% precision.  #ifndef __OSCCAL_H_INCLUDED__  #define __OSCCAL_H_INCLUDED__ -//void    calibrateOscillator(void); +#ifndef __ASSEMBLER__ +	void calibrateOscillatorASM(void); +#	define USB_RESET_HOOK(resetStarts)  if(!resetStarts){ calibrateOscillatorASM();} +#	define USB_CFG_HAVE_MEASURE_FRAME_LENGTH   0 +#endif	  /* This function calibrates the RC oscillator so that the CPU runs at F_CPU.   * It MUST be called immediately after the end of a USB RESET condition!   * Disable all interrupts during the call! | 
