diff -Bb -up freq_meter/cpu_mhz.h freq_meter-20100825/cpu_mhz.h --- freq_meter/cpu_mhz.h 2010-08-22 17:03:09.000000000 +0200 +++ freq_meter-20100825/cpu_mhz.h 2010-08-23 22:07:54.000000000 +0200 @@ -1,6 +1,6 @@ -// autogenerated by ./avr_isp.pl, Sun Aug 22 17:03:09 2010 +// autogenerated by ./avr_isp.pl, Mon Aug 23 22:07:54 2010 #ifndef CPU_MHZ -# define CPU_MHZ 12 -# define CPU_MHZ_10 120 -# define F_CPU 12000000L +# define CPU_MHZ 20 +# define CPU_MHZ_10 200 +# define F_CPU 20000000L #endif diff -Bb -up freq_meter/lcd_hd44780u.h freq_meter-20100825/lcd_hd44780u.h --- freq_meter/lcd_hd44780u.h 2010-08-22 16:56:56.000000000 +0200 +++ freq_meter-20100825/lcd_hd44780u.h 2010-08-24 19:52:51.000000000 +0200 @@ -80,9 +80,15 @@ static inline void lcd_write4 (uint8_t d // RW setup time t_AS: min 40ns (60ns) - considered already set LCDC_PORT |= (1<> LCD_D4; LCDC_PORT &= ~(1< + * 20100823 -us de0508 + * 20100824 -us de0508 + * 20100825 -us de0508 kHz Anzeige * License: GPL v2 */ @@ -21,10 +24,34 @@ #define _TOSTRING2(x) #x #define _TOSTRING(x) _TOSTRING2(x) -#define INIT_TEXT "FreqC V" _TOSTRING(VERSION) +#define INIT_TEXT "FreqCnt Ver. " _TOSTRING(VERSION) +// 0123456789012345 #define MIN_SAMPLE_TIME 0.5 // May be extended by up to a full cycle -#define MIN_RES 5 // Minimum resolution: 6 numbers i.e. .000001 -#define MAX_RES 7 // Maximum resolution: 7 numbers i.e. 123456.7 +#define MIN_RES 4 // default 5, Minimum resolution: 6 numbers i.e. .000001 +#define MAX_RES 9 // default 7, Maximum resolution: 7 numbers i.e. 123456.7 + +// 20100825 -us +// function: extern double pow(double __x, double __y) ; +#define POW_10_0 (double)(1) +#define POW_10_1 (double)(10) +#define POW_10_2 (double)(100) +#define POW_10_3 (double)(1000) +#define POW_10_4 (double)(10000) +#define POW_10_5 (double)(100000) +#define POW_10_6 (double)(1000000) +#define POW_10_7 (double)(10000000) +#define POW_10_8 (double)(100000000) +#define POW_10_9 (double)(1000000000) + +#define _POW_10_FUNC2(n) POW_10_##n +#define _POW_10_FUNC(n) _POW_10_FUNC2(n) + +/* show frequency in range */ +#define FREQ_KHZ +// #define FREQ_MHZ +//#define FREQ_GHZ + +// ------------------------ #define INPUT_PULLUP 0 // Set to 1 to enable pullup at input pin(s) @@ -40,8 +67,8 @@ * LCD definitions */ -#define LCD_LINES 2 // 1 or 2 lines -#define LCD_COLS 5 // 10col display (2*5) - only required for wrap +#define LCD_LINES 1 // 1 or 2 lines +#define LCD_COLS 16 // 10col display (2*5) - only required for wrap #if defined (__AVR_ATtiny2313__) || defined (__AVR_ATtiny2313A__) @@ -265,6 +292,9 @@ extern int main (void) { uint8_t i; char buf[16]; + enum {FREQ_ID_HZ=0, FREQ_ID_KHZ, FREQ_ID_MHZ, FREQ_ID_GHZ}; + const char *a_freq_text[] = {" Hz","kHz","MHz","GHz"}; // 20100825 -us + const char *c_freq_text = a_freq_text[FREQ_ID_HZ]; #if DEBUG_LED /* Initial blinking to show we're alive */ @@ -280,7 +310,9 @@ extern int main (void) lcd_init (); _delay_ms (200.0); lcd_putswrap (0, 0, INIT_TEXT); - _delay_ms (500.0); + _delay_ms (1000.0); + + lcd_clear (); // clear display /* Setup pull-up for external input - allow open collector inputs */ /* INT0 and T0 have to be connected */ @@ -377,7 +409,9 @@ extern int main (void) * Calculate frequency from counters */ uint32_t cnt = TCNT0 + ((uint32_t)cnt_t0 << 8); - const uint64_t fact = F_CPU * pow (10, MIN_RES) + .5; + // const uint64_t fact = F_CPU * pow (10, MIN_RES) + .5; + const uint64_t fact = F_CPU * _POW_10_FUNC(MIN_RES) + .5; + /* This would overflow in 32bit * (actually fact may even be larger than UINT32_MAX) */ uint64_t frq = uint64_mul32 (fact, cnt); @@ -385,10 +419,25 @@ extern int main (void) frq += nom >> 1; // round frq = uint64_div32 (frq, nom); + /* scale to Hz, kHz, MHz, GHz */ +# ifdef FREQ_KHZ // 20100825 -us + frq = uint64_div32 (frq, _POW_10_FUNC(3) ); + c_freq_text = a_freq_text[FREQ_ID_KHZ]; +# endif +# ifdef FREQ_MHZ // 20100825 -us + frq = uint64_div32 (frq, _POW_10_FUNC(6) ); + c_freq_text = a_freq_text[FREQ_ID_MHZ]; +# endif +# ifdef FREQ_GHZ // 20100825 -us + frq = uint64_div32 (frq, _POW_10_FUNC(9) ); + c_freq_text = a_freq_text[FREQ_ID_GHZ]; +# endif + /* Find precision (auto-range) */ uint8_t s = MIN_RES; #if MAX_RES > 0 - while (s && frq >= (uint64_t) pow (10, MAX_RES)) { + // while (s && frq >= (uint64_t) pow (10, MAX_RES)) { + while (s && frq >= (uint64_t) _POW_10_FUNC(MAX_RES)) { frq += 5; // round frq = uint64_div32 (frq, 10); s--; @@ -405,15 +454,30 @@ extern int main (void) */ lcd_cmd (0x0c); lcd_pos (0, 0); -#if LCD_COLS > 5 + +#if LCD_LINES == 1 // 20100824 -us + lcd_puts (buf); + // i= strln(buf); zähle Anzahl der Zeichen + for (i = 0; buf[i]; i++) + ; + + while (i++ < LCD_COLS-3) + lcd_write (' '); + + lcd_pos (0, LCD_COLS-3); + lcd_puts (c_freq_text); + +#else // LCD_LINES = 2 + +# if LCD_COLS > 5 lcd_puts (buf); for (i = 0; buf[i]; i++) ; while (i++ < LCD_COLS) lcd_write (' '); lcd_pos (1, 0); - lcd_puts ("Hz"); -#else + lcd_puts (c_freq_text); +# else for (i = 0; buf[i]; i++) ; buf[i++] = 'H'; @@ -422,6 +486,7 @@ extern int main (void) buf[i++] = ' '; buf[i] = 0; lcd_putswrap (0, 0, buf); +# endif #endif } } Nur in freq_meter-20100825/: main (Kopie).c. diff -Bb -up freq_meter/Makefile freq_meter-20100825/Makefile --- freq_meter/Makefile 2010-08-22 16:59:11.000000000 +0200 +++ freq_meter-20100825/Makefile 2010-08-23 22:04:47.000000000 +0200 @@ -9,8 +9,10 @@ CFILES = main.c #CPU = tiny2313 CPU = mega48 #CPU = mega8 +#CPU = mega88 +#CPU = mega32 -PROG_HW = usbtiny # www.ladyada.com +PROG_HW = usbasp PROG_SW = avrdude CFLAGS += -Os -g -Wall