From 75a61c57fb0402f777bfa828dd71818a97ed54a4 Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Sun, 1 Apr 2012 00:20:25 +0200 Subject: original dcf77 C code --- ac.bat | 25 ++++++++++++ clock.c | 88 ++++++++++++++++++++++++++++++++++++++++ clock.h | 16 ++++++++ dcf77.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++ dcf77.h | 5 +++ main.c | 46 +++++++++++++++++++++ main.h | 20 ++++++++++ max7219.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ max7219.h | 51 ++++++++++++++++++++++++ timebase.c | 61 ++++++++++++++++++++++++++++ timebase.h | 13 ++++++ types.h | 23 +++++++++++ 12 files changed, 581 insertions(+) create mode 100644 ac.bat create mode 100644 clock.c create mode 100644 clock.h create mode 100644 dcf77.c create mode 100644 dcf77.h create mode 100644 main.c create mode 100644 main.h create mode 100644 max7219.c create mode 100644 max7219.h create mode 100644 timebase.c create mode 100644 timebase.h create mode 100644 types.h diff --git a/ac.bat b/ac.bat new file mode 100644 index 0000000..122be97 --- /dev/null +++ b/ac.bat @@ -0,0 +1,25 @@ +@echo off +set platz= +set platz1= + +:set mcu=90s2313 +set mcu=tiny26 +:set mcu=mega8 +set main=test + +set ac=c:\avr\winavr +path %ac%\bin;%path% +avr-gcc.exe -xc -Os -mmcu=at%mcu% -Wall -g -o main.out *.c >l +if not exist main.out goto end +cmd /c avr-objdump.exe -t -h -S main.out >%main%.lst +cmd /c avr-objcopy.exe -O ihex main.out %main%.hex +avr-size.exe -B main.out +del main.out +goto end + +::pause +call pf.bat %main% +::if errorlevel 1 goto end +::pause +::l -b19200 -i- -c1 +:end diff --git a/clock.c b/clock.c new file mode 100644 index 0000000..e6fba14 --- /dev/null +++ b/clock.c @@ -0,0 +1,88 @@ +/************************************************************************/ +/* */ +/* Clock / Calendar */ +/* */ +/* Author: Peter Dannegger */ +/* danni@specs.de */ +/* */ +/************************************************************************/ + +#include "main.h" +#include "clock.h" +#include "max7219.h" +#include "timebase.h" +#include "dcf77.h" + +struct time data time; + + +void display_date( void ) +{ + displaymem[7] = time.day / 10; + displaymem[6] = time.day % 10 | ATTRIB_DP; + displaymem[5] = time.month / 10; + displaymem[4] = time.month % 10 | ATTRIB_DP; + displaymem[3] = 2; + displaymem[2] = 0; + displaymem[1] = time.year / 10; + displaymem[0] = time.year % 10; +} + + +void display_time(void) +{ + displaymem[7] = time.hour / 10; + displaymem[6] = time.hour % 10; + + displaymem[4] = time.minute / 10; + displaymem[3] = time.minute % 10; + + displaymem[1] = time.second / 10; + displaymem[0] = time.second % 10; +} + + +u8 code MDAYS[] = { + 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + +void clock(void) +{ + u8 i; + + time.second++; + if( time.second == 60 ){ + time.second = 0; + timeflags = 1<= sizeof( BITNO )) // only bit 21 ... 58 + return; + parity ^= pulse; // calculate parity + i = LPM(&BITNO[i]); + if( i == 0xFF ){ // test parity + if( parity ) + dcf77error = 1; + parity = 0; + return; + } + d = (u8 *)&newtime.minute + (i >> 4); // byte address + i &= 0x0F; // bit number + if( i == 0 ) + *d = 0; // clear all, if lsb + if( pulse ) + *d += LPM(&BMASK[i]); // set bit +} + + +void scan_dcf77( void ) +{ + if( dcf77_pulse ){ + if( dcf77_pulse > 3 && dcf77_pulse < 8 ){ + decode_dcf77( 0 ); + }else{ + if( dcf77_pulse > 10 && dcf77_pulse < 14 ){ + decode_dcf77( 1 ); + }else{ + dcf77error = 1; + } + } + dcf77_pulse = 0; + } + + if( dcf77_period ){ + if( newtime.second < 60 ) + newtime.second++; + if( dcf77_period > 120 && dcf77_period < 140 ){ + if( dcf77error == 0 && newtime.second == 59 ){ + synchronize = 0xFF; + sync_sec(); + time.second = 0; + time.minute = newtime.minute; + time.hour = newtime.hour; + time.wday = newtime.wday; + time.day = newtime.day; + time.month = newtime.month; + time.year = newtime.year; + } + newtime.second = 0; + dcf77error = 0; + }else{ + if( dcf77_period < 60 || dcf77_period > 70 ) + dcf77error = 1; + } + dcf77_period = 0; + } +} diff --git a/dcf77.h b/dcf77.h new file mode 100644 index 0000000..79c859f --- /dev/null +++ b/dcf77.h @@ -0,0 +1,5 @@ +extern u8 dcf77error; +extern u8 synchronize; + + +void scan_dcf77( void ); diff --git a/main.c b/main.c new file mode 100644 index 0000000..f130906 --- /dev/null +++ b/main.c @@ -0,0 +1,46 @@ +#include "main.h" +#include "max7219.h" +#include "clock.h" +#include "timebase.h" +#include "dcf77.h" + + +int main( void ) +{ + PORTA = 0xFF; // enable pull ups + PORTB = 0xFF; + DDRA |= 1< +#include +#include +#include "types.h" + +#define XTAL 12000000L + + +// Hardware Definitions + +#define MAX7219_DDR DDRB +#define MAX7219_PORT PORTB +#define MAX7219_SCK PB2 +#define MAX7219_DO PB1 +#define MAX7219_STB PB3 + +#define DCF77_PIN PINA +#define DCF77_PORT PORTA +#define DCF77_DDR DDRA +#define DCF77 PA7 diff --git a/max7219.c b/max7219.c new file mode 100644 index 0000000..a1e0da3 --- /dev/null +++ b/max7219.c @@ -0,0 +1,133 @@ +/************************************************************************/ +/* */ +/* 7 Segment Driver MAX7219 */ +/* Common Anode Display */ +/* */ +/* Author: Peter Dannegger */ +/* danni@specs.de */ +/* */ +/************************************************************************/ + +#include "main.h" +#include "max7219.h" + +u8 brightness = 5; + +u8 code digits[] = { DIGITS }; + +u8 displaymem[8] = { CHAR_SPACE, // 8 digits, msb first + CHAR_SPACE, + CHAR_SPACE, + CHAR_SPACE, + CHAR_SPACE, + CHAR_SPACE, + CHAR_SPACE, + CHAR_SPACE }; + +u8 code charset[] = { // Definition Character Set + _A+_B+_C+_D+_E+_F , // CHAR_0 + _B+_C , // CHAR_1 + _A+_B+ _D+_E+ _G, // CHAR_2 + _A+_B+_C+_D+ _G, // CHAR_3 + _B+_C+ _F+_G, // CHAR_4 + _A+ _C+_D+ _F+_G, // CHAR_5 + _A+ _C+_D+_E+_F+_G, // CHAR_6 + _A+_B+_C , // CHAR_7 + _A+_B+_C+_D+_E+_F+_G, // CHAR_8 + _A+_B+_C+_D +_F+_G, // CHAR_9 + _A+_B+_C+ _E+_F+_G, // CHAR_A + _C+_D+_E+_F+_G, // CHAR_b + _D+_E+ _G, // CHAR_c ;'c' + _B+_C+_D+_E+ _G, // CHAR_d + _A+ _D+_E+_F+_G, // CHAR_E + _A+ _E+_F+_G, // CHAR_F + 0 , // 16 = SPACE + _G, // 17 = MINUS + _A+_B+ _F+_G, // 18 = GRAD + _A+ _D+_E+_F , // 19 = CHAR_C2 ;'C' + _E+ _G, // 20 = CHAR_r + _C+_D+_E+ _G, // 21 = CHAR_o + _B+_C+ _E+_F+_G, // 22 = H + _D+_E+_F , // 23 = L + _D , // 24 = _ + _A , // 25 = upper "-" + _A+_B+ _E+_F+_G, // CHAR_P + _B+_C+_D+_E+_F , // CHAR_U + _A+_B+_C+ _E+_F // CHAR_M + }; + + +void display_write( u16 dc ) +{ + u8 i; + + MAX7219_DDR |= 1<>= 1; // next segment + dptr++; + } + display_write( byte + i * 256); // output same segments + } +} + + +void display_clear( void ) +{ + u8 i; + + for( i = 8; i; i--) + displaymem[i-1] = CHAR_SPACE; +} + + +void display_init( void ) +{ + display_write( 0xF00 ); // Testmode off + display_write( 0x900 ); // Decode off + display_write( 0xB07 ); // 8 Digits + display_write( 0xC01 ); // Display on + display_write( 0xA00 | brightness ); // Brightness +} + + +void display_off( void ) +{ + display_write( 0xC00 ); +} diff --git a/max7219.h b/max7219.h new file mode 100644 index 0000000..cfbb846 --- /dev/null +++ b/max7219.h @@ -0,0 +1,51 @@ +/************** Ansteuerung des 7-Segment-Treibers MAX7219 **************/ + +#define BRIGHT 4 // 0 ... 15 + +// Definitionen +// 1. Display type +#define COMMON_CATHODE +//#define COMMON_ANODE // not implemented + +// 2. Pin-Deklaration +//sbit DISCLK = 0x97; //BIT P1.7 +//sbit DISDAT = 0x95; //BIT P1.5 +//sbit DISSTB = 0x94; //BIT P1.4 + +// 3. Segment-Order +#define _A 0x01 // - A - +#define _B 0x40 // | | +#define _C 0x02 // F B +#define _D 0x80 // | | +#define _E 0x08 // - G - +#define _F 0x04 // | | +#define _G 0x10 // E C +#define _DP 0x20 // | | + // - D - P +#define DPBIT 7 + +// 4. Digit-Order +#define DIGITS 8, 128, 4, 16, 1, 32, 2, 64 + +#define CHAR_SPACE 16 +#define CHAR_MINUS 17 +#define CHAR_GRAD 18 +#define CHAR_C2 19 +#define CHAR_R 20 +#define CHAR_O 21 +#define CHAR_H 22 +#define CHAR_L 23 +#define CHAR__ 24 +#define CHAR_S1 25 // upper "-" + + +#define ATTRIB_DP 0x80 // decimal point attribute, must be ored +#define ATTRIB_FLASH 0x40 // flash attribute, must be ored + + +void display_init(void); +void display_out(void); +void display_clear(void); +void display_off(void); + +extern u8 displaymem[]; diff --git a/timebase.c b/timebase.c new file mode 100644 index 0000000..3b97e2b --- /dev/null +++ b/timebase.c @@ -0,0 +1,61 @@ +#include "main.h" +#include "timebase.h" + + // at 12MHz: +#define T0COUNT (XTAL / 1024 / 64) // 183 +#define T0SECERR (XTAL - 1024L * 64 * T0COUNT) // 6912 +#define T0COUNTSEC (T0COUNT + T0SECERR / 1024) // 189 +#define T0MINERR (XTAL - 1024 * (63 * T0COUNT + T0COUNTSEC)) // 768 +#define T0COUNTMIN (T0COUNTSEC + (T0MINERR * 60 + 512) / 1024) // 234 + +// 234 = 12000000 Hz +// 233 = 12000017 Hz = 4s/month + + +u8 timeflags; +u8 dcf77_period; +u8 dcf77_pulse; +u8 ct_64Hz; // 64 Hz counter (4sec) + + +void timebase_init( void ) +{ + TCCR0 = 1< + +typedef unsigned char u8; +typedef signed char s8; +typedef unsigned short u16; +typedef signed short s16; +typedef unsigned long u32; +typedef signed long s32; + +#define uchar unsigned char +#define uint unsigned int + + +// 8051 compatibility: + +#define code PROGMEM +#define LPM(i) (__LPM_classic__(i)) +#define data +#define idata +#define pdata +#define xdata + +#define bit uchar -- cgit v1.2.1