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:
@ -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));
|
|
||||||
}
|
}
|
||||||
|
@ -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,25 +45,32 @@ 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;
|
||||||
TCCR1B = (1<<CS12) | (1<<CS10);
|
TCCR1B = (1 << CS12) | (1 << CS10);
|
||||||
TIMSK1 = (1<<TOIE1);
|
TIMSK1 = (1 << TOIE1);
|
||||||
TCNT1 = 49911;
|
TCNT1 = 49911;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ISR(TIMER1_OVF_vect){
|
ISR(TIMER1_OVF_vect) {
|
||||||
|
|
||||||
TCNT1 = 49911;
|
TCNT1 = 49911;
|
||||||
offlineCounter++;
|
offlineCounter++;
|
||||||
|
|
||||||
if (offlineCounter > 59){
|
if (offlineCounter > 59) {
|
||||||
|
|
||||||
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() {
|
||||||
@ -318,14 +318,13 @@ 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
|
||||||
|
Reference in New Issue
Block a user