begonnen dcf77 signal decoding zu implementieren

This commit is contained in:
BlexTw11
2016-01-25 21:48:04 +01:00
parent cdff11aed0
commit ca19084b4b
5 changed files with 104 additions and 6 deletions

View File

@@ -8,8 +8,27 @@
#ifndef INCLUDE_DCF77_H_
#define INCLUDE_DCF77_H_
#define DCF77_PORT PORTB
#include <stdint.h>
#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_ */

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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