#include // definice io registrů atd #include "Hodiny.h" void DCF(void) { DDRC =0b01111111; PORTC=0xFF; DCF1=(PINC & 0b10000000); //vynulovani cizich hodnot na porte if (DCF1==128) DCF_1=DCF_1++; //pokud je vstup na 0 tak zvětši DCF_1 if (DCF1==0) DCF_0=DCF_0++; //DCF_1 = DCF2 251 if ((DCF1==0) & (DCF4==128)) //doslo ke zmene urovni { if ((DCF_0>=PSD_MIN)&(DCF_0<=PLD_MAX)) //delka mezery je delsi nez minimalni delka pro dvojtou pausu a { //delka mezery je kratsi nez maximalni delka pro dvojtou pausu if (DCF6>=57) //pokud je detekovana dvoujta pausa tak by meli byt prijaty vsechny bity { if (((((HOD_DCF/2)*2)+((PARITA & 0b10000010)>>1))!=HOD_DCF) && (HOD_DCF<24)) //kontrola parity u hodin a hodnoty hodin { if ((((MIN_DCF/2)*2)+(PARITA & 0b10000001))!=MIN_DCF) //kontrola parity u minut { ROK_HOD=ROK_DCF; MES_HOD=MES_DCF; DEN_HOD=DEN_DCF; HOD_HOD=HOD_DCF; MIN_HOD=MIN_DCF; SEK_HOD=0; bb=0; } } } BIT=DCF6=0; DCF_0=1; DCF_1=1; PARITA=0; MIN_DCF=HOD_DCF=DEN_DCF=MES_DCF=ROK_DCF=0; } if ((DCF_1>=SS_MIN)&(DCF_1<=SS_MAX)) //delka impulsu je delsi nez minimalni delka pro impuls 0 a //delka impulsu je delsi nez maximalni delka pro impuls 0 { DCF5=0; //posledni bit je 0 BIT=BIT++; DCF_0=DCF_1=1; } else { if ((DCF_1>=SL_MIN)&(DCF_1<=SL_MAX)) //delka impulsu je delsi nez minimalni delka pro impuls 1 a //delka impulsu je delsi nez maximalni delka pro impuls 1 { DCF5=1; //posledni bit je 1 BIT=BIT++; DCF_1=DCF_0=1; } } DCF6=DCF6+1; //pocitadlo zmen urovni if (DCF5==1) { switch (BIT) { case 15: ANTENA=1;break; //Antena (0b normalní antena, 1b rezervni antena) case 16:;break; //Hlaseni zmeny casove zony 1 hodinu predem (0b nic, 1b zmena) case 17:;break; case 18:;break; case 19:;break; //Hlaseni prestupne sekundy 1 hodinu predem (0b nic, 1b zmena) case 20: PARITA |= 1000;break; //START, zacatek prenosu casove informace (vzdy 1b) case 21: MIN_DCF =MIN_DCF+1;break; //Minuty v BCD kodu case 22: MIN_DCF =MIN_DCF+2;break; case 23: MIN_DCF =MIN_DCF+4;break; case 24: MIN_DCF =MIN_DCF+8;break; case 25: MIN_DCF =MIN_DCF+10;break; case 26: MIN_DCF =MIN_DCF+20;break; case 27: MIN_DCF =MIN_DCF+40;break; case 28: PARITA |= 1 ; break; //Suda parita pro minuty case 29: HOD_DCF =HOD_DCF+1;break; //Hodiny v BCD kodu case 30: HOD_DCF =HOD_DCF+2;break; case 31: HOD_DCF =HOD_DCF+4;break; case 32: HOD_DCF =HOD_DCF+8;break; case 33: HOD_DCF =HOD_DCF+10;break; case 34: HOD_DCF =HOD_DCF+20;break; case 35: PARITA |= 10 ; break; //Suda parita pro hodiny case 36: DEN_DCF =DEN_DCF+1;break; //Den v mesici v BCD kodu case 37: DEN_DCF =DEN_DCF+2;break; case 38: DEN_DCF =DEN_DCF+4;break; case 39: DEN_DCF =DEN_DCF+8;break; case 40: DEN_DCF =DEN_DCF+10;break; case 41: DEN_DCF =DEN_DCF+20;break; case 42: ;break; //Den v tydnu v BCD kodu case 43: ;break; case 44: ;break; case 45: MES_DCF =MES_DCF+1;break; //Mesic v BCD kodu case 46: MES_DCF =MES_DCF+2;break; case 47: MES_DCF =MES_DCF+4;break; case 48: MES_DCF =MES_DCF+8;break; case 49: MES_DCF =MES_DCF+10;break; case 50: ROK_DCF =ROK_DCF+1;break; //Rok v BCD kodu (pouze posledni dve cislice) case 51: ROK_DCF =ROK_DCF+2;break; case 52: ROK_DCF =ROK_DCF+4;break; case 53: ROK_DCF =ROK_DCF+8;break; case 54: ROK_DCF =ROK_DCF+10;break; case 55: ROK_DCF =ROK_DCF+20;break; case 56: ROK_DCF =ROK_DCF+40;break; case 57: ROK_DCF =ROK_DCF+80;break; case 58: PARITA |= 100 ; break; } } } DCF4=DCF1; //zapamatovani posledni hodnoty na portu if (BIT>=220) {BIT=DCF_1=DCF_0=DCF6=0;} //V prenosu dat musela nastat chyba if (DCF_1>=220) {BIT=DCF_1=DCF_0=DCF6=0;} //V prenosu dat musela nastat chyba if (DCF_0>=220) {BIT=DCF_1=DCF_0=DCF6=0;} //V prenosu dat musela nastat chyba }