Hallo, ich habe eine SD-Karte am ATMEGA16 über SPI und noch ein anderes Gerät, das mit immer schubweise so 8-10 kByte Daten liefert, die ich auf die SD-Karte schreiben will. Weil der Mega16 ja nicht so viel SRam hat, müßte ich die Daten irgendwo zwischenspeichern - aber wie am Besten? externes RAM? parallel oder seriell? Ich habe noch den PortA und 4 andere Pins frei.. Ich habe schon gedacht, evtl. baue ich mir einen einfachen FIFO mit einem zweiten Mega16 und einem "normalen" RAM - aber geht es auch einfacher?
Die Frage ist wie schnell die Daten kommen. Evtl. geht es auch so. Ersatzweise könnte man ATMega32 oder ATMega644 nehmen. Die haben ein bißchen mehr RAM. Denkbar wäre auch ein FRAM (Ferro RAM). Ist aber teuer.
Naja ich habe es probiert, die SD-Karte schafft es nicht "einfach so". Ich schreibe einfach Sektoren, ohne FAT. Ein bischen besser wird es, wenn man die Sektoren vorher löscht. Zwischen den Datenblöchen a 10KByte ist genug Zeit zum Schreiben.
Irgendwie haben die Megas alle nicht mehr als 8kByte SRAM, und ein bischen Stack und Variablen brauche ich ja auch noch..
Ich würde SPI RAM nehmen, z.B. sowas wie den 23K256. Der wird ähnliche wie die M25Pxx SPI Flashs angesteuert. Das sind bis zu 32kByte in DIL8 oder SO8. Da man das SPI Interface der SD Karte mitbenutzen kann, wird so nur ein weiterer Pin für den CS Anschluss benötigt.
>Naja ich habe es probiert, die SD-Karte schafft es nicht "einfach so".
Tja, diese blöden Busy Zeiten ;) Wo kommen die Daten denn
nun her, und wie schnell? Beim ATMega644 könnte man mit
Doublebuffer von jeweils 1,5kB schon ne Menge machen.
Naja man kann den SRAM eines Megas vergrößern indem man nen externes SRAM anhängt, das kann man dann wie das interne über Pointer ansprechen. Kostet hald ne menge Pins. Einfach mal nach external SRAM beim AVR googlen und im Datenbaltt nachschaun
SPI Ram klingt gut.. Ich hab noch keine Erfahrung mit mehreren SPI-Geräten an gleichen Bus.. die SD-Karte braucht ja immer mal ein paar Clocks, obwohl CS high (inaktiv) ist, z.B. bevor man ein Kommando sendet.. Wird die da bei einem zweiten Gerät nicht durcheinanderkommen, wenn ich dann viel mehr Clocks sende bevor das CS für die SD-Karte auf L geht und das Kommando gesendet wird?
puffer schrieb: > Wird die da bei einem zweiten Gerät nicht durcheinanderkommen, > wenn ich dann viel mehr Clocks sende bevor das CS für die SD-Karte auf L > geht und das Kommando gesendet wird? Sobald CS inaktiv ist, ist der Karte egal was auf dem Bus passiert (abgesehen von den paar zusätzlichen Clocks). Ich betreibe eine SD Karte und einen ENC28J60 Ethernetcontroller am gleichen Bus, läuft absolut problemlos.
Ach ja - gibt es so ähnliche Chips auch in größer? (128K)
Warum nimmste denn nicht einen AVR, der sein RAM-Interface bereits mitbringt, wie den Mega128 und größer? Die neuen XMegas erlauben sogar bis 16MByte externes SRAM. Das Gefrickel an einem Mega16 macht keinen Sinn, zumal einige ausgereifte SD-Karten-Routinen auch einiges an Flash benötigen und zuwenig Pins hat man sowieso auch immer bei den kleineren AVRs. Ach und Du könntest spaßhalber mal das Kommando: MultiBlockWrite bei der SD-Karte ausprobieren, welches deutlichen Geschwindigkeitszuwachs beim Schreiben bringt. Allerdings schützt auch dieses nicht vor gelegentlichen WearLevelling-Busy-Zeiten im Bereich bis 200ms.
@Travel Rec. weil ich schon eine fertige, passende Platine habe für den Mega16 inkl. SD-Slot. Generell hast Du natürlich Recht. Aber die 6 Beinchen für den ext. SPI-RAM sind in meinem Fall einfacher anzulöten, und schnell genug ist es dann auch.
>weil ich schon eine fertige, passende Platine habe für den Mega16
Das ist keine Entschuldigung, wenn das Gerät später nicht oder nur
unzureichend funktioniert.
Moin ! Ist zwar schon länger her, dass ich mal was mit ner SD Karte und nem AVR gemacht habe. Aber damals war ein Atmega32 schon arg knapp bemessen. Die Zeit die du dafür brauchst nen externen RAM rannzufrickeln würd ich eher für ein Redesign der Platine raushauen. Wenn es nicht auf den Euro ankommt, spendier generell für solche Aufgaben lieber nen µC der ne Nummer größer ist. Klar kostet der nen Euro oder 2 Mehr, aber Frickelarbeit aufgrund von Hardwareressourcen die total am Limit sind, kostet dem AG immens Kohle und/oder dir unnötig Nerven ;). Da muss es schon um Centbeträge gehen innerhalb einer Großserienproduktion, damit das Frickeln sich lohnt ;) Falls es sich um ein Hobbyprojekt handelt, gilt das gleiche. Geld sparen durch ausreichend bemessene Hardware. Gruß Rex
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.