hallo ich habe ein Programm auf einem atmega2560 laufen, was 3 Schrittmotoren steuert, basierend auf einer Wertetabelle von rund 100kb. bisher sende ich die Daten permanent seriell von einem PC, der sie aus txt-Datei ausliest. ich will das System jetzt umbauen, das es ohne PC auskommt. das heißt die Daten sollen direkt auf dem atmega gespeichert sein. theoretisch hat er ja genug Speicherplatz, aber funktioniert das auch praktisch, das ich da so viele Werte abspeichere? wie würdet ihr das machen? wie bekomme ich die Daten am besten im Programm abrufbar, und wo soll ich sie speichern?
Du musst deine Daten im Flash ablegen (in BASCOM z.B. mit DATA, in Assembler mit .db). Dann kannst Du sie mit LPM (ASM) / READ (BASCOM) wieder laden. Nennt sich auch Look-Up-Table. Mach am besten mal das AVR-Tutorial durch, da wird das alles erklärt. Gruß Jonathan
Bzw für C siehe http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29. Alternativ könntest du die Daten ja auch z.B. auf eine SD Karte o.Ä. schreiben und diese dann per SPI auslesen. Dann tuts auch ein kleinerer µC, sofern du nicht die zusätzliche Peripherie des Atmega2560 brauchst.
100k Lookuptable ist etwas arg viel. Ich wuerd da nochmals drueber und versuchen eine Funktion zu fitten. Anstelle des internen Flash waere auch ein Atmel Datenflash zB ein AT45DB321 oder so moeglich. Ich haette allerdings Angst dass die Tabelle nicht mehr genuegen koennte. Dann benoetigt man einen Bootloader falls die Daten im internen Flash liegen oder ein paar Zeilen Code falls sie im externen Flash liegen. Den Bootloader wurd ich in jedem Fall haben wollen, denn allenfalls muss man das Programm auch neu laden.
danke für die antworten! Ich probiere es jetzt mit einem arduino mega 2560. ich brauche 3 Timer für die Schrittmotor Ansteuerung, deshalb brauche ich eh den großen atmega. für arduino gibt es eine progmem Bibliothek, die es ermöglicht Variablen in den Programmspeicher zu schreiben. mal sehen ob das funktioniert.
Hey, die Lookup-Table scheint mir etwas arg gross. Wofür genau wird sie denn verwendet? ggf. kann man noch einiges rausholen. Grüße - Christoph
es sind Schrittwerte für die Schrittmotoren, die in int gespeichert werden. anordnen werde ich es in einem 3d array. einen int pro wert brauche ich, da gibt es glaube ich nicht mehr so viel zu kürzen. (es waren mal über 500kb bevor ich "aufgeräumt" habe)
Warum nicht ein I2C EEPROM (128KiB) verwenden? Dann kann man ein kleineren MC verwenden. Sollte der Speicher nicht reichen, kann man mit einem weiteren EEPROM den Speicher erweitern. Falls mit 5V der MC betrieben wird, ist die EEPROMs ohne Spannungswandlung zu verwenden. Den AT45DB321 oä würde ich bei Schaltungen bis 3.6V verwenden, da man mehr Speicher fürs Geld bekommt, als bei EEPROMs. Ein "riesen" MC mit vielen Pins zu verwenden um 3 Schrittmotoren zu steuern würde ich mir nochmal überlegen. Meine Lösung wäre ein ATMEGA8 und EEPROMS bei 5V oder ATMEGA8L (oder 8A) und Datenflash.
Ich frag mich, warum ihr ihm das ausreden wollt, Speicher ist doch genug da, die Hardware steht und ihr macht tausend Vorschläge von Dataflash über EPROM und wahrscheinlich kommt gleich noch die SD Karte.
1 | static const unsigned char MotorWerte[102400] PROGMEM = { 0x00, 0x01, 0x02,....... } |
Wird so wohl nich mehr funktionieren, irgendwo ist Schluss bei der Anzahl der Inhalte eines Arrays. Gelesen wird mit pgm_read_byte, word, ... Schreib dir deine Werte in mehrere Tabellen und Handle die Auflösung ungefähr so, dass du die Werte gleichmässig aufteilst und dann mit ein paar if's schaust, wie gross ist der index-Wert und in welcher Tabelle steckt es dann.
Klaus Wachtler schrieb: > Der avr-gcc kann m.W. nur Felder bis 64k anlegen. Schrieb ich ja, dass irgendwo Schluss ist. 64k wäre ein sinnvoller Wert in Verbindung mit einerm 16bit Datenpointer.
ich hatte ja auch nicht widersprochen, nur zu "irgendwo" die Zahl geliefert :-)
Klaus Wachtler schrieb: > ich hatte ja auch nicht widersprochen, nur zu "irgendwo" die Zahl > geliefert :-) ... und ich wollte dir nicht wiedersprechen, nur das mit dem Datenpointer loswerden ;)
Nur um (vielleicht) das letzte Wort zu haben, muß ich natürlich hier schon wieder *wider*sprechen :-))
Aber ich wi*e*derspreche dir da ausnahmsweise mal, diesmal habe ich das letzte Wort, obs falsch geschrieben ist, oder nicht :)
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.