Forum: Mikrocontroller und Digitale Elektronik AVR mit Display - verschiedene Menu-Sprachen


von Jens (Gast)


Lesenswert?

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

von rogger (Gast)


Lesenswert?

wie wärs mit einem zweidimensionalen Array?
So mache ich das öfters.
rogger

von Jens (Gast)


Lesenswert?

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 ...

von Karl H. (kbuchegg)


Lesenswert?

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?

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Codevision-Nutzer (Gast)


Lesenswert?

>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.

von Jens (Gast)


Lesenswert?

also ich verwende das Atmel AVR Studio bzw. damit den Win AVR Compiler

im Flash habe ich viel Platz, weil ATmega256

von Karl H. (kbuchegg)


Lesenswert?

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

von Thomas B. (escamoteur)


Lesenswert?

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

von AED (Gast)


Lesenswert?

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

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von AED (Gast)


Lesenswert?

Hast Du natürlich recht.
Ich war in Gedanken bei TLV Strukturen.

von Thomas B. (escamoteur)


Lesenswert?

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

von Hammerhead (Gast)


Lesenswert?

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