📄 ntpleduhr.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 + -