⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntpleduhr.c

📁 WWVB receiver using AVR.
💻 C
字号:
/* $Id: ntpleduhr.c,v 1.39 2005/10/30 19:44:38 simimeie Exp $ * The big NTP LED clock project. * This is the main file that glues it all together. * (C) Michael "Fox" Meier 2005 */#define BV _BV#include <avr/io.h>#include <avr/interrupt.h>#include <avr/wdt.h>#include <avr/eeprom.h>#include "debugconsole.h"#include "timers.h"#include "dcf77.h"#include "ledmodule.h"#include "clockface.h"#include "eepromdata.h"#include "networkstack.h"#include "timeformat.h"#if ((defined(EXTMEMORY)) || (defined(ISANETWORK)))void init_extmem(void) __attribute__ ((naked)) __attribute__ ((section (".init1")));void init_extmem(void) {	/* Enable external memory */	MCUCR |= BV(SRE);	/* Warning! All waitstate select bits are in EMCUCR - except SRW10	 * which is in MCUCR */#if 0	/* Very conservative (slowest possible) memory access settings.	 * Use this if you have any problems. */	/* Make that 2 waitstates with additional delay */	MCUCR |= BV(SRW10);	EMCUCR |= BV(SRW11);#else	/* Split memory in two ranges, 0260-7fff and rest */	EMCUCR |= BV(SRL2);	/* First range (RAM) gets 1 wait state */	EMCUCR |= BV(SRW00);	/* Second range (ISA) gets 2 wait states */	EMCUCR |= BV(SRW11);#endif}#endifstruct tickdata timera;struct tickdata timerb;uint8_t kniri;uint8_t knir2;int main(void){#ifndef NOINTERNALOSC	/* First try to calibrate the internal oscilator */	kniri = eeprom_read_byte(&ee_osccalib);	if (kniri > 0) {		OSCCAL = kniri;	}#endif#ifdef LEDMODULE	led_brightness = eeprom_read_byte(&ee_ledbri);#endif#ifdef CLOCKFACEMODULE	clockface_brightness = eeprom_read_byte(&ee_clockfacebri);#endif	debugconsole_init();	timers_init();	dcf77_init();	led_init();	set_led_brightness();	for (kniri = 0; kniri < 8; kniri++) {		set_led_digit(kniri, 0xff);	}	clockface_init();#ifdef ISANETWORK	for (kniri = 0; kniri < 4; kniri++) {		net_ip[kniri]   = eeprom_read_byte(&ee_ip[kniri]);#if 0		net_mask[kniri] = eeprom_read_byte(&ee_mask[kniri]);		net_gate[kniri] = eeprom_read_byte(&ee_gate[kniri]);#endif	}	eeprom_read_block(&net_rconpass[0], &ee_rconpass[0], 9);	net_init();#endif	wdt_enable(WDTO_2S);		/* All set up, enable interrupts and go. */	sei();		while (1) { /* We should never exit, or should we? */		debugconsole_work();		wdt_reset();		net_receivepacket();		net_handlereceivedpacket();#ifdef LEDMODULE		gettickdata(&timerb);		if ((timerb.ticks - timera.ticks) > (TICKSPERSECOND / 6)) {			struct brokentime bt;			uint8_t valtime = dcfvalid;			timera = timerb;			tstobt(dcftime[valtime].timestamp				+ ((uint16_t)(timera.seconds - dcftime[valtime].ticksecs)), &bt);			/* Update clockface */			clockface_update((bt.min & 0x01), bt.sec);			/* Update time display */			set_led_brightness();			set_led_digit(7, led_statusleds);			led_statusleds &= (uint8_t)~(led_status_dcfbit						   | led_status_nettx						   | led_status_netrx						   | led_status_netping						   | led_status_netntp						   | led_status_netrcon						   | led_status_dispovr);			if (led_dispovcnt) {				uint8_t i;				for (i = 0; i < 7; i++) {					set_led_digit(i, led_dispoverride[i]);				}				led_dispovcnt--;				led_statusleds |= led_status_dispovr;			} else if (dcftime[valtime].timestamp > 0) {				if ((32 < (bt.sec % 60)) && ((bt.sec % 60) < 38)) {					set_led_digit(0, led_digits[bt.day / 10]);					set_led_digit(1, led_digits[bt.day % 10] | led_dot);					set_led_digit(2, led_digits[bt.month / 10]);					set_led_digit(3, led_digits[bt.month % 10] | led_dot);					set_led_digit(4, led_digits[bt.year / 10]);					set_led_digit(5, led_digits[bt.year % 10]);					set_led_digit(6, 0x00);				} else {					set_led_digit(0, led_digits[bt.hour / 10]);					set_led_digit(1, led_digits[bt.hour % 10]);					set_led_digit(2, led_digits[bt.min / 10]);					set_led_digit(3, led_digits[bt.min % 10]);					set_led_digit(4, led_digits[bt.sec / 10]);					set_led_digit(5, led_digits[bt.sec % 10]);					if ((timera.ticks) <= (TICKSPERSECOND / 2)) {						set_led_digit(6, 0xFF);					} else {						set_led_digit(6, 0x00);					}				}				if (((uint16_t)(timera.seconds - dcftime[valtime].ticksecs)) > 1800) {					/* More than 30 minutes without reception.					 * We can safely assume that our timebase					 * is utter crap by now. So mark it as invalid. */					dcftime[valtime].timestamp = 0;				}			} else {				uint8_t a;				uint8_t i;				kniri++;				if (kniri > 9) { kniri = 0; }				if (kniri < 6) {					a = kniri;				} else {					a = 10 - kniri;				}				for (i = 0; i < 7; i++) {					if (i == a) {						set_led_digit(i, led_dash);					} else {						set_led_digit(i, 0x00);					}				}				knir2++;				if (knir2 >= 60) { knir2 = 0; }				clockface_update(2, knir2);			}		}#endif	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -