TConnect:
Du hast ne super coole Website, aber vielleicht bin ich einfach nur zu doof, herauszufinden, was ich als Pinbelegung noch alles setzen muss, damit bei Deinem Scope-Sketch was rauskommt.
Hast Du immer noch Probleme mit Deinem DCF-Modul vom Conrad?
Ist Dein USB-Kabel mitlerweise lang genug, um mit meinem vorherigen Test-Sketch ein vernünftiges Signal zu bekommen?
Hier hätte ich noch einen weiteren "DCF77-Test-Sketch mit Dekodierung von Zeittelegrammen".
Die Signalaufbereitung ist nicht besonders intelligent, aber wenn das Signal ausreichend gut ist, sollte es problemlos funktionieren, wenigstens alle paar Minuten einmal 59 Bits erfolgreich auszulesen und daraus ein vollständiges Zeittelegramm mit Zeit und Datum zu dekodieren.
Im Code brauchst Du nur oben im Quelltext nur einstellen, an welchem PIN das Modul hängt (Conrad-Modul mit PullUp-Widerstand) und ob das Signal invertiert ist oder nicht. Vielleicht probierst Du mal aus, was Du damit bekommst:
#define DCFPIN 8
#define INVERTEDSIGNAL false
#define PULSE_ERRORLIMIT 40 // 40 ms seems to be a suitable value
#define PULSE_SHORTSECOND (1000-PULSE_ERRORLIMIT)
#define PULSE_LONGSECOND (1000+PULSE_ERRORLIMIT)
#define PULSE_MINUTEMARK (2000-PULSE_ERRORLIMIT)
// 8 Bytes = 64 Bits to store all 59 DCF bits in a minute
uint8_t dcfBits[8];
byte dcfBitcount;
boolean parityOK(byte startbit, byte paritybit)
{ // test parity bit in the range startbit ... paritybit-1
byte p=0;
for (int i=startbit; i<=paritybit;i++) p+= bitRead(dcfBits[i/8],i%8);
if (p%2 == 0) return true; // even parity detected
else return false;
}
byte dcfDecodeBCD(byte startbit, byte numbits)
{ // return BCD encoded byte-value beginning at startbit
byte b=0;
for (int i=startbit;i<startbit+numbits;i++) bitWrite(b,i-startbit, bitRead(dcfBits[i/8],i%8));
return b;
}
boolean dcfDecodeTime()
{
int hour, minute, day, month, year;
byte resultCode, parityError=0;
// print bits of time code to serial
for (int i=0;i<dcfBitcount;i++) Serial.print(bitRead(dcfBits[i/8],i%8));
Serial.print('\t');Serial.println(dcfBitcount);
if(!parityOK(21,28)) bitSet(parityError,0); // parity error minute
if(!parityOK(29,35)) bitSet(parityError,1); // parity error hour
if(!parityOK(36,58)) bitSet(parityError,2); // parity error date
hour = 10*dcfDecodeBCD(33,2); // tens of hours, 2 bit
hour += dcfDecodeBCD(29,4); // single hours, 4 bit
minute = 10*dcfDecodeBCD(25,3); // tens of minutes, 3 bit
minute += dcfDecodeBCD(21,4); // single minutes, 4 bit
day = 10*dcfDecodeBCD(40,2); // day of month (tens), 2 bit
day += dcfDecodeBCD(36,4); // day of month (single), 4 bit
month = 10*dcfDecodeBCD(49,1); // tens of month, 1 bit
month += dcfDecodeBCD(45,4); // single digit of month, 4 bit
year = 10*dcfDecodeBCD(54,4); // tens of year, 4 bit
year += dcfDecodeBCD(50,4); // single digit of year, 4 bit
if (dcfBitcount!=59)
{
Serial.println("Error: Time code must contain 59 bits!");
}
else if (parityError)
{
Serial.println("Error: Wrong parity bit detected!");
}
else
{
Serial.print(hour);Serial.print(':');
Serial.print(minute);Serial.print(":00 ");
Serial.print(day);Serial.print('/');
Serial.print(month);Serial.print('/');
Serial.println(year);
dcfBitcount=0;
return true;
}
dcfBitcount=0;
return false;
}
boolean dcfHandleBit(uint16_t hiTime, uint16_t pulseTime)
{
if (dcfBitcount<60)
{
if (hiTime<150) bitClear(dcfBits[dcfBitcount/8],dcfBitcount%8);
else bitSet(dcfBits[dcfBitcount/8],dcfBitcount%8);
dcfBitcount++;
}
if (pulseTime>=PULSE_MINUTEMARK) return dcfDecodeTime();
return false;
}
boolean dcfUpdate()
{
static boolean lastState;
static unsigned long lastChangeTime;
static uint16_t hiMillis,loMillis;
static byte cnt;
boolean state= digitalRead(DCFPIN);
if (INVERTEDSIGNAL) state=!state;
if (state!=lastState)
{
long timeDiff=millis()-lastChangeTime;
lastState=state;
lastChangeTime+= timeDiff;
if (state)
{
cnt++;
loMillis+= timeDiff;
uint16_t pulsetime=hiMillis+loMillis;
if ((pulsetime>=PULSE_SHORTSECOND && pulsetime<=PULSE_LONGSECOND)|| pulsetime>=PULSE_MINUTEMARK)
{
Serial.print(cnt);Serial.print('\t');
Serial.print(hiMillis);Serial.print('\t');
Serial.print(loMillis);Serial.print('\t');
Serial.print(pulsetime);Serial.print('\t');
Serial.println();
boolean result=dcfHandleBit(hiMillis, pulsetime);
hiMillis=0;
loMillis=0;
cnt=0;
return result;
}
}
else hiMillis+= timeDiff;
}
return false;
}
void setup() {
Serial.begin(9600);
Serial.println("DCF77 test sketch by 'jurs'");
pinMode(DCFPIN, INPUT);
}
void loop() {
if (dcfUpdate()) Serial.println("SUCCESS!");
}
Es braucht kein Arduino-Board mit Schwingquarz, sondern es tut jedes beliebige Arduino-Board. Das sollte also eher 'anfängergeeignet' sein als das was Udo als Code anbietet. Aber eine Zeit bekommst Du nur, wenn das Signal aus Deinem DCF-Modul "angemessen gut" ist.
Poste ggf. mal die Programmausgabe auf Serial, wenn es nicht funktioniert!