Autor Tema: Problemas con la memoria RAM, alguna alternativa?  (Leído 2570 veces)

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

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Problemas con la memoria RAM, alguna alternativa?
« en: 14 de Noviembre de 2011, 12:34:27 »
Hola a todos, les comento que he tenido problemas al almacenar datos en la memoria ram de un 16f1939, describo mi problema:

necesito guardar 600 datos al inicio de un programa y despues los uso para compararlos contra lecturas que hago desde los puertos paralelos, el problema que tengo es que al inicio del programa inicializo todas mis variables con 0x00 por ejemplo y cuando corro el programa y leo los datos desde mis variables para compararlos la comparacion no me sale, ahora esto solo me pasa cuando comparo contra un valor guardado en mis vectores que ya inicialice, en cambio si lo comparo contra un valor constante, por ejemplo 0x00 si hace bien la comparacion.

lo que supongo es que los datos que guardo en la ram se borran o algo les pasa.

alguna otra teoria, u otra solucion para guardar tantos datos?

De antemano agradezco su ayuda ;-)
"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #1 en: 14 de Noviembre de 2011, 12:48:03 »
De borrarse mientras se mantiene con alimentación, en un ambiente controlado (sin ruido), no creo  :tongue: Ahora, que pises esos valores, que la inicialización no se correcta o que trates de forma incorrecta las variables (o el compilador) puede ser. Coloca código para ver algo.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #2 en: 14 de Noviembre de 2011, 13:00:30 »
Código: [Seleccionar]
/*
PROGRAMA PARA LOS 3 PICS ESCLAVOS, ESTOS SOLO LEEN LOS SENSORES EN LOS PUERTOS A,B,C y D.
SI LA LECTURA ES IGUAL A LO GUARDADO SE PRENDE EL PIN E0 PARA INDICAR QUE SE PUEDE CONTINUAR CON EL ESCANEO
*/
#include <16f1939.h>
#DEVICE ADC=10;
#FUSES   INTRC_IO,NOWDT,NOPUT,NOMCLR,PROTECT,NOCLKOUT,PLL,NOLVP
#USE DELAY(clock=32M, INT=8M)
//#USE RS232(BAUD=115200,XMIT=PIN_C6,RCV=PIN_C7)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#define  ok_led         pin_e0//bit para indicar que la lectura fue correcta(output)
#define  enable         pin_e1//bit para continuar con las lecturas(input)
#define  save           pin_e2//bit para guardar los datos leidos(input)
#define  reset          pin_e3//bit para reiniciar el la variable n_lectura y empezar un nuevo escaneo
#define  muestras       150
#define  t1_2ms         49500//valor del timer 1 para generar interrupcion cada 2ms
unsigned int datos_a[muestras],datos_b[muestras],datos_c[muestras],datos_d[muestras];//vectores para guardar todos los datos
unsigned int cont=0,n_lectura=0;//contador para saber el numero de interrupciones ocurridas y variable para saber el numero de lecturas en las que se encuentra
unsigned int leds[4];
int1 pol_f=0;//bandera para enviar a la funcion para polarizar los leds en inversa
int1 rs_f=0;//bandera para enviar a la funcion para leer y guardar los datos
int1 rc_f=0;//bandera para enviar a la funcion para leer y comparar los datos
int1 pause_f=1;//bandera para poner en pausa las lecturas, se inicia en 1 para que el pic este parado hasta recibir las instrucciones de incio
void polarizar()//funcion para polarizar en inversa los leds y para
{
      pol_f=0;
      //se ponen como salidas todos los puertos
      set_tris_a(0);
      set_tris_b(0);
      set_tris_c(0);
      set_tris_d(0);         
      //se polarizan todos los leds en inversa
      output_a(0xFF);
      output_b(0xFF);
      output_c(0xFF);
      output_d(0xFF);
         
}
void read_save()//funcion para leer y guardar los datos de los pixeles
{
   rs_f=0;
   datos_a[n_lectura]=input_a();
   datos_b[n_lectura]=input_b();
   datos_c[n_lectura]=input_c();
   datos_d[n_lectura]=input_d();
   output_high(ok_led);
   //n_lectura=0;//tambien se inicializa el valor del conteo   
}
void read_compare()//funcion para leer y comparar los estados de las entradas con los guardados
{
   rc_f=0;
   leds[0]=input_a();
   leds[1]=input_b();
   leds[2]=input_c();
   leds[3]=input_d();
   //cuando hay incidencia de luz se descargan mas rapido, por lo que los que esten en cero estan detectando luz         
   //se compara el valor leido contra el numero de lectura correspondiente
 
     if(//si todos son iguales
      leds[0]==datos_a[n_lectura]&&
      leds[1]==datos_b[n_lectura]&&
      leds[2]==datos_c[n_lectura]&&
      leds[3]==datos_d[n_lectura]
      )output_high(ok_led);//se prende un led para indicar que se puede continuar
   else output_low(ok_led);
}
/*
case 1
case 12
case 13
*/
#int_timer1
void change()
{
  cont++;
  set_timer1(t1_2ms);//valor del timer para que la interrupcion sea cada 2 ms
  switch(cont)
  {
      case 1://en la primera interrupcion
         pol_f=1;     
         output_low(ok_led);//se apaga el led de la comparacion
         break;
      case 2:
         //se ponen como entrada todos los puertos
         set_tris_a(0xFF);
         set_tris_b(0xFF);
         set_tris_c(0xFF);
         set_tris_d(0xFF); 
         break;
      case 3://despues de 11 interrupciones(22 ms despues) se leen los puertos para saber si hay o no incidencia de luz
         if(input(save))rs_f=1;//si esta activo el boton para guardar se envia a la funcion de guardar
         else rc_f=1;//si no, entonces se vana a comparar los datos               
         break;
      case 4:
         cont=0;//se hace 0 el contador         
         n_lectura++;//se incrementa el contador
         disable_interrupts(int_timer1);//se deshabilitan las interrupciones hasta que se indique que se puede continuar
         pause_f=1;//se habilita la bandera de pausa para
         break;
  }
}

