X-Git-Url: https://the.earth.li/gitweb/?p=riso-kagaku-clone.git;a=blobdiff_plain;f=libs-device%2Fosccal.h;h=3452aa77e8c8b70a24df6647186c1c1c529827a1;hp=1ed600697ca7d1c8a02f2d584af549d4b70a711e;hb=014a1e9f44229545cc5382f5b2e8e5ae1853fd0d;hpb=edab807ad8aa75973a388ff2fe72595702b64b4a diff --git a/libs-device/osccal.h b/libs-device/osccal.h index 1ed6006..3452aa7 100644 --- a/libs-device/osccal.h +++ b/libs-device/osccal.h @@ -1,5 +1,6 @@ /* Name: osccal.h * Author: Christian Starkjohann + * Changes 2013-11-04 cpldcpu@gmail.com * Creation Date: 2008-04-10 * Tabsize: 4 * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH @@ -13,28 +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 // 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.S Limitations: This calibration algorithm may try OSCCAL values of up to 192 even if the @@ -50,7 +41,10 @@ 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();} +#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!