begonnen dcf77 signal decoding zu implementieren
This commit is contained in:
@@ -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_ */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user