void config()
{   
   int i;
   setup_adc(adc_off);
   setup_adc_ports(no_analogs);//ningun puerto analogigo   
   set_tris_a(0);//puertos A:D como salidas
   set_tris_b(0);
   set_tris_c(0);
   set_tris_d(0);
   set_tris_e(0b00001110);//solo se pone como salida el pin e0
   output_a(0);//todos los pines en 0
   output_b(0);
   output_c(0);
   output_d(0);
   set_tris_e(0b00001110);//solo se pone como salida el pin e0
   for(i=0;i<muestras;i++)
   {

      datos_a[i]=0x00;
      datos_b[i]=0x00;
      datos_c[i]=0x00;
      datos_d[i]=0x00;
     
   }
}
void main()
{
   config();
   
   setup_timer_1(t1_internal|t1_div_by_1);   
   enable_interrupts(global); 
   disable_interrupts(int_timer1);//al prender el pic no hara nada hasta que no reciba las instrucciones de "enable" y de "reset" al mismo tiempo
   
   while(true)
   {     
      if(pol_f)polarizar();//se envia a polarizar los leds
      if(rs_f)read_save();//se lee y se guarda
      if(rc_f)read_compare();//se lee y se compara
      if(pause_f && input(enable))//el pic esta en pausa hasta que reciba la instruccion de enable
      {
            pause_f=0;//se borra la bandera
            if(input(reset))n_lectura=0;//si se recibe la señal de reset se reinicia n_lectura para hacer un nuevo escaneo
            set_timer1(t1_2ms);//se inicializa el timer para que genere interrupcion cada 2[ms]
            enable_interrupts(int_timer1); //se habilitan las interrupciones de nuevo           
           
      }
     
   }   
}




ese es mi codigo, como veraz, en la funcion de config inicializo mis vectores, y en la funcion read_compare hago la comparacion y no funciona, en cambio si pongo

Código: [Seleccionar]
if(//si todos son iguales
      leds[0]==0x00&&
      leds[1]==0x00&&
      leds[2]==0x00&&
      leds[3]==0x00
      )output_high(ok_led);//se prende un led para indicar que se puede continuar



funciona bien, no se porque.

