Hallo zusammen, ich habe mir ein Board gebaut mit einem Atmega32 und Programmiere ihn mit AVRStudio und WinAVR in C über das Programmiergerät AVRISP mkII. Ich möchte ein analoges Signal (1024 Werte oder besser mehr) im Prozessor speichern und später wieder über die UART ausgeben. Mein Problem ist jetzt ich kann nur 999 Werte speichern über einen einfachen Array. Ein Wert benötigt 16 Bit, wegen 10 Bit ADC. Ich hab versucht die Werte im Flash zu speichern. Mit <pgmspace.h> und so wie es im Tutorial steht kann ich einen Array erzeugen und auslesen, aber wie kann ich z.B. den Array im Programm wieder ändern? Oder was würdet Ihr empfehlen zum Speichern von mehreren Werten?
Benjamin, Du kannst aus einem Programm nicht schreibend auf den Flash zugreifen (Ausnahme: Bootloader). Da das interne EEPROM nicht ausreicht, kannst Du ein externes (z.B. 24CXX am TWI) benutzen, das ist wahrscheinlich die einfachste Lösung. Gruss, Thorsten
Du könntest die Daten auch packen. Das gibt dann beim Lesen und Schreiben einen Mehraufwand, weil du die Werte zusammen- und später wieder auseinanderfriemeln mußt, aber dafür kannst du mehr speichern. Wenn du jeden Wert mit 16 Bit speicherst, hast du fast 40% des Speichers verschwendet.
Man kann durchaus in den internen AVR Flash-Speicher "loggen". Dazu müssen lediglich die Anweisungen, die den Flash-Speicher beschreiben in der Boot-Section abgelegt werden (ja, die ist nicht nur für Bootloader verwendbar). Falls die Logger-Anwendung kompakt ist, kann man diese komplett in der Boot-Section unterbringen. Atmel bietet dazu auch eine Application-Note inkl. Beispielsoftware (allerdings für IAR-EWAVR, sollte aber nicht allzuschwer auf avr-gcc/avr-libc/boot.h anpassbar sein). Alternativen z.B.: I2C/SPI-EEprom (schon geannt), FRAM, Dataflash od. ST Serial-flash etc., SD-Karte/MMC, "batteriegepuffertes" RAM.
Was soll mit den Daten denn geschehen ? Falls Du Meßwerte auch mit dem PC weiterverarbeiten möchtest, bietet sich die SD-Card Lösung an. Einfach Karte ziehen und in den Cardreader des PC einstecken. Bei der Größe der Speicherkarten sind dann (fast) keine Grenzen gesetzt.
Das Board ist Teil meiner Studienarbeit und ich wollte nun das vorhandene Board nicht umändern und kann dadurch keine weitere Peripherie anschließen. Die Daten sollen mit dem PC bearbeitet werden, aber da ich keine weiteren Schnittstellen auf dem Bord intrgriert habe, nur für ein LCD und RS232, ist das ein wenig doof. :( In meiner Auswertung der Studienarbeit werde ich das berücksichtigen. Danke für Eure Vorschläge!
an Martin: wo finde ich denn die Application-Note inkl. Beispielsoftware? Hast Du das mal ausprobiert?
Benjamin, eine weitere Möglichkeit wäre es, statt dem Mega32 einen Mega644 zu verwenden. Der ist pinkompatibel zum 32er, hat aber doppelt so viel RAM und EEPROM. Wenn Du einen gesockelten DIL benutzt, ist das wahrscheinlich die schnellste Lösung (Achtung: der 644 wird erst ab gcc 4.2 unterstützt, ansonsten heisst es patchen). Gruss, Thorsten
>wo finde ich denn die Application-Note inkl. Beispielsoftware? atmel.com AVR106 Erstmal den Betreuer darauf "festnageln", wie viele Daten wirklich maximal geloggt werden sollen. Sonst fehlt die wichtigste Vorgabe für einen Logger. Mglw. kann man durch geschicktes zusammenpacken und Sicherung von Differenzen auch mit dem vorhandenen RAM oder EEPROM-Speicher auskommen. Mit dem vorgeschlagenen ATmega644 kann man sich etwas "Luft" verschaffen aber so richtig "viel" Platz hat man dann dennoch nicht in RAM und EEPROM. >Achtung: der 644 wird erst ab gcc 4.2 unterstützt, >ansonsten heisst es patchen Falls ein MS Windows OS im Einsatz: bei WinAVR 1/07 schon alles "vorgekaut" und man muss das nicht selbst machen. Darin enthaltener gepatchter GCC 4.1.1 funktioniert hier problemlos mit ATmega644 und ATmega644P.
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.