Beim Coprozessor gibt es eine erweiterte Paritätsprüfung, es werden jetzt 59 Impulse gezählt. In der 5 Volt Variante des Anzeigemoduls sind jetzt weniger Variablen.

This commit is contained in:
2025-05-19 17:24:47 +02:00
parent c8a2a390a6
commit ea16e78719
2 changed files with 89 additions and 75 deletions

View File

@ -6,28 +6,33 @@
Wenn ein gültiges Signal gesendet wurde, gibt es eine Pause von 30 Minuten,
in dieser Zeit wird der DCF Empfänger an Pin 6 abgeschaltet.
mit Hilfe von: https://wolles-elektronikkiste.de/dcf77-funkuhr
30.04.2025
19.05.2025
www.buschke.net
info@buschke.net
*/
#include <util/parity.h> //comment out if you don't use an AVR MCU
#define dcfOnOut 6
#define dcfOnOff 6
int interruptPin = 2;
volatile unsigned long lastInt = 0;
volatile unsigned long long currentBuf = 0;
volatile byte bufCounter;
volatile bool parityStat = 0;
volatile byte parityStat = 0;
volatile byte dcf77MinuteEiner = 0;
volatile byte dcf77MinuteZehner = 0;
volatile byte dcf77HourEiner = 0;
volatile byte dcf77HourZehner = 0;
volatile int testVar = 0;
unsigned long startMillis = 0;
const long waitingTime = 1800000; // 30 Minuten
byte dcfState = 0;
void setup() {
Serial.begin(9600);
pinMode(dcfOnOut, OUTPUT);
digitalWrite(dcfOnOut, HIGH);
pinMode(dcfOnOff, OUTPUT);
digitalWrite(dcfOnOff, HIGH);
pinMode(interruptPin, INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPin), DCF77_ISR, CHANGE);
}
@ -44,12 +49,26 @@ void loop() {
Serial.print(dcf77MinuteEiner);
delay(100);
digitalWrite(dcfOnOut, LOW);
dcfState = LOW;
digitalWrite(dcfOnOff, dcfState);
parityStat = 0;
delay(1800000); // 30 Minuten, 15 Minuten Wartezeit: 900000
digitalWrite(dcfOnOut, HIGH);
}
unsigned long currentMillis = millis();
if (currentMillis - startMillis >= waitingTime) {
startMillis = currentMillis;
if (dcfState == HIGH) {
dcfState = LOW;
}
else {
dcfState = HIGH;
}
digitalWrite(dcfOnOff, dcfState);
}
}
/*************************************************************************
@ -58,15 +77,17 @@ void loop() {
**************************************************************************/
void DCF77_ISR() { //
void DCF77_ISR() {
unsigned int dur = 0;
dur = millis() - lastInt;
if (digitalRead(interruptPin)) {
if (dur > 1500) {
unsigned long highBuf = (currentBuf >> 32) & 0x7FFFFFF;
unsigned long lowBuf = (currentBuf & 0xFFFFFFFF);
testVar = bufCounter;
bufCounter = 0;
evaluateSequence();
@ -78,6 +99,7 @@ void DCF77_ISR() { //
currentBuf |= ((unsigned long long)1 << bufCounter);
}
bufCounter++;
}
lastInt = millis();
}
@ -106,11 +128,6 @@ void evaluateSequence() {
bool parityBitHour = (currentBuf >> 35) & 1;
bool parityBitDate = (currentBuf >> 58) & 1;
/***************************************************************************
Paritätsprüfung
***************************************************************************/
if ((parity_even_bit(dcf77Minute)) != parityBitMinute) {
parityStat = 0;
}
@ -122,6 +139,9 @@ void evaluateSequence() {
{
parityStat = 0;
}
if (dcf77MinuteEiner > 9) {
parityStat = 0;
}
@ -134,12 +154,7 @@ void evaluateSequence() {
if (dcf77HourZehner > 2) {
parityStat = 0;
}
if (dcf77Hour == 0 && dcf77Minute == 0) {
if (testVar != 59) {
parityStat = 0;
}
}
unsigned int rawByteToInt(byte raw) {
return ((raw >> 4) * 10 + (raw & 0x0F));
}

View File

@ -2,7 +2,7 @@
Sekunden Timer ISR
5 Volt Variante für Peripherie
Datenempfang vom Coprozessor
03.05.2025
19.05.2025
*/
#define bcdA 5 // D5
@ -16,10 +16,6 @@
byte selectZiffer = 0;
byte displayPosition = 0;
volatile int dcf77MinuteEiner = 0;
volatile int dcf77MinuteZehner = 0;
volatile int dcf77HourEiner = 0;
volatile int dcf77HourZehner = 0;
volatile byte noSignalMinutenCounter = 0;
volatile byte noSignalStundenCounter = 0;
volatile byte einerStunden = 7;
@ -27,7 +23,6 @@ volatile byte zehnerStunden = 1;
volatile byte einerMinuten = 0;
volatile byte zehnerMinuten = 1;
volatile byte offlineCounter = 0;
volatile bool parityStat = 0;
void setup() {
pinMode(bcdA, OUTPUT);
@ -38,7 +33,7 @@ void setup() {
pinMode(displayPosition2, OUTPUT);
pinMode(displayPosition3, OUTPUT);
pinMode(displayPosition4, OUTPUT);
digitalWrite(bcdA, HIGH);
digitalWrite(bcdB, HIGH);
@ -48,54 +43,59 @@ void setup() {
digitalWrite(displayPosition2, HIGH);
digitalWrite(displayPosition3, HIGH);
digitalWrite(displayPosition4, HIGH);
Serial.begin(9600);
delay(100);
// Timer1 setzen (1 Sekunde = 49911, zwei Sekunden = 34286)
TCCR1A = 0x00;
TCCR1B = (1<<CS12) | (1<<CS10);
TIMSK1 = (1<<TOIE1);
TCCR1B = (1 << CS12) | (1 << CS10);
TIMSK1 = (1 << TOIE1);
TCNT1 = 49911;
}
ISR(TIMER1_OVF_vect){
ISR(TIMER1_OVF_vect) {
TCNT1 = 49911;
offlineCounter++;
if (offlineCounter > 59){
if (offlineCounter > 59) {
offlineCounter = 0;
if (parityStat == 0) {
byte m = zehnerMinuten * 10;
noSignalMinutenCounter = m + einerMinuten;
byte s = zehnerStunden * 10;
noSignalStundenCounter = s + einerStunden;
/***********************************************************************
noSignalMinutenCounter++;
Die einzelnen Ziffern der vier Variablen werden in
dekadische Zahlen umgewandelt, damit sie vom lokalen
Minutentakt weiter gezählt werden können
if (noSignalMinutenCounter > 59) {
noSignalMinutenCounter = 0;
noSignalStundenCounter++;
if (noSignalStundenCounter > 23) {
noSignalStundenCounter = 0;
}
***********************************************************************/
byte m = zehnerMinuten * 10;
noSignalMinutenCounter = m + einerMinuten;
byte s = zehnerStunden * 10;
noSignalStundenCounter = s + einerStunden;
noSignalMinutenCounter++;
if (noSignalMinutenCounter > 59) {
noSignalMinutenCounter = 0;
noSignalStundenCounter++;
if (noSignalStundenCounter > 23) {
noSignalStundenCounter = 0;
}
einerStunden = noSignalStundenCounter % 10; // zerlegt die Zahl in Einer
zehnerStunden = (noSignalStundenCounter / 10) % 10; // und Zehner
einerMinuten = noSignalMinutenCounter % 10;
zehnerMinuten = (noSignalMinutenCounter / 10) % 10;
}
/***********************************************************************
else {
einerMinuten = dcf77MinuteEiner;
zehnerMinuten = dcf77MinuteZehner;
einerStunden = dcf77HourEiner;
zehnerStunden = dcf77HourZehner;
parityStat = 0;
}
zerlegt die dekadische Zahl wieder in einzelne Ziffern
für die Anzeige
**********************************************************************/
einerStunden = noSignalStundenCounter % 10;
zehnerStunden = (noSignalStundenCounter / 10) % 10;
einerMinuten = noSignalMinutenCounter % 10;
zehnerMinuten = (noSignalMinutenCounter / 10) % 10;
}
}
@ -109,7 +109,7 @@ void initDisplay() {
digitalWrite(displayPosition1, HIGH);
digitalWrite(displayPosition2, LOW);
digitalWrite(displayPosition3, LOW);
digitalWrite(displayPosition4, LOW);
digitalWrite(displayPosition4, LOW);
if (zehnerStunden == 0) {
selectZiffer = 0;
@ -126,7 +126,7 @@ void initDisplay() {
digitalWrite(displayPosition1, LOW);
digitalWrite(displayPosition2, HIGH);
digitalWrite(displayPosition3, LOW);
digitalWrite(displayPosition4, LOW);
digitalWrite(displayPosition4, LOW);
if (einerStunden == 0) {
selectZiffer = 0;
@ -164,9 +164,9 @@ void initDisplay() {
digitalWrite(displayPosition1, LOW);
digitalWrite(displayPosition2, LOW);
digitalWrite(displayPosition3, HIGH);
digitalWrite(displayPosition4, LOW);
digitalWrite(displayPosition4, LOW);
if (zehnerMinuten == 0) {
selectZiffer = 0;
}
@ -192,9 +192,9 @@ void initDisplay() {
digitalWrite(displayPosition1, LOW);
digitalWrite(displayPosition2, LOW);
digitalWrite(displayPosition3, LOW);
digitalWrite(displayPosition4, HIGH);
digitalWrite(displayPosition4, HIGH);
if (einerMinuten == 0) {
selectZiffer = 0;
}
@ -318,16 +318,15 @@ noTime: {}
}
void loop() {
if (Serial.available()){
dcf77HourZehner = Serial.parseInt();
dcf77HourEiner = Serial.parseInt();
dcf77MinuteZehner = Serial.parseInt();
dcf77MinuteEiner = Serial.parseInt();
if (Serial.available()) {
zehnerStunden = Serial.parseInt();
einerStunden = Serial.parseInt();
zehnerMinuten = Serial.parseInt();
einerMinuten = Serial.parseInt();
String(DCFzeit) = Serial.readString();
parityStat = 1;
}
initDisplay(); // zeigt die Uhrzeit an
}