Forum: Mikrocontroller und Digitale Elektronik 100kb Variablen auf ATMEGA2560


von einarm (Gast)


Lesenswert?

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?

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

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

von Christopher G. (cbg)


Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

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.

von einarm (Gast)


Lesenswert?

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.

von Christoph L. (clechner)


Lesenswert?

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

von einarm (Gast)


Lesenswert?

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)

von robibauer (Gast)


Lesenswert?

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.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Der avr-gcc kann m.W. nur Felder bis 64k anlegen.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

ich hatte ja auch nicht widersprochen, nur zu "irgendwo" die Zahl 
geliefert :-)

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

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 ;)

von Klaus W. (mfgkw)


Lesenswert?

Nur um (vielleicht) das letzte Wort zu haben, muß ich natürlich hier 
schon wieder *wider*sprechen :-))

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.