Fahrrad Kettenschaltung Schaltgeschwindigkeit messen: Flash Schreibalgorithmus
von
am 25.01.2018 um 18:10 (2042 Hits)
Hallo,
um die Meßdaten auf dem AT45DB041B Flash zu speichern zu können, bin ich nun dabei, folgenden Ablauf auszuprobieren.
- Die einzelnen ADC-Messungen einer Meßreihe sollen im Abstand von 100µs stattfinden
- Pro Messung fällt nur ein Byte an Daten an.
- Eine Meßreihe soll einen Schaltvorgang mit dem Schaltwerk darstellen können, der nicht länger als 200ms dauert.
- Es sind also etwa 2000 Byte in 200ms im Flash zu speichern.
- Die Flash-Speicherzellen im AT45DB041B können als pages zu je 264 Bytes gelöscht und geschrieben werden.
- Der AT45DB041B hat zwei Buffer mit je 264Byte, die abwechselnd sehr schnell beschrieben werden können (max. 20MHz SPI-Takt), während der Inhalt des jeweils anderen in den Haupspeicher geflashed werden kann.
- Einen Buffer in eine Hauptspeicherseite zu flashen dauert max. 20ms, wenn der Befehl "Buffer to Main Memory Page Program with Built-in Erase" gewählt wird.
- In der 20ms Flashzeit können in dem zweiten Buffer also 200 Meßwerte vom ADC, die ja alle 0,1ms anfallen, gesammelt werden und bei gefülltem Buffer geflasht werden. Ich werde vorerst nur 256 der 264 Byte der Page- bzw Buffergröße nutzen.
Um immer andere Speicherzellen des Flashs zu nutzen, möchte ich pro forma ein einfaches Wear-Levelling realisieren. Dazu hatte ich mal einen thread eröffnet und von den vielen komplizierten Möglichkeiten mal eine einfache realisiert.
Vermutlich wird meine Kettenschaltung schon zu Staub zerfallen sein, bevor ich beim Nutzen immer der gleichen Speicherzellen ein defekten Flash bekomme.
- Egal, es wird nun immer die folgende Page einer neu aufgenommenen und geflashten Meßreihe gelöscht und diese enthält dann 264 mal 0xFF.
- Die nächste zu flashende Meßreihe überschreibt diese EndOfMeßreihe Page mit Meßdaten und die folgenden weiteren 7 Pages. Die neunte Page wird dann wieder gelöscht.
- Die 0xFF Page kann vorm Lesen bzw. Schreiben der Daten sehr schnell durch Scannen aufgefunden werden. Zum Scanzeitpunkt finden keine zeitkritischen Aktionen statt.
- Dadurch, daß eine Meßreihe immer 8 Pages Daten enthält, kann beim Auslesen von der 0xFF Pages auch einfach auf den Anfang der Meßreihe zurückgerechnet werden.
- Eine abgespeicherte Meßreihe besteht also aus 8 Pages mit je 256 Bytes Daten = 2048 Byte für 204,8ms Meßzeit und der neunten Page mit den 264 Byte 0xFF
Bei den 2048 Pages Speicherkapazität ist man also nach 256 Meßreihen einmal rum und das Flashen geht bei page 0 wieder von vorne los.
Die Schreibroutinen sind bereits im Entwurf fertig und getestet. Ich wollte herausfinden, ob zwischen den ADC-Messungen es möglich ist, die Daten trotz der ganzen Page- und Schreibverwaltung schnell genug zum Flash zu senden. Nach 256 Messungen muß ein Kommando zum Buffer flashen und Wiederbeschreiben des Buffers abgesetzt werden. Die beiden Befehle mit je 4 Byte dauern zusammen mit einem Datenbyte und der Page- und Byteverwaltung bei mir im Augenblick 21µs. Um ein einzelnes Datenbyte zu senden ohne zu flashen zum Buffer zu senden gibt es verschiedene Varianten. Ich habe mich für eine längere entschieden, die ca. 12µs dauert.
Das Senden soll aus der ADC-ISR, die den Meßwert abholt, heraus passieren. Der Rest der ADC-ISR darf also nicht mehr als ca 79µs dauern um den folgenden Meßwert vom ADC abzuholen, der ja seit Aufruf der ADC-ISR nach 100µs wieder ansteht.
Das sollte zu schaffen sein
Als nächstes die Ausleseroutine(n) und dann noch ADC-ISR Überarbeitung :zitter: