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

View File

@ -2,7 +2,7 @@
Sekunden Timer ISR Sekunden Timer ISR
5 Volt Variante für Peripherie 5 Volt Variante für Peripherie
Datenempfang vom Coprozessor Datenempfang vom Coprozessor
03.05.2025 19.05.2025
*/ */
#define bcdA 5 // D5 #define bcdA 5 // D5
@ -16,10 +16,6 @@
byte selectZiffer = 0; byte selectZiffer = 0;
byte displayPosition = 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 noSignalMinutenCounter = 0;
volatile byte noSignalStundenCounter = 0; volatile byte noSignalStundenCounter = 0;
volatile byte einerStunden = 7; volatile byte einerStunden = 7;
@ -27,7 +23,6 @@ volatile byte zehnerStunden = 1;
volatile byte einerMinuten = 0; volatile byte einerMinuten = 0;
volatile byte zehnerMinuten = 1; volatile byte zehnerMinuten = 1;
volatile byte offlineCounter = 0; volatile byte offlineCounter = 0;
volatile bool parityStat = 0;
void setup() { void setup() {
pinMode(bcdA, OUTPUT); pinMode(bcdA, OUTPUT);
@ -50,6 +45,7 @@ void setup() {
digitalWrite(displayPosition4, HIGH); digitalWrite(displayPosition4, HIGH);
Serial.begin(9600); Serial.begin(9600);
delay(100);
// Timer1 setzen (1 Sekunde = 49911, zwei Sekunden = 34286) // Timer1 setzen (1 Sekunde = 49911, zwei Sekunden = 34286)
TCCR1A = 0x00; TCCR1A = 0x00;
@ -68,7 +64,13 @@ ISR(TIMER1_OVF_vect){
offlineCounter = 0; offlineCounter = 0;
if (parityStat == 0) { /***********************************************************************
Die einzelnen Ziffern der vier Variablen werden in
dekadische Zahlen umgewandelt, damit sie vom lokalen
Minutentakt weiter gezählt werden können
***********************************************************************/
byte m = zehnerMinuten * 10; byte m = zehnerMinuten * 10;
noSignalMinutenCounter = m + einerMinuten; noSignalMinutenCounter = m + einerMinuten;
byte s = zehnerStunden * 10; byte s = zehnerStunden * 10;
@ -83,20 +85,18 @@ ISR(TIMER1_OVF_vect){
noSignalStundenCounter = 0; noSignalStundenCounter = 0;
} }
} }
einerStunden = noSignalStundenCounter % 10; // zerlegt die Zahl in Einer /***********************************************************************
zehnerStunden = (noSignalStundenCounter / 10) % 10; // und Zehner
zerlegt die dekadische Zahl wieder in einzelne Ziffern
für die Anzeige
**********************************************************************/
einerStunden = noSignalStundenCounter % 10;
zehnerStunden = (noSignalStundenCounter / 10) % 10;
einerMinuten = noSignalMinutenCounter % 10; einerMinuten = noSignalMinutenCounter % 10;
zehnerMinuten = (noSignalMinutenCounter / 10) % 10; zehnerMinuten = (noSignalMinutenCounter / 10) % 10;
} }
else {
einerMinuten = dcf77MinuteEiner;
zehnerMinuten = dcf77MinuteZehner;
einerStunden = dcf77HourEiner;
zehnerStunden = dcf77HourZehner;
parityStat = 0;
}
}
} }
void initDisplay() { void initDisplay() {
@ -319,13 +319,12 @@ noTime: {}
void loop() { void loop() {
if (Serial.available()) { if (Serial.available()) {
dcf77HourZehner = Serial.parseInt(); zehnerStunden = Serial.parseInt();
dcf77HourEiner = Serial.parseInt(); einerStunden = Serial.parseInt();
dcf77MinuteZehner = Serial.parseInt(); zehnerMinuten = Serial.parseInt();
dcf77MinuteEiner = Serial.parseInt(); einerMinuten = Serial.parseInt();
String(DCFzeit) = Serial.readString(); String(DCFzeit) = Serial.readString();
parityStat = 1;
} }
initDisplay(); // zeigt die Uhrzeit an initDisplay(); // zeigt die Uhrzeit an