#define F_CPU 16000000UL  // 16 MHz frekvence mikroprocesoru
//#define atmega8
#define atmega168
//obecne knihovny, viz: WinAVR-20081205->avr-libc Manual [WinAVR]
#include <util/delay.h>
#include <stdio.h> 
#include <stdlib.h> 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <ctype.h>
#include <math.h>
#include <avr/pgmspace.h> 

//vlastni knihovny
#include "init.h"    		//inicializacni funkce
#include "ovladani.h"  		//filtry, regulatory, merici a vystupni funkce
#include "komunikace.h"     //komunikacni protokol
#include "enkoder.h"
//#include "klouzavy_prumer.h"	//filtr
//#include "regulaceBosch.h"



//**********************      main        **********************
int main () {

//	  ******************* inicializace *******************


	cli();			//globalne vypne vsechna preruseni
	USART_Init(7);//1 odpovida baud 62500 pri 1MHz/ baud 500 000 pri 16MHz
				  //7 odpovida baud 125 000 pri 16MHz
	Timer0_init();//inicializace timeru pro hlavni casovou smycku
	sei();			//globalne zapne vsechna preruseni


//    ******************* // inicializace *******************




//********************      nekonecna smycka        **********************
	while(1){


		if(cas_tmr>=Vvzorkovani)	//Vvzorkovani....nastavene vzorkovani [ms]
		{


			if (Vstop)		//celkove zastaveni cinnosti
			{//dodelat ukazatel na funkci pro stopnuty rezim
			}
			else		//pokud neni celkovy stop:
			{
			}


				{	//	_________________    hlavni beh programu: _________________
			
				//(1)
				if (povoleno.merit)	
					{merit();}      //zmeri vybranou velicinu

			
				//(2)
				if (povoleno.filtr)
				{uint8_t i=0;
						//spousti vybrane filtry
						while(kfiltrovani[i]){povelf[kfiltrovani[i]].fce();i++;}
						}
			
				//(3)
				if (tmrRegulace>=prescRegulace){  //zpomaluje regulaci
				//pro kazdy "prescRegulace" cyklus provede:
					if (povoleno.regulovat)
						{regulace();}		//spusti vybranou regulaci
				  	  else
						{setpwm(0);}		//bez regulace nastavi vystup na 0

					if (povoleno.vystup)
						{setpwm(Vpwm);}		//nastavi vystup dle typu H-mustku

					tmrRegulace=0;
					}
					else tmrRegulace++; //zvysuje se o 1 kazdym cyklem

			
				//(4)
				if (tmrOdesilat>=prescOdesilat){  //zpomaluje odesilani hodnot
					tmrOdesilat=0;
					if (povoleno.odesilat)
						{uint8_t i=0;
						//prochazi a posila vsechny vybrane data k odeslani
						while(kodeslani[i]){povelm[kodeslani[i]].fce();i++;}
						}
					}else tmrOdesilat++; //zvysuje se o 1 kazdym cyklem


				}//	_________________    //hlavni beh programu: _________________

		cpu=cas_tmr;
		cas_tmr=0;	//vynulovani, preruseni pote samo incrementuje zase od 0
		}//konec preruseni

		
	smycka();			// smycka zprav, vyrizuje prikazy z PC

	}
//********************   nekonecna smycka konec   **********************
return(0);}
//********************      konec main        **********************
