From 819ce8ac705e9a336cb60fdb6f525a17cbc9dcb3 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Mon, 4 Nov 2013 04:43:26 +0100 Subject: further size optimization in calibrateoscillator. 1976 bytes --- firmware/libs-device/osccal.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'firmware/libs-device/osccal.h') diff --git a/firmware/libs-device/osccal.h b/firmware/libs-device/osccal.h index 710ce05..6f443a5 100644 --- a/firmware/libs-device/osccal.h +++ b/firmware/libs-device/osccal.h @@ -22,10 +22,11 @@ calibrateOscillator() from the reset hook in usbconfig.h: */ #ifndef __ASSEMBLER__ -#include // for sei() extern void calibrateOscillator(void); +//extern void calibrateOscillatorASM(void); #endif -#define USB_RESET_HOOK(resetStarts) if(!resetStarts){cli(); calibrateOscillator(); sei();} +#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillator(); } +//#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillatorASM(); } /* This routine is an alternative to the continuous synchronization described -- cgit v1.2.3 From d7360925c1170acbc3a7b98c50e48350ac80fbc7 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Mon, 4 Nov 2013 05:11:22 +0100 Subject: assembler version of calibrateoscillator - 1952 bytes still needs cleaning up --- firmware/libs-device/osccal.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'firmware/libs-device/osccal.h') diff --git a/firmware/libs-device/osccal.h b/firmware/libs-device/osccal.h index 6f443a5..bfc5530 100644 --- a/firmware/libs-device/osccal.h +++ b/firmware/libs-device/osccal.h @@ -22,11 +22,11 @@ calibrateOscillator() from the reset hook in usbconfig.h: */ #ifndef __ASSEMBLER__ -extern void calibrateOscillator(void); -//extern void calibrateOscillatorASM(void); +//extern void calibrateOscillator(void); +extern void calibrateOscillatorASM(void); #endif -#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillator(); } -//#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillatorASM(); } +//#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillator(); } +#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillatorASM(); } /* This routine is an alternative to the continuous synchronization described -- cgit v1.2.3 From 0a4f48c2cbcf20f93fc9531b3f57974cb4b6364d Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Mon, 4 Nov 2013 13:57:24 +0100 Subject: source code clean up --- firmware/libs-device/osccal.h | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) (limited to 'firmware/libs-device/osccal.h') diff --git a/firmware/libs-device/osccal.h b/firmware/libs-device/osccal.h index bfc5530..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,31 +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__ -//extern void calibrateOscillator(void); -extern void calibrateOscillatorASM(void); -#endif -//#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillator(); } -#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillatorASM(); } +#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 @@ -54,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! -- cgit v1.2.3