/* ** =================================================================== ** Název souboru : Dekodovani DCF ** Mikrokontroler : ATmega16 ** Popis : ** ** Autor : ** Poslední změna : ** =================================================================== */ #include // hlavickovy soubor pro mikrokontroler ATmega16 #define F_CPU 6144000UL // frekvence hodinového signálu (nutné pro delay.h) #include // hlavickovy soubor pro zpoždění #include // standardní i/o knihovna (nutné pro sprintf) #include "lcd_h.h" // hlavickovy soubor pro obsluhu lcd #include "Hodiny.h" #include ; unsigned SEK_HOD,MIN_HOD,HOD_HOD,DEN_HOD; unsigned LCD_x=0; unsigned SS_MIN, SS_MAX, SL_MIN, SL_MAX; unsigned PS_MIN, PS_MAX, PL_MIN, PL_MAX; unsigned PSD_MIN, PSD_MAX, PLD_MIN, PLD_MAX; char text[11]; unsigned bb,CT0, CT1; /* ** =================================================================== ** Název funkce : main ** ** Popis :Hlavní funkce programu. ** Parametry : žádné ** Výst. hodnota : 1 ... funkce proběhla neúspěšně ** =================================================================== */ int main( void ) { //************************************************ //** Nastaveni promennych pro dekodovani DCF //************************************************ CT1=100; SS_MIN=6; //minimalni delka impulsu pro impuls "0" - 8x10=80msec SS_MAX=14; //maximalni delka impulsu pro impuls "0" - 14x10=140msec SL_MIN=18; //minimalni delka impulsu pro impuls "1" - 18x10=180msec SL_MAX=26; //minimalni delka impulsu pro impuls "1" - 24x10=240msec PS_MIN=CT1-SL_MAX; //minimalni delka mezery pro impuls impuls "1" 760msec PS_MAX=CT1-SL_MIN; //maximalni delka mezery pro impuls impuls "1" 820msec PL_MIN=CT1-SS_MAX; //minimalni delka mezery pro impuls impuls "0" 860msec PL_MAX=CT1-SS_MIN; //minimalni delka mezery pro impuls impuls "0" 920msec PSD_MIN=(2*CT1)-SL_MAX; //minimalni delka mezery pro dvojitou pausu pro posledni puls "1" 1760msec PSD_MAX=(2*CT1)-SL_MIN; //maximalni delka mezery pro dvojitou pausu pro posledni puls "1" 1820msec PLD_MIN=(2*CT1)-SS_MAX; //minimalni delka mezery pro dvojitou pausu pro posledni puls "0" 1860msec PLD_MAX=(2*CT1)-SS_MIN; //maximalni delka mezery pro dvojitou pausu pro posledni puls "0" 1920msec //************************************************ //** Nastaveni casovace Timer/Counter 8-bit //************************************************ TIMSK=0b00000001; //casovac pretece kazdych 10 mS TCCR0=0b00000101; //nastaveni preddelicky casovace TCCR0=f/1024 CT0=196; //CTO=2^8 - (10E-3/(1024/6144000)) TCNT0=CT0; sei(); DDRA=0xFF; Start(); while (1) { if (bb>=100) Hodiny(); //do jedne sekundy je potreba 100 preruseni (1s/10ms=100) lcd_gotoxy((LCD_x),1); sprintf(text,"cas"); lcd_puts(text); LCD_x=(LCD_x+3); lcd_gotoxy(LCD_x,1); sprintf(text," %02d",HOD_HOD); lcd_puts(text); LCD_x=(LCD_x+3); lcd_gotoxy(LCD_x,1); sprintf(text,":%02d",MIN_HOD); lcd_puts(text); LCD_x=(LCD_x+3); lcd_gotoxy(LCD_x,1); sprintf(text,":%02d",SEK_HOD); lcd_puts(text); LCD_x=(LCD_x+5); LCD_x=0; } } //************************************************ //** Obsluha preruseni //************************************************ ISR(TIMER0_OVF_vect) { TCNT0=CT0; bb=bb++; DCF(); } //************************************************ //** Hodiny inkrementace casu //************************************************ void Hodiny(void) { SEK_HOD=SEK_HOD++; bb=0; if (SEK_HOD>=60) { MIN_HOD++; SEK_HOD=0; if(MIN_HOD>=60) { HOD_HOD++; MIN_HOD=0; if (HOD_HOD>=24) { DEN_HOD++; HOD_HOD=0; if (DEN_HOD>=7) { DEN_HOD=0; } } } } } //************************************************ //** Nastaveni LCD //************************************************ void Start(void) { _delay_ms( 16 ) ; // nutné zpoždění lcd_command( 0b00100000 ); // nastavení 4bitové komunikace lcd_command( 0b00101000 ); // nastavení funkce lcd displeje lcd_command( 0b00000100 ); // nastavení směru pohybu kurzoru // nastavení displeje a kurzoru // 0 0 0 0 1 D C B // | | +-- blikání kurzoru; 0: vypnuto; 1: zapnuto // | +---- zapnutí/vypnutí kurzoru; 0: vypnuto; 1: zapnuto // +------ zapnutí/vypnutí displeje; 0: vypnuto; 1: zapnuto // lcd_command( 0b00001... ) ; // nastavení displeje a kurzoru lcd_command( 0b00001101 ); //zapnutý kurzor, display a vypnuté blikání lcd_clrscr() ; // smazání obsahu lcd displeje }