#include <16f887.h>				//pic a utilizar 			
#device  *=16 ADC=10;
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT	//ordenes para el programador 
#use delay (clock=4000000)			//Fosc=4Mhz
//#use fast_io(B)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, FORCE_SW)	//manejo del RS232

#include <24256.c>                        //libreria eeprom 24LC256
#include <lcdflex.c>
#include <STDLIB.H>
#include <ds1307.c>
#byte trisA=0x85
#byte portA=0x05
#byte trisb=0x86
#byte portb=0x06
#byte option_reg=0x81    

long i;
int dir=0;
int temp=0;
int adress1=0;
float const resoluc=5.0/1024.0;
unsigned int16 rref=0;
long value=0; 
float vref=0;
float tvolt=0;
int min,hr,sec,day,mth,year,dow;


//// atencion de interrupcion

 #int_timer0             //la siguiente funcin tiene que ser la de interrupcin del TMR0
void timer0_isr(void)    //function interrupcin TMR0
{

write_ext_eeprom (dir++,value); 
write_ext_eeprom (dir++,(value>>8)); 
write_ext_eeprom (dir++,hr); 
write_ext_eeprom (dir++,min);
write_ext_eeprom (dir++,day);
write_ext_eeprom (dir++,mth); 
   
set_timer0(0xF1); //inicializa el timer
}  


/////////////PROGRAMA  PRICIPAL////////////////////////

void main(void)

	{
		
		//configuro puerto A PinA4 como entrada
     
        bit_clear(option_reg,7);     // habilitacion de pull-up
        bit_set(trisA,4);            // A4 como entrada
		//configuro puerto B 
         trisb=0x00;            //puerto b como salida
        //bit_clear(portb,4);    // apago sealizacion
        portb=0x00;            //apago las salidas del puertob

		
		
        //configuro conversor para lectura analogica
        
         setup_adc(ADC_CLOCK_INTERNAL);  
         set_tris_a(0xff);
         lcd_init();
         delay_ms(6);   
         setup_adc_ports( 0x0000);  //configuro al conversor entre VSS y VDD    
		 set_adc_channel(3);      //para leer el canal 3 
		 rref=read_adc();
		 setup_adc_ports(0x1000);//configuro al conversor entre vss y vref
		 set_adc_channel(4); //para leer el canal 4 del sensor 
		
		// configuro rtc
		
  ds1307_init(DS1307_ALL_DISABLED);
  ds1307_init(DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);   
  ds1307_set_date_time(day,mth,year,dow,hr,min,sec);
  ds1307_set_date_time(27,01,10,4,14,10,0);  	
		
	
	delay_ms(6);
	printf(lcd_putc,"select menu PC",);
	puts(" -------------------------");
	puts("   1-> Leer eeprom externa");
	puts("   2-> Mostrar hora y temperatura ");
	
	
        
	
        while (TRUE){	//bucle...
		
			
				switch(getc()){		//coge tecla
			case '1':   
                              
                    lcd_gotoxy(1,1);
		            printf(lcd_putc,"enviando datos ",);
		            
		            adress1=0;
		          
                    for(i=0; i<=0x7fff;i++)
                    {
                    printf("Byte %lu=%2u\n\r",i,read_ext_eeprom(adress1++));
                    }
                    puts ("fin de lectura"); 


						break;
			case '2':	
			///configuro int_timer0
		
		  setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_4);
          setup_counters(RTCC_EXT_L_TO_H,RTCC_DIV_4);
          enable_interrupts(int_timer0);
          enable_interrupts(GLOBAL);

          set_TIMER0(0xF1); //inicializa el timer0	     
	while(TRUE)
		{
	
		
			
			
			
		 value=read_adc();
		
		//calculos
		
		 vref=rref*resoluc;
                 //tvolt=valor*resoluc;
       tvolt=value*vref/1024;
       temp=(tvolt*1000-500)/10; 
			
	
       /////////////////se lee rtc
 
 delay_ms(10);

 ds1307_get_date(day,mth,year,dow);        /// se obtiene la fecha  
 ds1307_get_time(hr,min,sec);             /// se obtiene la hora

       //////////////escribo las variables en la ext eprom
 

     ///////////////////////////////visualizacion
	   
	   delay_ms(100);  
	   lcd_gotoxy(1,1);
	   printf(lcd_putc,"%02d/%02d/%02d ",day,mth,year);// por lcd fecha
	   //printf(lcd_putc,"vref:%2.1f ",vref);
	   lcd_gotoxy(10,1);
	   printf(lcd_putc,"uv:  ");
	   lcd_gotoxy(1,2);
	   //printf(lcd_putc,"tvolt: %f ",tvolt);
	   printf(lcd_putc,"%02d:%02d:%02d ",hr,min,sec); // por lcd hora
	   lcd_gotoxy(11,2);
	   printf(lcd_putc,"T: %2.0d  ",temp);
	   printf("%2.0d \n\r",temp);//  A la pc hiperterminal
	   //printf("%2.0lu\n\r",value);
	   if(dir==0x7fff) dir=0;
	    }  
       }        
 
       						break;
	     
			}
		//}		//...infinito
}
