Ich habe ein EEPROM und speichere Daten darin, von der Adresse 0x00
bis 0xff
. Ich muss das EEPROM regelmäßig auf Werte ungleich Null scannen.
z.B:
address 0x00 0x01 0x02 0x03 0x04......0x0A 0x0B 0x0C.........0xFF
values 0 0 1 1 0 0 1 0 0
Wenn ich eine Scanfunktion ausführe, um die erste Wertadresse zu finden, kann ich dies tun. Aber wie umgehe ich die erste erkannte Adresse ( 0x02
) und finde die nächste Adresse im zweiten Funktionsaufruf?
Hinweis : Wenn wir auf mehr als eine aufeinanderfolgende 1 gestoßen sind, wird die erste Adresse genommen ( 0x02
).
Ich würde mich sehr freuen, wenn Sie eine Technik zur Verfügung stellen, um dies anzugehen.
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);
}
Dies soll beim zweiten Aufruf von 0x04-0xff scannen.
Ich würde mich über Ihren Beitrag freuen, der meinen Fehler korrigiert.
Sie müssen aufeinanderfolgende Einsen finden und aufhören, sobald Sie sie gefunden haben. In Ihrem aktuellen Code lesen Sie das gesamte EEPROM, auch wenn Sie die erforderliche Bedingung finden.
Basisalgorithmus wäre:
1. Beginnen Sie mit der letzten Adresse.
2. EEPROM lesen. Erhöhen Sie einen Zähler, wenn Sie 1 finden, und setzen Sie ihn zurück, wenn Sie 0 finden.
3. Wenn Ihr Zähler während dieses Lesevorgangs jemals über 2 geht, speichern Sie diesen Ort als "letzte Adresse" und beenden Sie die Suche.
Nicht optimierter Code wäre:
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;
}
Das ist grober Code. Es gibt viele Stellen, an denen Verbesserungen möglich sind, und Sie sollten mit Bedingungen umgehen, z. B. wenn im gesamten EEPROM keine aufeinanderfolgenden Einsen vorhanden wären. oder Was ist, wenn Sie mit dem Scannen von Anfang an beginnen möchten, wenn Sie 0xFF erreichen, ohne aufeinanderfolgende 1s zu finden?
PS: Dieser Code enthält Fehler und wir erwarten, dass Sie diese Bedingungen finden und behandeln.
In C könnten Sie eine als " static " deklarierte Variable verwenden , die vom Startcode auf '0' initialisiert wird. Die folgenden Zitate stammen aus der Norm ISO/IEC 9899:1999 (E).
Alle Objekte mit statischer Speicherdauer müssen vor dem Programmstart initialisiert (auf ihre Anfangswerte gesetzt) werden.
Auch der Werterhalt zwischen den Gesprächen ist garantiert.
3 Ein Objekt, dessen Bezeichner mit externer oder interner Verknüpfung oder mit dem Speicherklassenbezeichner static deklariert ist, hat eine statische Speicherdauer. Seine Lebensdauer ist die gesamte Ausführung des Programms und sein gespeicherter Wert wird nur einmal vor dem Programmstart initialisiert.
Schwanand
0x02
to0x05
'1' und 0x06 '0' hat ... Möchten Sie in diesem Fall das Scannen stoppen und zurückkehren0x02
oder das Scannen fortsetzen, bis0xFF
das letzte Auftreten einer solchen Bedingung auftritt, und zurückkehren?Anfänger91
m.Alin
Lundin
m.Alin
Lundin
Lundin
Klatsch
Lundin
Klatsch
m.Alin