Dateien nach "/" hochladen
In dieser Variante 3 ist kein DCF Empfänger, die Zeitdaten werden von einem Coprozessor geliefert
This commit is contained in:
333
Uhr_DCF77_5Volt_V3.ino
Normal file
333
Uhr_DCF77_5Volt_V3.ino
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
/* Programm zum DCF77 Empfang für atmega 328p
|
||||||
|
Sekunden Timer ISR
|
||||||
|
5 Volt Variante für Peripherie
|
||||||
|
Datenempfang vom Coprozessor
|
||||||
|
03.05.2025
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define bcdA 5 // D5
|
||||||
|
#define bcdB 6 // D6
|
||||||
|
#define bcdC 7 // D7
|
||||||
|
#define bcdD 8 // D8
|
||||||
|
#define displayPosition1 9 // D9
|
||||||
|
#define displayPosition2 10 // D10
|
||||||
|
#define displayPosition3 3 // D3
|
||||||
|
#define displayPosition4 4 // D4
|
||||||
|
|
||||||
|
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;
|
||||||
|
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);
|
||||||
|
pinMode(bcdB, OUTPUT);
|
||||||
|
pinMode(bcdC, OUTPUT);
|
||||||
|
pinMode(bcdD, OUTPUT);
|
||||||
|
pinMode(displayPosition1, OUTPUT);
|
||||||
|
pinMode(displayPosition2, OUTPUT);
|
||||||
|
pinMode(displayPosition3, OUTPUT);
|
||||||
|
pinMode(displayPosition4, OUTPUT);
|
||||||
|
|
||||||
|
|
||||||
|
digitalWrite(bcdA, HIGH);
|
||||||
|
digitalWrite(bcdB, HIGH);
|
||||||
|
digitalWrite(bcdC, HIGH);
|
||||||
|
digitalWrite(bcdD, HIGH);
|
||||||
|
digitalWrite(displayPosition1, HIGH);
|
||||||
|
digitalWrite(displayPosition2, HIGH);
|
||||||
|
digitalWrite(displayPosition3, HIGH);
|
||||||
|
digitalWrite(displayPosition4, HIGH);
|
||||||
|
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
// Timer1 setzen (1 Sekunde = 49911, zwei Sekunden = 34286)
|
||||||
|
TCCR1A = 0x00;
|
||||||
|
TCCR1B = (1<<CS12) | (1<<CS10);
|
||||||
|
TIMSK1 = (1<<TOIE1);
|
||||||
|
TCNT1 = 49911;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(TIMER1_OVF_vect){
|
||||||
|
|
||||||
|
TCNT1 = 49911;
|
||||||
|
offlineCounter++;
|
||||||
|
|
||||||
|
if (offlineCounter > 59){
|
||||||
|
|
||||||
|
offlineCounter = 0;
|
||||||
|
|
||||||
|
if (parityStat == 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void initDisplay() {
|
||||||
|
|
||||||
|
// Die Schleife ruft nacheinander die Anzeigestellen auf und übergibt die Ziffern
|
||||||
|
|
||||||
|
for (displayPosition = 1; displayPosition <= 4; displayPosition++) {
|
||||||
|
|
||||||
|
if (displayPosition == 1) {
|
||||||
|
digitalWrite(displayPosition1, HIGH);
|
||||||
|
digitalWrite(displayPosition2, LOW);
|
||||||
|
digitalWrite(displayPosition3, LOW);
|
||||||
|
digitalWrite(displayPosition4, LOW);
|
||||||
|
|
||||||
|
if (zehnerStunden == 0) {
|
||||||
|
selectZiffer = 0;
|
||||||
|
}
|
||||||
|
if (zehnerStunden == 1) {
|
||||||
|
selectZiffer = 1;
|
||||||
|
}
|
||||||
|
if (zehnerStunden == 2) {
|
||||||
|
selectZiffer = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (displayPosition == 2) {
|
||||||
|
digitalWrite(displayPosition1, LOW);
|
||||||
|
digitalWrite(displayPosition2, HIGH);
|
||||||
|
digitalWrite(displayPosition3, LOW);
|
||||||
|
digitalWrite(displayPosition4, LOW);
|
||||||
|
|
||||||
|
if (einerStunden == 0) {
|
||||||
|
selectZiffer = 0;
|
||||||
|
}
|
||||||
|
if (einerStunden == 1) {
|
||||||
|
selectZiffer = 1;
|
||||||
|
}
|
||||||
|
if (einerStunden == 2) {
|
||||||
|
selectZiffer = 2;
|
||||||
|
}
|
||||||
|
if (einerStunden == 3) {
|
||||||
|
selectZiffer = 3;
|
||||||
|
}
|
||||||
|
if (einerStunden == 4) {
|
||||||
|
selectZiffer = 4;
|
||||||
|
}
|
||||||
|
if (einerStunden == 5) {
|
||||||
|
selectZiffer = 5;
|
||||||
|
}
|
||||||
|
if (einerStunden == 6) {
|
||||||
|
selectZiffer = 6;
|
||||||
|
}
|
||||||
|
if (einerStunden == 7) {
|
||||||
|
selectZiffer = 7;
|
||||||
|
}
|
||||||
|
if (einerStunden == 8) {
|
||||||
|
selectZiffer = 8;
|
||||||
|
}
|
||||||
|
if (einerStunden == 9) {
|
||||||
|
selectZiffer = 9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (displayPosition == 3) {
|
||||||
|
digitalWrite(displayPosition1, LOW);
|
||||||
|
digitalWrite(displayPosition2, LOW);
|
||||||
|
digitalWrite(displayPosition3, HIGH);
|
||||||
|
digitalWrite(displayPosition4, LOW);
|
||||||
|
|
||||||
|
|
||||||
|
if (zehnerMinuten == 0) {
|
||||||
|
selectZiffer = 0;
|
||||||
|
}
|
||||||
|
if (zehnerMinuten == 1) {
|
||||||
|
selectZiffer = 1;
|
||||||
|
}
|
||||||
|
if (zehnerMinuten == 2) {
|
||||||
|
selectZiffer = 2;
|
||||||
|
}
|
||||||
|
if (zehnerMinuten == 3) {
|
||||||
|
selectZiffer = 3;
|
||||||
|
}
|
||||||
|
if (zehnerMinuten == 4) {
|
||||||
|
selectZiffer = 4;
|
||||||
|
}
|
||||||
|
if (zehnerMinuten == 5) {
|
||||||
|
selectZiffer = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (displayPosition == 4) {
|
||||||
|
digitalWrite(displayPosition1, LOW);
|
||||||
|
digitalWrite(displayPosition2, LOW);
|
||||||
|
digitalWrite(displayPosition3, LOW);
|
||||||
|
digitalWrite(displayPosition4, HIGH);
|
||||||
|
|
||||||
|
|
||||||
|
if (einerMinuten == 0) {
|
||||||
|
selectZiffer = 0;
|
||||||
|
}
|
||||||
|
if (einerMinuten == 1) {
|
||||||
|
selectZiffer = 1;
|
||||||
|
}
|
||||||
|
if (einerMinuten == 2) {
|
||||||
|
selectZiffer = 2;
|
||||||
|
}
|
||||||
|
if (einerMinuten == 3) {
|
||||||
|
selectZiffer = 3;
|
||||||
|
}
|
||||||
|
if (einerMinuten == 4) {
|
||||||
|
selectZiffer = 4;
|
||||||
|
}
|
||||||
|
if (einerMinuten == 5) {
|
||||||
|
selectZiffer = 5;
|
||||||
|
}
|
||||||
|
if (einerMinuten == 6) {
|
||||||
|
selectZiffer = 6;
|
||||||
|
}
|
||||||
|
if (einerMinuten == 7) {
|
||||||
|
selectZiffer = 7;
|
||||||
|
}
|
||||||
|
if (einerMinuten == 8) {
|
||||||
|
selectZiffer = 8;
|
||||||
|
}
|
||||||
|
if (einerMinuten == 9) {
|
||||||
|
selectZiffer = 9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BCD Zifferncode
|
||||||
|
|
||||||
|
switch (selectZiffer) {
|
||||||
|
case 0:
|
||||||
|
digitalWrite(bcdA, LOW);
|
||||||
|
digitalWrite(bcdB, LOW);
|
||||||
|
digitalWrite(bcdC, LOW);
|
||||||
|
digitalWrite(bcdD, LOW);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
digitalWrite(bcdA, HIGH);
|
||||||
|
digitalWrite(bcdB, LOW);
|
||||||
|
digitalWrite(bcdC, LOW);
|
||||||
|
digitalWrite(bcdD, LOW);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
digitalWrite(bcdA, LOW);
|
||||||
|
digitalWrite(bcdB, HIGH);
|
||||||
|
digitalWrite(bcdC, LOW);
|
||||||
|
digitalWrite(bcdD, LOW);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
digitalWrite(bcdA, HIGH);
|
||||||
|
digitalWrite(bcdB, HIGH);
|
||||||
|
digitalWrite(bcdC, LOW);
|
||||||
|
digitalWrite(bcdD, LOW);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
digitalWrite(bcdA, LOW);
|
||||||
|
digitalWrite(bcdB, LOW);
|
||||||
|
digitalWrite(bcdC, HIGH);
|
||||||
|
digitalWrite(bcdD, LOW);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
digitalWrite(bcdA, HIGH);
|
||||||
|
digitalWrite(bcdB, LOW);
|
||||||
|
digitalWrite(bcdC, HIGH);
|
||||||
|
digitalWrite(bcdD, LOW);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
digitalWrite(bcdA, LOW);
|
||||||
|
digitalWrite(bcdB, HIGH);
|
||||||
|
digitalWrite(bcdC, HIGH);
|
||||||
|
digitalWrite(bcdD, LOW);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
digitalWrite(bcdA, HIGH);
|
||||||
|
digitalWrite(bcdB, HIGH);
|
||||||
|
digitalWrite(bcdC, HIGH);
|
||||||
|
digitalWrite(bcdD, LOW);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
digitalWrite(bcdA, LOW);
|
||||||
|
digitalWrite(bcdB, LOW);
|
||||||
|
digitalWrite(bcdC, LOW);
|
||||||
|
digitalWrite(bcdD, HIGH);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 9:
|
||||||
|
digitalWrite(bcdA, HIGH);
|
||||||
|
digitalWrite(bcdB, LOW);
|
||||||
|
digitalWrite(bcdC, LOW);
|
||||||
|
digitalWrite(bcdD, HIGH);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unterdrueckung der fuehrenden Null
|
||||||
|
|
||||||
|
if (displayPosition == 1) {
|
||||||
|
if (selectZiffer == 0) {
|
||||||
|
goto noTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delayMicroseconds(2500); //Anschaltzeit der Ziffern
|
||||||
|
|
||||||
|
noTime: {}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (Serial.available()){
|
||||||
|
dcf77HourZehner = Serial.parseInt();
|
||||||
|
dcf77HourEiner = Serial.parseInt();
|
||||||
|
dcf77MinuteZehner = Serial.parseInt();
|
||||||
|
dcf77MinuteEiner = Serial.parseInt();
|
||||||
|
String(DCFzeit) = Serial.readString();
|
||||||
|
|
||||||
|
parityStat = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
initDisplay(); // zeigt die Uhrzeit an
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user