Algoritmo para encontrar los siguientes datos en eeprom [cerrado]

1

Tengo una EEPROM y estoy almacenando datos en ella, desde la dirección 0x00 a 0xff . Tengo que escanear la EEPROM regularmente en busca de valores que no sean cero.

por ejemplo:

address  0x00 0x01 0x02 0x03 0x04......0x0A 0x0B 0x0C.........0xFF
values    0    0    1    1    0          0    1   0             0 

Si hago una función de escaneo para encontrar la primera dirección de valor, puedo hacerlo. Pero, ¿cómo omitiré la primera dirección detectada ( 0x02 ) y encontraré la siguiente dirección en la segunda llamada de la función?

Nota : si encontramos más de un 1 consecutivo, se toma la primera dirección ( 0x02 ).

Estaré extremadamente feliz si proporcionas alguna técnica para abordar esto.

int scaneeprom(void)
{ static unsigned int x,
  static unsigned int counter;

for(i=0+counter; i<255;i++)
 {
     while((eepromread(i++)!)==0)
 {
      x=i;
      counter++;
}     

 return(i);

}
  

Se supone que esto debe escanear desde 0x04-0xff en la segunda llamada.

Apreciaría sus comentarios que rectificarán mi error.

    
pregunta Rookie91

2 respuestas

4

Necesitas encontrar 1s consecutivos y detenerte una vez que lo encuentres. En su código actual, está leyendo la EEPROM completa incluso si encuentra la condición requerida.

El algoritmo básico sería:

1. Comience desde la última dirección.

2.Lee EEPROM. Incrementa un contador si encuentras 1 y restablece eso si encuentras 0.

3.Durante esta lectura, si su contador va más de 2, almacene esa ubicación como "última dirección" y detenga la búsqueda.

El código no optimizado sería:

unsigned char Eepromscan(void)
{
    unsigned char loopcnt = 0;
    unsigned char onecount = 0;
    unsigned char addr = 0; //We will store start address of 1's here
    static unsigned char lastAddr = 0;

    //If lastAddr is already overflowing, reset it
    if(lastAddr >= 0xFF)
      {
         lastAddr = 0;
      }
    for(loopcnt = lastAddr; loopcnt < 0xFF; loopcnt++)
      {
           addr = loopcnt; //This is start location of our scanning
          while(eepromread(loopcnt++) != 0)
            {
                onecount++;  //Count the 1's we got!
            }

            if(onecount > 1)
             {
                 //There are multiple 1s... WooHoo!
                 // And These 1s start at "addr" and end at current location "loopcnt"

                 lastAddr = loopcnt; //Next time,We will start scanning from here.
                 break;
             }
      }

     return addr;
}

Este es un código en bruto. Hay muchos lugares para mejorar, además, debe manejar condiciones como, por ejemplo, si no hubiera 1s consecutivos en toda la EEPROM. o Qué sucede si desea comenzar a escanear desde el inicio cuando alcanza 0xFF sin encontrar 1s consecutivos.

P.S. Este código tiene errores y esperamos que encuentre esas condiciones y las maneje.

    
respondido por el Swanand
3

En C puede usar una variable declarada como " static ", que se inicializará en '0' con la código de inicio Las citas a continuación corresponden a la norma ISO / IEC 9899: 1999 (E).

  

Todos los objetos con duración de almacenamiento estático se inicializarán (configurados en   sus valores iniciales) antes del inicio del programa.

También se garantiza que conservará su valor entre las llamadas.

  

3 un objeto cuyo identificador se declara con externo o interno   vinculación, o con el especificador estático de clase de almacenamiento tiene almacenamiento estático   duración. Su duración es toda la ejecución del programa y su   el valor almacenado se inicializa solo una vez, antes del inicio del programa.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas