/*
** ===================================================================
** Název souboru   : Dekodovani DCF 
** Mikrokontroler  : ATmega16
** Popis           : 
**
** Autor           : 
** Poslední změna  : 
** ===================================================================
*/

#include <avr/io.h>			// hlavickovy soubor pro mikrokontroler ATmega16
#define F_CPU 6144000UL		// frekvence hodinového signálu (nutné pro delay.h)
#include <util/delay.h>     // hlavickovy soubor pro zpoždění
#include <stdio.h>			// standardní i/o knihovna (nutné pro sprintf)
#include "lcd_h.h"          // hlavickovy soubor pro obsluhu lcd
#include "Hodiny.h" 
#include <avr/interrupt.h>;
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
	}