//15 11 2003 za�etek - utripanje LED
//18 11 2003 izklopljen LVP, dela displej
//20 11 2003 dela AD
//15 8 2004 predelano za poskus za TBP- stroj za mejenje natega zajle



#include <16f877.H>

#device ADC=10
#use delay(clock=600000)
#fuses XT,NOWDT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOWRT
#zero_ram
#include <stdlib.h>


int i;
int stopinje_cilj;

//***********************************
// RUTINE ZA EEPROM
//-----------------------------------

//--------------
//lokacije v EE
#define SEVER_AD_KONSTANTA 0
#define JUG0_AD_KONSTANTA 2
#define JUG360_AD_KONSTANTA 4
#define SPOMIN1 6
#define SPOMIN2 8
#define SPOMIN3 10
#define SPOMIN4 12
#define SPOMIN5 14
#define SPOMIN6 16


void	Write_2bajta_eeprom(int ee_lokacija,long	stevilo_tmp) {
	  	write_eeprom(ee_lokacija,(BYTE) (stevilo_tmp));
	  	write_eeprom(++ee_lokacija,(BYTE) (stevilo_tmp >> 8));
		}
long	Read_2bajta_eeprom(int ee_lokacija) {
long	stevilo_tmp;
		stevilo_tmp = read_eeprom(ee_lokacija+1);
		stevilo_tmp<<=8; //�ifta levo za osem mest
		stevilo_tmp += read_eeprom(ee_lokacija);
		return (stevilo_tmp);
		}


//***********************************
// KONEC RUTIN ZA EEPROM
//-----------------------------------


//***********************************
// RUTINE ZA AD
//-----------------------------------

long read_adc_30x() {
long vsota,povprecje;
int i;
 vsota=0;
      for(i=0;i<30;++i) {
         delay_ms(6);
         vsota += read_adc();
      }
      povprecje =vsota/30;
      return(povprecje);
    }


long iz_ad_v_stopinje(long ad_vrednost) {
long stopinje,ee_jug0,ee_jug360,ee_sever;
float konst;

      ee_jug0=read_2bajta_eeprom(JUG0_AD_KONSTANTA);
      ee_jug360=read_2bajta_eeprom(JUG360_AD_KONSTANTA);
      ee_sever=read_2bajta_eeprom(SEVER_AD_KONSTANTA);
      if (ad_vrednost>ee_sever) {
         konst=(float)(ee_jug360-ee_sever)/180;
         stopinje= (float)(ad_vrednost-ee_sever)/konst+180;
         }
      else {
         konst=(float)(ee_sever-ee_jug0)/180;
         stopinje= (float)(ad_vrednost-ee_jug0)/konst;
         }

      return(stopinje);
      }

long meri_stopinje() {
   return(iz_ad_v_stopinje(read_adc_30x()));
   }

long stopinje_izpis(long stopinje) {
      if((float)stopinje > (float)180) stopinje=stopinje-180;
      else stopinje=stopinje+180;
      return(stopinje);
}

//***********************************
// KONEC RUTIN ZA AD
//-----------------------------------


//***********************************
// RUTINA ZA KOMUNIKACIJO RS 232 S PC
//-----------------------------------

#use rs232(baud=1200,xmit=pin_c6,rcv=pin_c7)
void komunikacija(void) {
int znak;
float stopinje_za_izpis;


   if(kbhit()) {
         znak=getc();
         putc(znak);
            if (znak=='P') { //�e dobi ukaz  "P ....."
               znak=getc(); //0=sever0st; 128=180st; 255=sever360st
               if(znak == 0) stopinje_cilj = meri_stopinje(); //ustavi rotor P+chr(0)
               else { stopinje_za_izpis = ((float)znak*360.0/254.0)+0.7;
                      if (stopinje_za_izpis < 180) stopinje_cilj=stopinje_za_izpis+180;
                      else stopinje_cilj=stopinje_za_izpis-180;
                    }


               }

            }
        }




//***********************************
// KONEC RUTINA ZA KOMUNIKACIJO RS 232 S PC
//-----------------------------------


#define ZVOK PIN_C5

void pisk(long dolzina) {
long stevec;
 for(stevec=0;stevec<dolzina;stevec++) {
         output_high(ZVOK);
         delay_us(500);
         output_low(ZVOK);
         delay_us(500);
         }
}




/***********/
/* M A I N */
/***********/
main(void) {          		/* za�etek  programa */

long stevec;



int x;
char c;



//INICIALIZACIJA

//++++++++++++
//VR�I VUN vpisovanje v EE druga�e lkalibracijo po vklopu pozabi
//   write_2bajta_eeprom(JUG0_AD_KONSTANTA,0);
//   write_2bajta_eeprom(JUG360_AD_KONSTANTA,1021);
//   write_2bajta_eeprom(SEVER_AD_KONSTANTA,524);




//INICIALIZACIJA

//++++++++++++
//VR�I VUN vpisovanje v EE druga�e lkalibracijo po vklopu pozabi
//   write_2bajta_eeprom(JUG0_AD_KONSTANTA,0);
//   write_2bajta_eeprom(JUG360_AD_KONSTANTA,1021);
//   write_2bajta_eeprom(SEVER_AD_KONSTANTA,524);



          //izklopi releje


         //ANALOGNO DIGITALNI PRETVORNIK
            set_tris_a(0b11111111);
            setup_adc_ports( A_ANALOG );        //analogni vhodi A0,A1,A2,A3,A5
            setup_adc( ADC_CLOCK_INTERNAL );
            set_adc_channel( 0 );
         //DISPLEJ
            set_tris_b(0b11111110);

         //PORT C
            set_tris_c(0b11111111);
          output_high(PIN_C4); //vklop
            for(stevec=0;stevec<3;stevec++) {
         output_high(PIN_C5); //vklop
         delay_ms(1000);
          output_low(PIN_C5); //izklop
         delay_ms(1000);
   //         pisk(100);
            delay_ms(100);
            }

       //  printf("Sprejeto preko RS232!");
      delay_ms(300);
     for(stevec=0;stevec<5;stevec++) {
       //     pisk(100);
            delay_ms(100);
            }



        while (1) {       			/* v neskon�ni zanki */

          //  komunikacija();
          output_high(PIN_B0); //vklop
         delay_ms(1000);
          output_low(PIN_B0); //izklop
         delay_ms(1000);

           }    	/* konec while zanke */
	  }			/* konec funkcije main */