Ich verwende C18-Compiler und 24LC256 EEPROM. Ich würde gerne wissen, wie man Rollover- Fälle in Bezug auf große EEPROM-Schreibvorgänge handhabt. Ich schreibe eine Routine, die jede halbe Stunde 120 Bytes schreibt, und ich würde gerne wissen, wie ich meine Daten so einfach wie Page Write speichern kann Nehmen Sie nur 5 ms, was einem einzelnen Schreibvorgang entspricht. Die Seitengröße beträgt hier 64 Bytes. Und ich muss 10 Stunden lang schreiben, was 2,4 KB Speicherplatz pro Tag ergibt.
Nun, das Problem, das ich habe, ist:
1. Ich möchte Page Write effizient nutzen und Rollover-Bedingungen verhindern. Die Seitengröße beginnt bei 0-63, 64-127, 128-191, 192-255 ... bis zu 32 KB. Ich möchte vorhersagen, wann das Seitenlimit kommt, und möchte, dass sich der Seitenschreibvorgang entsprechend verschiebt.
zB: Wenn ich mit der 0. Adresse beginne: 0-63 belegen 64 Bytes und 64-117 belegen die nächsten 56 Bytes. Dann kann ich für das nächste Seitenschreiben nur 20 Stellen schreiben und muss 64 und 20 in zwei weiteren Seitenschreiboperationen schreiben.
Hinweis: Es ist nicht erforderlich, Startseitenpositionen für jeden Seitenschreibvorgang festzulegen.
Page write operations are limited to writing
bytes within a single physical page,
regardless of the number of bytes actually
being written. Physical page boundaries
start at addresses that are integer
multiples of the page buffer size (or ‘page
size’) and end at addresses that are
integer multiples of [page size - 1]. If a
Page Write command attempts to write
across a physical page boundary, the
result is that the data wraps around to the
beginning of the current page (overwriting
data previously stored there), instead of
being written to the next page, as might be
expected. It is, therefore, necessary for the
application software to prevent page write
operations that would attempt to cross a
page boundary
Ich habe versucht, einen Algorithmus dafür zu finden. Es wäre äußerst hilfreich, wenn Sie dieses Problem lösen oder Ihre Erkenntnisse vorschlagen würden.
Grüße
Arookie
Was Wouter van Ooijen vorgeschlagen hat, macht absolut Sinn.
Das sollte funktionieren
uint8_t page_counter=0;
uint8_t data_counter=0;
uint8_t last_used_address=0;
while(data_counter<120) // we want to write 120 bytes
{
send_eeprom_address(last_used_address);
while((page_counter++)<64) // while not end of page
{
write_eeprom_byte(y);
if (++data_counter==120) break; // exit the loop is 120 bytes have been written
}
last_used_address= last_used_address + page_counter; // update last used location
if(page_counter==64) page_counter=0;
}
Der Code ist ungetestet, und Sie müssen offensichtlich die richtigen Eeprom-Funktionen implementieren.
Wouter van Ooijen
Anfänger91
Wouter van Ooijen
Anfänger91
alexan_e
Anfänger91