Autor Tema: Borrado eeprom 12f629 tras encendido en frio.  (Leído 1536 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Borrado eeprom 12f629 tras encendido en frio.
« en: 13 de Diciembre de 2010, 18:22:40 »
Hola compañeros,
en primer lugar agradecer vuestra ayuda de verdad os lo digo, gracias.
**
Estoy metido en un proyecto que se trata de modificar el software de una placa receptora 433mhz basada en tfa5200 y pic12f629 como decoder, basandome en el hardware original que no puedo tocar, cuando hago pruebas me funciona perfectamente, incluso si le quito la alimentación, el problema viene si lleva varias horas desconectado y conecto, veo que se han borrado datos de la eeprom y tambien me da la impresión que el programa es inestable(pero de esto no estoy seguro).
La calibración del pic es correcta porque la hago con el icd de ccs en cada grabación, la verdad estoy bastante desesperado.
***
Tambien agradeceria consejos de mejora del código, ya que entiendo que es de muy novato :), aunqie hace 2 meses no tenia ni idea de C.
***
#include <12F629.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOCPD                    //No EE protection
#FUSES NOPROTECT                //Code not protected from reading
#FUSES MCLR                     //Master Clear pin enabled
#FUSES PUT                      //Power Up Timer
#FUSES BROWNOUT                //Brownout reset
#FUSES BANDGAP_HIGH         
#FUSES RESERVED                 //Used to set the reserved FUSE bits
#use delay(internal=4000000)
//#use rs232(baud=300,parity=N,xmit=PIN_A1,bits=8)//usado para debud en pruebas anteriores
#byte porta=0x05
#byte trisa=0x85
#use fast_io(a)
#define GP0 PIN_A0
#define GP1 PIN_A1
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4
#define GP5 PIN_A5
#zero_ram
int botondetectado=0;// en la comparacion sera asignado un valor a boton detectado
int flagalarma=1; //estara a 0 cuando se haya pulsado el boton de parada.
int botonant=3;//inicializado a 3 como si fuese a partir de puerta cerrada, boton 3.
void open(void);//función abierto
void close(void);//funcion cerrado
void automatic(void);
void modoalarma(void);//función a realizar en modo alarma
#int_ext
void ext_isr(void)//funcion de interrupción, cada flaco de subida del clock se hara esta función
{
if(flagalarma==0)
{
output_low(pin_a1);
delay_us(16400);
output_high(pin_a1);
delay_us(4100);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(4100);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(8200);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(12200);
output_low(pin_a1);
delay_us(10300);
output_high(pin_a1);
}
else
{
botonant=botondetectado;
switch(botondetectado)
{
case 1:
automatic();
break;
case 2:
open();
break;
case 3:
close();
break;
}
}
}
int lectura();//funcion lectura
int1 detecta(void);//funcion detectar pulso bajo
void memo(int v);//funcion memo, en v se almacenara el valor de leido una vez pulsado memo
void compara(int w);//función compara lectura con datos de eprom para identificar boton
int boton;//inicializamos boton
int boton1,boton2,boton3; //variable numero boton y boton pulsado anterior
int modo=0;//detección de modo, a 255 modo simple, a 0 modo combinado el boton auto es pulsacion si viene de puertas
//cerradas
int1 flagmodo=0;//cuando este a 1 es que se ha pulsado la combinacion auto despues de pce
int leido;

