#include <16f877.h> //pic a utilizar
#device adc=8
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT //ordenes. para el programador
#use delay (clock=20000000)
const int dx=10;
static int Vk,Ik,dV,dI,V,I;
int D;
//setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
void main()
{
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_4,249,1);
// COMIENZO
// Lecturas
setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
//setup_adc(ADC_CLOCK_DIV_2); //antigua setup_adc(ADC_CLOCK_DIV_32);
set_tris_a(0xff);
set_tris_b(0);
SETUP_ADC(ADC_CLOCK_INTERNAL); // configuras esto para que el a/d funcione con un reloj interno del micro
//SETUP_ADC_PORTS(AN0); // aca determianr que el puerto RA0 será analógico
//SET_ADC_CHANNEL(0);
//set_tris_a(0xff);
while(TRUE)
{
set_adc_channel(0);
delay_us(20);
Vk = (int)read_adc(); // Vk e Ik son el valor actual
delay_us(50);
output_b(Vk); // lee el canal analogico seleccionado anteriormente, y lo uestra el en puerto b
delay_us(20);
set_adc_channel(1);
delay_us(20);
Ik = (int)read_adc();
delay_us(50);
dV = Vk - V; // V e I son el valor anterior
dI = Ik - I;
if(dV == 0)
{
if(dI != 0)
{
if(dI > 0)
{
D = D + dx;
}
else
{
D = D - dx;
}
}
else
{
if(dI/dV != -(Ik/Vk))
{
if(dI/dV > -(Ik/Vk))
{
D = D + dx;
}
else
{
D = D - dx;
}
}
}
V = Vk;
I = Ik;
set_pwm1_duty(D);
delay_ms(1);
}
}
}