#include <16F877.h>
#fuses NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOPROTECT,HS,NOWRT,NODEBUG
#include "math.h"
#use delay(clock=8000000)
#use fast_io(B)             ///   con esta instruccion evitamos que
                           ///   se este configurando cada vez que usamos
#use fast_io(a)            ///   alguna instruccion de entrada o salida
#use fast_io(c)
#byte portb = 6            //    se definen las direcciones de memoria
#byte porta = 5
#byte portc = 7
#DEFINE LED DELAY_MS(1)     // se define el tiempo de retardo para ahorrar memoria
#define use_portb_lcd TRUE
#include "lcd.c"

//definimos constantes
const int escala=127;      //aqui ponemos la mitad de la escala (255/2)
const int v_max=220;       //aqui la tension maxima de la red
const float amp_shunt=0.544;    //aqui la multiplicacion del valor amplificado y la resistencia shunt (2000*0.000272)
const int v_5=5;           //el valor de tension con el que funciona el CAD

void borra_lcd(){
lcd_putc("\f");}  // Con esta funcion borramos el lcd

float valor_consigno(int valor){ //esta funcion sirve para conseguir el valor pedido con su correspondinete signo
float aux1=0, aux2=0;            //Sin esta funcion, los valores negativos no saldrian como tales en el LCD.
if(valor>escala){
aux1=valor-(escala+1);}
else{
aux2=escala-valor;
aux1=-aux2;}
return(aux1);}


void main() {

int volt, amp, i=0, cont=0;
float a, v, p, aux=0, cont_aux_a=0, hold_a=0, cont_aux_v=0, hold_v=0, pot=0;
long duty_PWM;

lcd_init();
/*setup_timer_2(T2_DIV_BY_4,99,1);  //(4/8000000)*4*(99+1)=0.0002seg, que es el periodo necesario para el PWM
setup_CCP1(CCP_PWM);
duty_PWM=400; //EL duty va a ser la mitad del periodo: 0.0001/(4/8000000)=200*/

set_tris_a(0xff);           // se configura el puerto A como entrada
set_tris_b(0x00);          // y el puero B como salida
set_tris_c(0x00);

SETUP_ADC(ADC_CLOCK_DIV_32);      // configuras esto para que el a/d funcione con un reloj interno del micro
SETUP_ADC_PORTS(AN0_AN1_VREF_VREF);
//SET_PWM1_DUTY(duty_PWM);

uno:
DELAY_MS(10);
SET_ADC_CHANNEL(0);                          // con esto fijas el canal con el qeu trabajas, en este caso 0 por el RA0
volt=READ_ADC();
v=((valor_consigno(volt))*v_max)/escala;

DELAY_MS(10);
SET_ADC_CHANNEL(1);                          // aqui se empezaria a recoger la seņal de corriente
amp=READ_ADC();
a=((valor_consigno(amp))*v_5)/(amp_shunt*escala);


p=v*a;
/*aux=aux+p;
i++;
pot=aux/i;*/


if(p<0){portc=0x01;}
else{portc=0x00;}


/*if(cont_aux_a>a){                                 //aqui hacemos un contador para que cuente hasta el valor mayor, y se quede ahi.
hold_a=cont_aux_a;
cont_aux_a=a;
a=hold_a;}                                        //aqui termina el contador
cont_aux_a=a;

if(cont_aux_v>v){                                 //aqui hacemos un contador para que cuente hasta el valor mayor, y se quede ahi.
hold_v=cont_aux_v;
cont_aux_v=v;
v=hold_v;}                                        //aqui termina el contador
cont_aux_v=v;*/

borra_lcd();
printf(lcd_putc,"V:%f",v);
lcd_gotoxy(1,2);
printf(lcd_putc,"I:%f",a);
led;
goto uno;}
