Hallo Leute, also ich grübel seit geraumer Zeit über ein für mich großes Problem. Mein ATmega256 soll ein Display in verschiedenen Sprachen bedienen. Stellt der Benutzer auf Englisch, so soll alles in Englisch angezeigt werden, analog in Deutsch. Nun habe ich mich verschiedene Lösungen überlegt, allerdings ist jede eine Krücke. Methode a: ich lege für jede Displayausgabe eine Deutsche bzw. Englische Konstante an z.B. const char text1_d[] = "Ausgabe"; bzw. const char text1_d[] = "output"; und abhängig einer if-Abfrage wird die eine oder andere Variable ausgegeben. Allerdings wird das ruck zuck unübersichtlich Methode b: ich lege ein Array an z.B. const char text1[] = "Ausgabe output "; und abhängig einer if-Abfrage gebe ich den ersten oder den zweiten Teil des Arrays aus. Das wiederrum könnte meinen Arbeitsspeicher schnell sprengen. Hat jemand eine praktikable Idee? Danke vorab. Jens
wie wärs mit einem zweidimensionalen Array? So mache ich das öfters. rogger
ja zweidimensionales Arry ist die Optimierung der Variante b, allerdings steht dann doch immer alles im Ram oder sehe ich das flasch? Und genau da sehe ich das Problem, wenn der µC auch noch die SD-Karte bedienen und seine Messaufgaben abwarten soll. Es gibt sicher eine viel elegantere Möglichkeit, nur wissen wie ist mal wieder Problem ...
Jens schrieb: > ja zweidimensionales Arry ist die Optimierung der Variante b, allerdings > steht dann doch immer alles im Ram oder sehe ich das flasch? Benutzt du den IAR Compiler (wegen dem const. Beim IAR legt der das dann IMHO ins Flash. Dem gcc ist das const wiederrum sowas von egal. Kommt trotzdem ins SRAM [und natürlich auch ins Flash]) Hast du noch genug Platz im Flash?
Kennst du die "progmem.h"? Die stellt Makros bereit, um Daten aus dem Flash zu lesen. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Array_aus_Strings_im_Flash-Speicher
Karl heinz Buchegger schrieb: > Hast du noch genug Platz im Flash? Das Problem beim 2D Array ist, dass alles Strings dann gleich lang sein müssen. Und das kann unter Umständen auf viele Leerzeichen bzw. unbenutzte Bytes rauslaufen
1 | struct TextEntry |
2 | {
|
3 | const char* German; |
4 | const char* English; |
5 | };
|
6 | |
7 | struct TextEntry Texte[] = |
8 | {
|
9 | { "Menüpunkt 1", "Menu 1" }, |
10 | { "Beenden", "Exit" }, |
11 | ...
|
12 | };
|
Hier hast du die Kosten von 2 zusätzlichen Pointern pro Menüpunkt. Wenn du dir das im Flash erlauben kannst .... Andere Möglichkeit wäre wieder nur 1 Array von Strings zu haben, aber die Sprachtrennung durch ein Sonderzeichen im Text zu realisieren. Diese Methode ist gar nicht mal so schlecht, weil man dann oft mittels Spezialfunktionen ausgeben kann, die sich anhand der Spracheinstellung den richtigen Teil aus dem Text rausholen. D.h. die Umschaltung der Sprache wirkt sich nur in einem kleinen Codeteil aus und ist nicht quer über das komplette Programm verstreut.
>allerdings steht dann doch immer alles im Ram Wer sagt das? Bei CodevisionAVR werden Konstanten direkt aus dem Flash gelesen, ohne erst ins RAM geladen zu werden: "VERY EFFICIENT USE OF RAM: Constant character strings are stored only in FLASH memory and aren't copied to RAM and accessed from there, like in other compilers for the AVR" http://www.hpinfotech.ro/html/cvavr_features.htm Wenn dein Compiler das nicht kann, musst du halt selber eine entsprechende Funktion schreiben oder einen besseren Compiler verwenden.
also ich verwende das Atmel AVR Studio bzw. damit den Win AVR Compiler im Flash habe ich viel Platz, weil ATmega256
Jens schrieb: > also ich verwende das Atmel AVR Studio bzw. damit den Win AVR Compiler > > im Flash habe ich viel Platz, weil ATmega256 Dann würde ich mal damit anfangen die Texte ins Flash zu verlagern. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Array_aus_Strings_im_Flash-Speicher
Wieso eigentlich nicht einfach zwei String-Arrays ( also char**) in einem die englischen, im anderen die deutschen. Am Programmanfang einfach einer Pointervariable über die man ab da auf das Array zugreifen will eines der Arrays zuweisen? Gruß Tom
Karl heinz Buchegger schrieb: > Andere Möglichkeit wäre wieder nur 1 Array von Strings zu haben, aber > > die Sprachtrennung durch ein Sonderzeichen im Text zu realisieren. Karl Heinz hat schon einen sehr guten Ansatz geliefert. Allerdings würde ich ein Stringarray mit "Offset" erstellen. Am Beginn stehen z. B. die deutschen Texte und ab "Offset" die englischen Texte. Bei der Sprachauswahl reicht es dann den Offset zu setzen und du kannst Deinen Texte immer mit Index+Offset lesen. Gruss Eduard
AED schrieb: > Karl Heinz hat schon einen sehr guten Ansatz geliefert. > Allerdings würde ich ein Stringarray mit "Offset" erstellen. > Am Beginn stehen z. B. die deutschen Texte und ab "Offset" die > englischen Texte. Bei der Sprachauswahl reicht es dann den Offset zu > setzen und du kannst Deinen Texte immer mit Index+Offset lesen. > > Gruss Eduard da werden ja ein Haufen Bytes für die Leerzeichen verbraten.
Thomas Burkhart schrieb: > Wieso eigentlich nicht einfach zwei String-Arrays ( also char**) in > einem die englischen, im anderen die deutschen. Am Programmanfang > einfach einer Pointervariable über die man ab da auf das Array zugreifen > will eines der Arrays zuweisen? Prinzipiell ja. Was mir daran nicht gefällt ist, dass die Stringdefinitionen zu Wartungs- und Erweiterungszwecken auseinandergerissen werden. D.h. der zum deutschen gehörende englische Text ist optisch im Code weit, weit weg.
Hast Du natürlich recht. Ich war in Gedanken bei TLV Strukturen.
Karl heinz Buchegger schrieb: > Prinzipiell ja. Was mir daran nicht gefällt ist, dass die > Stringdefinitionen zu Wartungs- und Erweiterungszwecken > auseinandergerissen werden. D.h. der zum deutschen gehörende englische > Text ist optisch im Code weit, weit weg. Das schon, aber wenn man die Konstantendefinitioen beieinander hat und es nicht 100 Texte sind schon handlen. Dafür ist der Zugriff viel klarer und nicht durch die Sprachauswahl verunstaltet. Gruß Tom
Ich hab irgendwo gelesen, dass eine SD-Karte Teil des Projekts ist...warum nicht da einrach eine Datei ablegen, und dann den Controller aus dieser lesen lassen? Dann braucht man sich nicht um den Flash des Controllers zu kümmern. Der zweite vorteil ist, dass man die Texte dann einfacher bearbeiten kann, indem man einfach die Karte in den Rechner steckt (vom rechner lesbares Dateisystem vorausgesetzt) und die Datei bearbeitet, anstatt dem kompletten Quellcode nochmal auf den Controller zu schreiben.
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.