void main()
{
   set_tris_a(0b110100);
   int1 detectado;//recibira el valor del flagdetecta mediante el return de la funcion detecta()
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   set_timer1(0);
   output_high(pin_a0);
   //write_eeprom(0x04,0);//grabamos 0 en la eeprom, modo combinado
   boton1=read_eeprom(0x00);
   delay_ms(6);
   boton2=read_eeprom(0x01);
   delay_ms(6);
   boton3=read_eeprom(0x02);
   delay_ms(6);
   flagalarma=read_eeprom(0x03);//pasamos la lectura del flag de alarma a la variable flag
   delay_ms(6);
   //modo=read_eeprom(0x04);//si no se ha tocado nada la eeprom devolvera 255 que es su estado normal virgen.
   if(bit_test(porta,4)==0) delay_ms(20);//si se ha pulsado el boton antirebote
   if(bit_test(porta,4)==0)
   {
   write_eeprom(0x03,255);//desactivamos alarma
   write_eeprom(0x04,255);//grabamos 255 en la eeprom, modo simple
   output_low(pin_a0);
   delay_ms(2500);
   output_high(pin_a0);
   }
   /*if(bit_test(porta,4)==0)//cambiamos a modo combinado
   {
   write_eeprom(0x04,0);//grabamos 0 en la eeprom, modo combinado
   output_low(pin_a0);
   delay_ms(5000);
   output_high(pin_a0);
   }*/
   while(true)
{
disable_interrupts(int_ext);
disable_interrupts(global);
flagalarma=read_eeprom(0x03);//pasamos la lectura del flag de alarma a la variable flag
if(flagalarma==0) modoalarma();
detectado=detecta();
leido=lectura();//llamamos funcion lectura y cargamos leido con valor y de lectura Return(y)
compara(leido);//llamamos a compara y le enviamos el valor de leido
}
}
int1 detecta(void)
{
int1 flagdetecta; //variable que se pondrá a 1 cuando haya sido detectado
if(flagmodo==1)   //como esta a 1 hacemos pausa de 5seg y se va a la funcion leido donde sin leer nada devolvera como
{                 //si se hubiese pulsado el boton de pce nº3.
delay_ms(6000);
return(flagdetecta);
}
star:
if(bit_test(porta,4)==0) delay_ms(20);
if(bit_test(porta,4)==0)  memo(leido);//va a memorizar si pulsamos memo
set_timer1(0);
while(bit_test(porta,5)==0) //cuando el pulso es bajo, leemos el timer1 para medir el ancho de pulso
{
if(get_timer1()>16300)//retardo para detectar primer pulso largo bajo del mando
{
return(flagdetecta);//devolvemos el 1 de flagdetecta
}
}
goto star;
}
int lectura()
{
if(flagmodo==1)
{
flagmodo=0;
return(boton3);//se devuelve el valor del boton puerta cerrada como si se hubiese pulsado pero sin llegar a leer
}
int codigo[3]={0}; // Array de [3]Bytes, 24bits para la lectura del código boton1, inicializado a 0, importante
int x; //para el for-next y lectura del array
int y;//almacenaremos codigo0+codigo1+codigo2
for(x=0;x<19;x++)//leemos 18bits,
{
delay_us(2900);//retardo para conincidir con el flanco tren de impulsos
shift_left(codigo,3,bit_test(porta,5));//registra lo que entra por portc,0 en los 3 bytes del array código
}
y=codigo[0]+codigo[1]+codigo[2];
set_timer1(0);
output_low(pin_a0);//para encender el led hay que sacar 0
delay_ms(450);
output_high(pin_a0);
return(y);
}
void memo(int v)
{
boton++;//aunmenta una vez cada vez que entra en la funcion
if(boton>3) boton=1;
switch(boton)//depende las veces que se haya pulsado el boton de grabar se graba en una posición distinta
{
case 1:
write_eeprom(0x00,v);//grabamos leido(asignado a V) en la eeprom
boton1=v;
break;
case 2:
write_eeprom(0x01,v);
boton2=v;
break;
case 3:
write_eeprom(0x02,v);
boton3=v;
break;
}
{
output_low(pin_a0);//parpadeo de led para verificar que se ha memorizado.
delay_ms(450);
output_high(pin_a0);
}
}
void compara(int w)
{
if(modo==255)//modo normal
{
if(w==boton1) botondetectado=1;
else if(w==boton2) botondetectado=2;
if(w==boton3) botondetectado=3;
if((w==98)&&(flagalarma==255)) flagalarma=0;//estas 2 lineas cambian el flagalarma de 0 a 255 si se ha pulsado
else if(w==98)flagalarma=255;               //el boton de puerta abierta con la combinacion de parada de puerta
write_eeprom(0x03,flagalarma);//memorizamos eeprom el flag de alarma
enable_interrupts(int_ext);//habilitamos interrupcion exterior deteccion flanco de subida
ext_int_edge(l_to_h);
enable_interrupts(global);
}
else if(modo==0)//modo combinado
{
if((w==boton1)&&(botonant==3))
{
flagmodo=1;//activamos el flag que usaremos en deteccion y lectura
botondetectado=1;
}
else if((w==boton1)&&(botonant==2)) botondetectado=1;
else if(w==boton2) botondetectado=2;
if(w==boton3) botondetectado=3;
if((w==98)&&(flagalarma==255)) flagalarma=0;
else if(w==98)flagalarma=255;
write_eeprom(0x03,flagalarma);//memorizamos eeprom el flag de alarma
enable_interrupts(int_ext);//habilitamos interrupcion exterior deteccion flanco de subida
ext_int_edge(l_to_h);
enable_interrupts(global);
}
}
void automatic(void)
{
output_low(pin_a1);
delay_us(16400);
output_high(pin_a1);
delay_us(4100);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(4100);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(8200);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(8200);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
}
void open(void)
{
output_low(pin_a1);
delay_us(16400);
output_high(pin_a1);
delay_us(4100);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(4100);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(8200);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(12200);
output_low(pin_a1);
delay_us(10300);
output_high(pin_a1);
}
void close(void)
{
output_low(pin_a1);
delay_us(16400);
output_high(pin_a1);
delay_us(4100);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(4100);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(8200);
output_low(pin_a1);
delay_us(4100);
output_high(pin_a1);
delay_us(8200);
output_low(pin_a1);
delay_us(8200);
output_high(pin_a1);
}
void modoalarma(void)
{
enable_interrupts(int_ext);//habilitamos interrupcion exterior deteccion flanco de subida
ext_int_edge(l_to_h);
enable_interrupts(global);
}



 

anything