Bitte entschuldigt diesen Code ichhabe alles nur aus den entsprechenden Files gezogen und so gut wie es geht mit Dokus versehen, wenn noch fragen, so keine scheu. Device ist ein ATMEGA16 mit 7,372MHz. Der DCF input ist der ICP- Pin Der Code ist erst mal nur auf Funktion gemacht und birgt noch einiges an Optimirungen. typedef unsigned short u16; typedef unsigned char u08; u08 day=5, hh=22, mm=58, ss=0; // Set Offline Clock by Reset u16 dcfEE, dcfday, dcfhh, dcfmm, dcfst, dcfOldss, dcfOldhh, dcfOldmm, dcfOldday, dcfcb, dcfsync; // Sind Wochentag, Stunde & Minute und Sek. vom DCF u08 dcf[8] = {0,0,1,0,0,0,0,0}; // Dient zur Übergabe der Daten aus dem Interrupt /* dcf[1] Gibt die Position in der Minutenscheibe an 1-59 dcf[2] gibt den zuletzt empfangenen logischen Wert an 0 || 1 dcf[3] gibt die anzahl der korrekten DCF reads an nach letztem Fehlread dcf[4] dcf[5] Counter für Erfolgreiches Minutendecodieren dcf[6] Counter für Erfolgreiches Stundendecodieren dcf[7] Counter für Erfolgreiches Tagedecodieren */ // Interrupt für DCF Empfang #pragma interrupt_handler DCF_inp:6 // Interrupt für OfflineClock #pragma interrupt_handler clock:20 void DCF_inp(void) { //timer 1 input capture event, read (int)value in ICR1 using; dcfL=ICR1L; //Read low byte first (important) dcfH=ICR1H; TCCR1B = 0x00; // Stopp counter TCNT1 = 0; // set Counter to zero TCCR1B |= (1<= 85) dcf[1]++; //Zähle die sekunden Hoch if (dcfH > 200) // kennung für Minutenstart { if (dcfst == 1) //nur wen Checksumme ok und alle Sek gelesen wurden { // dcfst == 0 Kein sync gefunden // dcfst == 1 alles OK gelaufen // dcfst == 2 Checkbit der Minuten ist bei "1" ungültig // dcfst == 3 Checkbit der Stunden ist bei "1" ungültig // dcfst == 4 Checkbit des Datums ist bei "1" ungültig // dcfst == 5 zeigt einen Fehler im decodieren an, keine 0, 1, Sync } dcf[1] = 0; // gibt die Position im Stream an dcf[2] = 0; // gibt den Wert an hier immer "0" // dcfcb = dcfmm = dcfhh = dcfday = 0; // Reset der Decodierten Daten dcfst = 1; // reset der Error Marke } else if ((dcfH >= 99) && (dcfH <= 105) && (dcf[1] >= 1)) { // Timdiff ca. 900ms (103) Neues Bit ist 0 dcf[2] = 0; // setzt bitwert für erkannte logische 0 } else if ((dcfH >= 120) && (dcfH <= 124) && (dcf[1] >= 1)) { // Timdiff ca. 1100ms (122) Neues Bit ist 1 dcf[2] = 1; // setzt bitwert für erkannte logische 1 } else if ((((dcfH >= 125) && (dcfH <= 199)) || ((dcfH >= 10) && (dcfH <= 85))) && ((dcf[1] >= 1) && (dcf[1] <= 57))) { // wenn zwischen Sek 1 und 57 eine Decodierung weder log. 1 or 0 ergibt dcfst = 5;// zeigt einen Fehler im decodieren an keine 0, 1, Sync } } void clock(void) { //increment counter over INT from 8 bit Counter (50 mal je Sek.) s50++; if (s50 == 50) { s50 = 0; ss++; if(ss == 60) { ss = 0; mm++; if(mm == 60) { mm = 0; hh++; if(hh == 24) { hh = 0; day++; if (day == 7) { day = 1; } } } } } } Im Main() ist dan folgendes noch mit drin... if ((dcf[1]) == 0) { //Wenn erste Sek ist, dann Sync wenn dieser OK if ((dcfOldhh == dcfhh) && ((dcfOldmm+1) == dcfmm) && (dcfOldday == dcfday)) {// Sync Offlineclock mit DCF Clock dcf[3]++; // Counter for Ready Decodings if (dcf[3] >= 2) { // gibt an wieviele Datansätze korrekt sein müssen dcfsync++; // Ready-Sync-Counter+1 hh = dcfhh; mm = dcfmm; ss = 0; day = dcfday; dcf[3] = 0; // Del DCF Ready counter } dcfOldhh = dcfhh; dcfOldmm = dcfmm; dcfOldday = dcfday; } else { dcf[3] = 0; // Del DCF Ready counter dcfOldhh = dcfhh; dcfOldmm = dcfmm; dcfOldday = dcfday; } dcfcb = dcfmm = dcfhh = dcfday = 0; // Reset der Decodierten Daten } . . . . . . if ((dcf[1] >= 1) && (dcfst == 1) && (dcfOldss != dcf[1]))// Kein Sek. Sync mit DCF Strem also kein Decodieren { //DCF Decoder dcf[1]= Sekundenposition im DCF Stream. dcf[2] empfangener Wert 1 oder 0 dcfOldss = dcf[1]; //speichert neuen Sek wert in DCFOldss ab // verhindert einen doppelten Einsprung innerhalb 1 Sek // beginn aufzeichnung für Checkbit if ((dcf[1] >= 0) && (dcf[2] == 1)) dcfcb++; // erhöhe um eins, wenn bei Stundenempfang eine logische 1 war // Zählt alle "1" von dcf[1]>=1 bis dcf[1]<=58 // end Aufzeichnung für Checkbit // beginn decoding Minuten if ((dcf[1] >= 21) && (dcf[1] <= 24) && (dcf[2] == 1 )) // hier geht es um die einer Minuten { //wenn es um die Minuten geht und das Bit eins war, so setze es in dcfmm dcfmm = (dcfmm |= (1<<(dcf[1]-21))); // erstellung der einer Minuten } if ((dcf[1] == 25) && (dcf[2] == 1 )) dcfmm += 10; if ((dcf[1] == 26 )&& (dcf[2] == 1 )) dcfmm += 20; if ((dcf[1] == 27) && (dcf[2] == 1 )) dcfmm += 40; // End decoding Minuten // beginn Decoding Stunden if ((dcf[1] >= 29) && (dcf[1] <= 32) && (dcf[2] == 1 )) // hier geht es im die einer Minuten { //wenn es um die Stunden geht und das Bit eins war, so setze es in dcfmm dcfhh = ( dcfhh |= (1<<(dcf[1]-29))); } if ((dcf[1] == 33) && (dcf[2] == 1 )) dcfhh += 10; if ((dcf[1] == 34) && (dcf[2] == 1 )) dcfhh += 20; // end Decoding Stunden // Beginn der Decodierungen if ( (dcf[1] == 28) && (dcfcb & (1<<0)) && (dcfst == 1) ) { //wenn MinutenParitätsbit ungerade und status OK dann setze dcfst auf 2= no OK dcfst = 2; dcf[5]++; // Error counter für Minutendecodierungsfehler } if ((dcf[1] == 35) && (dcfcb & (1<<0)) && (dcfst == 1)) { //wenn StundenParitätsbit ungerade und status OK dann setze dcfst auf 3= no OK dcfst = 3; dcf[6]++; //Error counter für Stundendecodierungsfehler } if ((dcf[1] == 58) && ((dcfcb & (1<<0))) && (dcfst == 1)) {//prüfbit aller einsen bei Empfang der Minutenwerte gerade ist dcfst = 4; // makierung, das Decoding error hatte dcf[7]++; // Errorcounter für Datumsdekodierungfehler } if ((dcf[1] >= 42) && (dcf[1] <= 44) && (dcf[2] == 1 )) // hier geht es im die einer Minuten { //wenn es um die Wochentag geht und das Bit eins war, so setze es in dcfday dcfday = ( dcfday |= (1<<(dcf[1]-42))); } if (((dcf[1] == 20) || (dcf[1] == 28) || (dcf[1] == 35)) && (dcfst == 1)) dcfcb = 0; // löscht die alte Checksumme } // DCF Decodierung ENDE So das sollte alles sein.... ich hoffe nichts vergessen zu haben.