mikrocontroller.net

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


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: rogger (Gast)
Datum:

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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kennst du die "progmem.h"? Die stellt Makros bereit, um Daten aus dem 
Flash zu lesen.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
struct TextEntry
{
  const char* German;
  const char* English;
};

struct TextEntry Texte[] =
  {
   { "Menüpunkt 1", "Menu 1" },
   { "Beenden",     "Exit" },
    ...
  };

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.

Autor: Codevision-Nutzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich verwende das Atmel AVR Studio bzw. damit den Win AVR Compiler

im Flash habe ich viel Platz, weil ATmega256

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AED (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AED (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du natürlich recht.
Ich war in Gedanken bei TLV Strukturen.

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hammerhead (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.