diff --git a/Coprozessor_DCF77.ino b/Coprozessor_DCF77.ino index a6f6550..153aa2b 100644 --- a/Coprozessor_DCF77.ino +++ b/Coprozessor_DCF77.ino @@ -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 //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)); } diff --git a/Uhr_DCF77_5Volt_V3.ino b/Uhr_DCF77_5Volt_V3.ino index a783a6b..e9065e9 100644 --- a/Uhr_DCF77_5Volt_V3.ino +++ b/Uhr_DCF77_5Volt_V3.ino @@ -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< 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 - + }