lo nombres son muy largos, se borra la ram estando con alimentacion? :?, el motor me borra la ram pero no resetea el pic? :? :?, no las inicializo bien?, no se :(
"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #3 en: 14 de Noviembre de 2011, 13:18:25 »
En el if sería bueno utilizar paréntesis y hacerlo en una sola linea, para facilitarle la tarea al analizador sintáctico del compilador. O sea:

if(()&&()&&()&&()){

}


La inicialización es correcta, no usas punteros sino indices, así que no hay por donde perderse  :tongue:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #4 en: 14 de Noviembre de 2011, 13:22:10 »
pues yo tampoco le encuentro donde se pierde, pero la comparacion no me funciona.

probare con lo que mencionas y regreso para contar como me fue, Gracias Suky
"Nada es imposible, no si puedes imaginarlo"

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #5 en: 14 de Noviembre de 2011, 13:27:00 »
Hola, tal vez el propio micro qeu usas tengo algún bloque RAM defectuoso, al arrancar escriba mal los datos y se joda todo, has probado a usar otro PIC (no modelo si no el micro), quizá así saques algo en claro. He estado viendo el datasheet y tiene 1k de RAM, pero porque no pruebas (por probar solo) a definir 100 muestras o menos a ver que pasa.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #6 en: 14 de Noviembre de 2011, 13:30:58 »
nose exactamente como trabaja el CCS, pero si usas int, y luego pones =0x00 puede que solo te borre el byte bajo, prueba a poner 0x0000, aun asi te recomiendo, por ahorro de memoria ram y rom que declares todo como int8, o char, ya que input_x retorna 8bits unicamente, y estas trabajando con 16bits.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #7 en: 14 de Noviembre de 2011, 13:38:29 »
Hola, tal vez el propio micro qeu usas tengo algún bloque RAM defectuoso, al arrancar escriba mal los datos y se joda todo, has probado a usar otro PIC (no modelo si no el micro), quizá así saques algo en claro. He estado viendo el datasheet y tiene 1k de RAM, pero porque no pruebas (por probar solo) a definir 100 muestras o menos a ver que pasa.

tengo 5 pic conectados exactamente igual, todos con el mismo programa y en ninguno funciono, probare con menos valores como dices a ver que pasa




nose exactamente como trabaja el CCS, pero si usas int, y luego pones =0x00 puede que solo te borre el byte bajo, prueba a poner 0x0000, aun asi te recomiendo, por ahorro de memoria ram y rom que declares todo como int8, o char, ya que input_x retorna 8bits unicamente, y estas trabajando con 16bits.


en ccs el int es de 8 bits, y lo declaro como unsigned int para evitarme problemas.


otra opcion que pense fue guardarlo en la rom, ya que solo uso el 3%, pero no se si sea buena opcion, ademas me quedaria con la duda de porque no funcion asi :mrgreen:
« Última modificación: 14 de Noviembre de 2011, 13:44:31 por rivale »
"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #8 en: 14 de Noviembre de 2011, 13:43:44 »
nose exactamente como trabaja el CCS, pero si usas int, y luego pones =0x00 puede que solo te borre el byte bajo, prueba a poner 0x0000

Eso no es necesario en ningún compilador  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #9 en: 14 de Noviembre de 2011, 14:12:33 »
el caso es que con el C30 me ocurrio un caso relacionado con eso, osea puse solo 0x00, como me gusta ver que codigo asm genera para ver como optimiza vi que solo borraba el ultimo byte, osea en un int usaba clr.b y mov.b, luego puse 0x0000 y usaba clr.w y mov.w, yo mismo me sorprendi, no recuerdo a que variable le ocurrio, he intentado simularlo para ponertelo pero no lo he conseguido. Por eso dije que quizas al ccs le pase algo asi, pero bajo mi desconocimiento pues nidea.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #10 en: 14 de Noviembre de 2011, 14:21:57 »
el caso es que con el C30 me ocurrio un caso relacionado con eso, osea puse solo 0x00, como me gusta ver que codigo asm genera para ver como optimiza vi que solo borraba el ultimo byte, osea en un int usaba clr.b y mov.b, luego puse 0x0000 y usaba clr.w y mov.w, yo mismo me sorprendi, no recuerdo a que variable le ocurrio, he intentado simularlo para ponertelo pero no lo he conseguido. Por eso dije que quizas al ccs le pase algo asi, pero bajo mi desconocimiento pues nidea.

En la optimización default de C30 eso no ocurre, lo he usado muchas veces, habría que ver las otras opciones de optimización  :tongue:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #11 en: 14 de Noviembre de 2011, 14:27:54 »
la verdad esq la optimizacion default es una kaka, para hacer por ejemplo un TMR6=0; hace 3-4 lineas, sin embargo en la optimizacion 's' te hace 2 lineas unicamente, y no hablemos de multiplicar o dividir, te hace como 15 lineas, y en optimizacion 's' 5lineas

Tambien otra cosa que me he dado cuenta es que si por ejemplo limpias 5 registros en una funcion, hace unicamente un clr.w y luego a cada variable un mov.w, cuando con la default hace un clr.w y mov.w por cada variable.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #12 en: 14 de Noviembre de 2011, 14:30:53 »
Estoy de acuerdo, pero no es el tema en este caso.. Podes abrir un tema al respecto, como para no desviar demasiado el tema principal  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas con la memoria RAM, alguna alternativa?
« Respuesta #13 en: 14 de Noviembre de 2011, 16:09:50 »
Estoy de acuerdo, pero no es el tema en este caso.. Podes abrir un tema al respecto, como para no desviar demasiado el tema principal  ;-)

Saludos!

jeje, aunque es interezante lo que menciona Merlinz, concuerdo con Suky
"Nada es imposible, no si puedes imaginarlo"