Que tal amigos, eh estado modificando un codigo que me encontre aqui en la red. Se trata de un menú, en el cual configuro los valores de un control PID, (kp,ki,kd). y por medio de pulsadores configuro estos valores y los pretendo guardar en la memoria EEPROM interna del pic.
Bueno, pues como los valores kp,ki,kd son flotantes hice uso de la libreria internal_eeprom incluida ya en el ccs.
Pues este es mi problema. Si se escriben los valoes, y los leo de igual manera. Pero el problema es que cuando desconecto la energia y quiero configurar el valor de las constantes pid se vuelva como si no se hubieran guardado en la eeprom. Les dejo el programa y la simulacion para que me ayuden. No logro que despues de desconectar la energia se que den guardados los valores de las configuraciones kp,ki,kd.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anexo todos los archivos para su simulacion y codigo en ccs.
Comenten y ayudenme porfavor!
#include <18F4550.h>
#fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBROWNOUT,VREGEN,NOWDT,NOPBADEN,MCLR,NOSTVREN,NOLVP,NODEBUG,NOPROTECT,NOSTVREN,NOCPB,NOWRT,NOWRTC
#use delay(clock=48000000)
#byte pb = 0xF81
#bit t_ok = pb.1
#bit t_mas = pb.2
#bit t_mns = pb.3
#byte intcon3 = 0xFF0
#bit intf1 = intcon3.0
#include <lcd4x20.c>
#include <internal_eeprom.c>
#include <menu.h>
void main()
{
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
read_float_eeprom(KP_EEPROM);
lcd_init();
intf1=0;
enable_interrupts(INT_EXT1);
enable_interrupts(GLOBAL);
while(true)
{
lcd_gotoxy(1,2); printf(lcd_putc,"kp: %f ", read_float_eeprom(KP_EEPROM));
lcd_gotoxy(1,3); printf(lcd_putc,"ki: %f ", read_float_eeprom(KI_EEPROM));
lcd_gotoxy(1,4); printf(lcd_putc,"kd: %f ", read_float_eeprom(KD_EEPROM));
}
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Esta es un alibreria: menu.h
#define KP_EEPROM 100
#define KI_EEPROM 200
#define KD_EEPROM 300
float kp=682.8,ki=68.28,kd=1707;
static unsigned int8 testado,i;
void menu_uno(void);
void menu_dos(void);
void menu_tres(void);
#INT_EXT1
menu()
{
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT1);
delay_ms(300);
testado=0;
lcd_putc("\f");
lcd_gotoxy(1,1); lcd_putc(" MENU PID ");
lcd_gotoxy(1,2); lcd_putc("[1] = Kp [2] = Ki");
lcd_gotoxy(1,3); lcd_putc("[3] = Kd
lcd_gotoxy(1,4); lcd_putc(" Opcion: --> [ ] ");
for(i=0;i!=255;i++) // 5 segundos para pulsar alguna tecla
{
delay_ms(20); lcd_gotoxy(17,4); printf(lcd_putc,"%u",testado);
if (!t_ok){delay_ms(300); break;}
else if (!t_mas){i=0; delay_ms(300); testado++; if(testado>3){testado=0;};}
else if (!t_mns){i=0; delay_ms(300); testado--; if(testado==255){testado=3;};}
};
if(testado==0) // Si la opcion seleccionada es la 0, salimos del menú
{
intf1=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
lcd_putc("\f");
break;
}
else if(testado==1){menu_uno(); lcd_putc("\f");}
else if(testado==2){menu_dos(); lcd_putc("\f");}
else if(testado==3){menu_tres();lcd_putc("\f");}
}
////////////////////////////////////////////////////////////////////////////////
// Submenu 1
//
////////////////////////////////////////////////////////////////////////////////
void menu_uno(void)
{
lcd_putc("\f");
while(t_ok)
{
if (!t_mas) { delay_ms (75); kp=kp+0.1; }
if (!t_mns) { delay_ms (75); kp=kp-0.1; }
write_float_eeprom(KP_EEPROM,kp);
lcd_gotoxy(1,1); printf(lcd_putc,"CONTROL PROPORCIONAL");
lcd_gotoxy(1,3); printf(lcd_putc,"Variable Kp: %f",kp);
intf1=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
}}
////////////////////////////////////////////////////////////////////////////////
// Submenu 2
//
////////////////////////////////////////////////////////////////////////////////
void menu_dos(void)
{
lcd_putc("\f");
while(t_ok)
{
if (!t_mas) { delay_ms (75); ki=ki+0.1; }
if (!t_mns) { delay_ms (75); ki=ki-0.1; }
write_float_eeprom(KI_EEPROM,ki);
lcd_gotoxy(1,1); printf(lcd_putc," CONTROL INTEGRAL ");
lcd_gotoxy(1,3); printf(lcd_putc,"Variable Ki: %f",ki);
intf1=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
}}
////////////////////////////////////////////////////////////////////////////////
// Submenu 3
//
////////////////////////////////////////////////////////////////////////////////
void menu_tres(void)
{
lcd_putc("\f");
while(t_ok)
{
if (!t_mas) { delay_ms (75); kd=kd+0.1; }
if (!t_mns) { delay_ms (75); kd=kd-0.1; }
write_float_eeprom(KD_EEPROM,kd);
lcd_gotoxy(1,1); printf(lcd_putc," CONTROL DERIVARIVO ");
lcd_gotoxy(1,3); printf(lcd_putc,"Variable Kd: %f",kd);
intf1=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
}}
////////////////////////////////////////////////////////////////////////////////
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Anexo los archivos y la simulacion en proteus.
Porfavor comenten y ayudenme!