diff --git a/Firmware/include/dcf77.h b/Firmware/include/dcf77.h index 577bc5d..e1abd20 100644 --- a/Firmware/include/dcf77.h +++ b/Firmware/include/dcf77.h @@ -8,8 +8,27 @@ #ifndef INCLUDE_DCF77_H_ #define INCLUDE_DCF77_H_ -#define DCF77_PORT PORTB +#include + +#define DCF77_CHANGE_MEZ 16 +#define DCF77_MESZ 17 +#define DCF77_MEZ 18 +#define DCF77_LEAP_SEC 19 +#define DCF77_MINUTE 21 +#define DCF77_MINUTE_PARITY 28 +#define DCF77_HOUR 29 +#define DCF77_HOUR_PARITY 35 +#define DCF77_DAY 36 +#define DCF77_WEEK 42 +#define DCF77_MONTH 45 +#define DCF77_YEAR 50 +#define DCF77_DATE_PARITY 58 + + +#define DCF77_PORT PORTB #define DCF77_DDR DDRB #define DCF77_PIN PB0 +typedef enum {LOW, HIGH} t_dcf; + #endif /* INCLUDE_DCF77_H_ */ diff --git a/Firmware/include/ds1307.h b/Firmware/include/ds1307.h index 63e3d8d..4c43b38 100644 --- a/Firmware/include/ds1307.h +++ b/Firmware/include/ds1307.h @@ -57,7 +57,7 @@ typedef struct { MODE_HOUR mode; MODE_AMPM ampm; uint8_t day; - uint8_t date; + uint8_t weekday; uint8_t month; uint8_t year; } t_TIME; diff --git a/Firmware/src/dcf77.c b/Firmware/src/dcf77.c index 21c0f01..4b102f8 100644 --- a/Firmware/src/dcf77.c +++ b/Firmware/src/dcf77.c @@ -5,4 +5,83 @@ * Author: BlexTw11 */ +#include "dcf77.h" +#include "ds1307.h" +uint64_t dcf77_signal = 0; +uint8_t bit_counter = 0; + +uint8_t bit_lookup[8] = {0, 1, 1, 2, 1, 2, 2, 3, 1}; + + +uint8_t DCF77_write_second(t_dcf bit) +{ + if (bit_counter < 59) + { + dcf77_signal |= (bit << bit_counter++); + return 0; + } + else + bit_counter = 0; + + return 1; +} + +uint8_t DCF77_calc_date(t_TIME * date) +{ + uint8_t value = 0, + sum_bit_count = 0; + + date->mode = MODE_12; + date->seconds = 0; + + value = (dcf77_signal >> DCF77_MINUTE) & 0x7f; + + if ( ( (bit_lookup[value] % 2) && ((dcf77_signal >> DCF77_MINUTE_PARITY) & 0x1) ) + || ( !(bit_lookup[value] % 2) && !((dcf77_signal >> DCF77_MINUTE_PARITY) & 0x1) )) + { + date->minutes = BCD_TO_INT(value); + } + else + return 1; + + value = (dcf77_signal >> DCF77_HOUR) & 0x3f; + + if ( ( (bit_lookup[value] % 2) && ((dcf77_signal >> DCF77_HOUR_PARITY) & 0x1) ) + || ( !(bit_lookup[value] % 2) && !((dcf77_signal >> DCF77_HOUR_PARITY) & 0x1) )) + { + date->hours = BCD_TO_INT(value); + + if (date->hours <= 12) + date->ampm = AM; + else + date->ampm = PM; + } + else + return 1; + + value = (dcf77_signal >> DCF77_DAY) & 0x3f; + sum_bit_count += bit_lookup[value]; + date->day = BCD_TO_INT(value); + + value = (dcf77_signal >> DCF77_WEEK) & 0x3; + sum_bit_count += bit_lookup[value]; + date->weekday = BCD_TO_INT(value); + + value = (dcf77_signal >> DCF77_MONTH) & 0x1f; + sum_bit_count += bit_lookup[value]; + date->month = BCD_TO_INT(value); + + value = (dcf77_signal >> DCF77_YEAR) & 0xff; + sum_bit_count += bit_lookup[value]; + date->year = BCD_TO_INT(value); + + if (!( ( (sum_bit_count % 2) && ((dcf77_signal >> DCF77_DATE_PARITY) & 0x1) ) + || ( !(sum_bit_count % 2) && !((dcf77_signal >> DCF77_DATE_PARITY) & 0x1) )) ) + { + return 1; + } + + return 0; + +} diff --git a/Firmware/src/ds1307.c b/Firmware/src/ds1307.c index 77dfc81..7de3fe8 100644 --- a/Firmware/src/ds1307.c +++ b/Firmware/src/ds1307.c @@ -26,8 +26,8 @@ uint8_t DS1307_init(t_TIME timestamp, uint8_t square_wave, uint8_t frequency, ui if (timestamp.mode == MODE_12) ds1307_date[2] |= (timestamp.ampm << 5); - ds1307_date[3] = INT_TO_BCD(timestamp.day); - ds1307_date[4] = INT_TO_BCD(timestamp.date); + ds1307_date[3] = INT_TO_BCD(timestamp.weekday); + ds1307_date[4] = INT_TO_BCD(timestamp.day); ds1307_date[5] = INT_TO_BCD(timestamp.month); ds1307_date[6] = INT_TO_BCD(timestamp.year); diff --git a/Firmware/src/main.c b/Firmware/src/main.c index f2885aa..7369043 100644 --- a/Firmware/src/main.c +++ b/Firmware/src/main.c @@ -103,8 +103,8 @@ int main(void) date.hours = 10; date.mode = MODE_24; date.ampm = PM; // 0001 0000 - date.day = 1; - date.date = 19; // 0001 1001 + date.weekday = 1; + date.day = 19; // 0001 1001 date.month = 3; // 0000 0011 date.year = 11; // 0001 0001