Sonderzeichen LCD HD44780 kompatibel

Gast #3123550
Lesenswert?

Guten Abend!
Ich habe mir mal die Mühe gemacht, die Oktalcodes für die Darstellung 
von einigen Sonderzeichen auf HD44780-kompatiblen-LCD-Displays 
zusammenzustellen. Umlaute kann man damit bei der Verwendung eines 
Arduinos z.B. wie folgt darstellen:

lcd.print("R\365cklauf"); //wird dargestellt als" Rücklauf"
````
\40  !
\41  "
\42  #
\43  $
\44  %
\45  &
\50  (
\51  )
\52  *
\53  Plus-Zeichen
\54  Komma
\55  Minus-Zeichen
\56  Punkt
\57  Schrägstrich
\72  Doppelpunkt
\73  Semikolon
\74  <
\75  Gleichheitszeichen
\76  >
\77  ?
\100  @
\134  eckige Klammer links
\136  eckige Klammer rechts
\137  accent circonflexe
\138  Unterstrich
\140  accent grave
\173  geschweifte Klammer links
\174  senkrechter Strich
\175  geschweifte Klammer rechts
\176  Pfeil nach rechts
\177  Pfeil nach links
\260  Minuszeichen
\333  Kastenrahmen
\337  hochgestellter Kastenrahmen(wie Potenz)
\340  gr. alpha
\341  ä
\342  ß
\343  klein epsilon
\344  µ
\350  Wurzelzeichen
\351  hoch minus 1
\353  hoch x
\356  n mit Oberstrich ( spanisch )
\357  ö
\363  Zeichen unendlich
\364  Ohm
\365  ü
\366  gr.Summe
\367  pi ( klein )
\371  u mit strich rechts unten
\375  geteilt durch
\377  alle Leuchtpunkte eingeschaltet
````
#3123563
Lesenswert?

safran schrieb:
> Guten Abend!
> Ich habe mir mal die Mühe gemacht, die Oktalcodes für die Darstellung
> von einigen Sonderzeichen auf HD44780-kompatiblen-LCD-Displays
> zusammenzustellen.

Die Mühe hättest du dir sparen können.
Entsprechende ASCII-Tabellen sind in jedem LCD-Datenblatt enthalten
bzw. werden mit Google und dem Stichwort "hd44780 zeichensatz" in 2 
Sekunden gefunden

http://de.wikipedia.org/wiki/HD44780#Schrift_und_Zeichensatz
#3123567
Lesenswert?

Karl Heinz Buchegger schrieb:
> safran schrieb:
>> Guten Abend!
>> Ich habe mir mal die Mühe gemacht, die Oktalcodes für die Darstellung
>> von einigen Sonderzeichen auf HD44780-kompatiblen-LCD-Displays
>> zusammenzustellen.
>
> Die Mühe hättest du dir sparen können.
> Entsprechende ASCII-Tabellen sind in jedem LCD-Datenblatt enthalten
> bzw. werden mit Google und dem Stichwort "hd44780 zeichensatz" in 2
> Sekunden gefunden
>
> http://de.wikipedia.org/wiki/HD44780#Schrift_und_Zeichensatz


Entschuldige.
Ich hab ganz übersehen, dass du ja Oktalcodes angegeben hast. Benutzt 
zwar keiner, aber die sind in den Tabellen natürlich nicht enthalten.
#3123591
Lesenswert?

halb so wild.
da macht man sich einmalig eine Ausgabefunktion, die die wichtigsten 
Ersetzungen zb für die Umlaute durchführt und für den Rest ein paar 
#define, die ins Header File für die LCD-Funktionen dazukommen.


#define OHM   "\xF4"

und schreibt dann zb

   lcd.print( "480" OHM );

dann kann man das Ganze sogar im Code direkt lesen :-)
(Firma: matzetronics) #3123927
Lesenswert?

Jobst M. schrieb:
> Die gibt es nämlich mit unterschiedlichen Zeichensätzen ...

Allerdings. Ich drücke euch die Daumen, das ihr nie einen mit ROM 
Kennung B04 bekommt - da hat es einige Zeit gedauert, bis ich die 
richtige Übersetzungstabelle drin hatte, weil da nicht mal die ASCII an 
der richtigen Stelle waren...
Die gebräuchlichsten Versionen sind A00 (ASCII und japanisch) und A02 
(ASCII und europäisch), nachzulesen im Hitachi Datenblatt ab Seite 17.
Gast #4226280
Lesenswert?

Sorry für das alte Foren Posting popup... Aus Aktuellem Anlass:

also ich fand die Tabelle echt hilfreich, hat auf Anhieb funktioniert!!

Mein LCD Display ist von Adafruit, verwendet den I2C Bus und ich steuere 
das Ding mit dem Arduino Mega an.

Vielen Dank für die Mühe!
Gast #4653087
Lesenswert?

Auch wenn der Beitrag zunächst vielleicht unnötig erscheint, mir hat er 
geholfen :D. Da die Ausgabe mit Ascii und UTF-8 vom Arduino nicht 
richtig funktionierte (gab immer ein japanisches Zeichen davor) war ich 
kurz vor dem verzweifeln. Dank deinem Beitrag ging es dann ;)
Gast #4979111
Lesenswert?

Sinnvoll wäre eine Möglichkeit, dem Präprozessor/Compiler beizubringen, 
die Ersetzungen (z.B. ü -> \365) automatisch zur Compilezeit zu machen, 
sodass man Strings ganz einfach so schreiben kann, wie man sie meint. 
Und ohne eine ressourcenfressende Funktion zur Laufzeit bemühen zu 
müssen...
Gast #5198197
Lesenswert?

Hi ich bin auch darüber gestolpert weil mein Hitachi Display die 
Sonderzeichen auch nicht kann :-(

Aaaaber, bei mir funktioniert die Liste garnicht!!

zb sieht das OHM Zeichen wie ein kleines w aus und im Monitorfenster wie 
ein Viereck

und lcd.print("R\365cklauf");
da sieht das ü wie ein "Pfeil nach unten" aus und im Monitorfenster wie 
ein Viereck

Habe Arduino 1.8.5 (die neueste Version)...und alles läuft auf einem 
alten WinXP-Rechner.

Weiß jemand Rat?
#5198202
Lesenswert?

Hi

Das wird damit zusammen hängen, daß der Zeichensatz in Deinem Display 
ein Anderer ist - chinesisch wäre Da ganz groß im Kurs.
Google wird Dir die Zeichentabellen und Deren Unterschiede zeigen 
können.
Wenn Du eine Bezeichnung für Dein Display hast, um so besser.
Sonst musst Du über den verbauten Controller gehen.

MfG

Hmm, eigentlich hätte Es aber funktionieren sollen :/
Passt der verbaute Controller?
Sonst müsste ich Mal nach meinem 'Durchläufe' Beispiel (vor 10 Monaten 
fand ich diesen Thread auch Mal) heraussuchen.
Gast #5199151
Lesenswert?

Was mich etwas irritiert ist das die Umlaute in dem Monitorfenster auch 
nicht angezeigt werden...

Mein controler ist so eine 2 euro china teil, Nano V3 368 auf dem der 
auch gleich der COM3 CH340G drauf ist.
Gast #5217312
Lesenswert?

Hey keiner Antwortet mehr?!
Ok also ich habe festgestellt, das meine Displays nicht die berühmten 
1602 sind (sie sehen optisch nur so aus), deshalb wird für wohl ein 
andere code benötigt werden :-(
Ich habe aus einem LC-Meter das Display ausgebaut und damit 
funktionieren die Umlaute.

Fall geklärt -> ich muß mir jetzt paar neue 1602 besorgen.
Gast #5299987
Lesenswert?

Hi

>Gibt es auch Codes für die Umlaute in Großschreibung?

Für welchen Displaycontroller mit welchem Zeichensatz?

Textdisplays haben die Möglichkeit acht selbst definierte Zeichen 
auszugeben. Das langt normalerweise für 'AÖÜ'.

MfG Spess
Gast #5300019
Lesenswert?

Busy B schrieb:

> Gibt es auch Codes für die Umlaute in Großschreibung?

Das kommt auf das Display an. Typischerweise gibt's ein Datenblatt dazu, 
in dem der oder die Zeichensätze dokumentiert sind. Wenns nur einer ist, 
kannst du also sofort und direkt sehen, welche Glyphen er anbietet und 
über welchen Code diese jeweils zu erreichen sind.

Gibt es mehrere Zeichensätze und weißt du nicht, welcher dieser 
Varianten dein Display entspricht, dann ist die Sache  auch nicht sehr 
viel schwieriger: Du suchst dir einen Code aus, dessen Glyph in jedem 
der möglichen Zeichensätze unterschiedlich aussieht und gibst eben 
diesen Code aus. Aus dem tatsächlich dargestellten Zeichen kannst du 
dann direkt den verwendeten Zeichensatz ermitteln. Wenn du den kennst, 
kannst du wieder die restlichen Codes direkt ablesen.

Kurzfassung: Datenblatt lesen hilft.
#5300174
Lesenswert?

spess53 schrieb:
> Textdisplays haben die Möglichkeit acht selbst definierte Zeichen
> auszugeben. Das langt normalerweise für 'AÖÜ'.

Hi @Spess,

Den Thread kennen wir ja noch. ;-)
Stichwort:

"user defined characters hd44780"

Es sind - wie bekannt - die unbenutzten Fernschreibcode-Steuerzeichen, 
deren Platz (Adressen) man eben noch anderweitig verwenden kann.

Hat nur den Nachteil, dass nach Abschalten der Versorgungsspannung diese 
Charakters verschwinden, und beim "Neustart" jedesmal wieder eine 
Routine durchlaufen werden muss. So seh' ich das jedenfalls.

ciao
gustav
Angehängte Dateien:
Gast #5300305
Lesenswert?

Karl B. schrieb:
> Hat nur den Nachteil, dass nach Abschalten der Versorgungsspannung diese
> Charakters verschwinden, und beim "Neustart" jedesmal wieder eine
> Routine durchlaufen werden muss. So seh' ich das jedenfalls.

Je nachdem wie lange der Strom weg war. Finde ich persönlich übrigens 
die beste Eigenschaft der User-Defined-Characters, da es sich um Ram 
handelt schreibt man es nicht kaputt und das ermöglicht einem eine sehr 
interessante Nutzung, die allerdings fast nirgends erwähnt wird (auch in 
den Tutorials hier auf der Seite nicht).

Normalerweise erzeugt man den Character und gibt diesen im Anschluss auf 
dem Display aus. Damit kann man schöne Bargraph-Anzeigen und ähnliches 
erzeugen, allerdings bei miserabler Auflösung und hoher 
Platzverschwendung.

Es geht aber auch umgekehrt: Character initialisieren, auf das Display 
ausgeben und dann "manipulieren".
Sprich den CGRam beschreiben während der Character bereits angezeigt 
wird. Damit lassen sich dann nette Animationen oder Bargraphs erstellen, 
die eine wesentlich höhere Auflösung haben. Ein senkrechter Bargraph auf 
einem Xx4er LCD kann dann bis zu 5 unterschiedliche Werte mit je einer 
Auflösung von 32 (5x8er Zeichen) Stufen darstellen und kostet nur eine 
Spalte.

Gruß Dominik
#5300456
Lesenswert?

Dominik schrieb:
> und das ermöglicht einem eine sehr
> interessante Nutzung, die allerdings fast nirgends erwähnt wird (auch in
> den Tutorials hier auf der Seite nicht).

OK,
wer suchet, der findet.
Ist zwar schon etwa 2 Jahre her. Sicher noch verbesserungsbedürftig. 
Aber als Quick-and-dirty-Lösung schon einmal nicht ganz verkehrt.
Die "Fallstricke" sind eben in den Screenshots noch kurz angerissen.


Ein Witz im Programm ist, dass in den Tabellen die Nullterminierung 
nicht verwendet wird, sonst könnte man die Null nicht als Pixelwert 
verwenden. Die Tabelle würde da stoppen.

cpi  temp2, 0x09    ; insgesamt achtmal Pixelwerte holen
breq  print_end0  ; wenn 9, dann zu print_end0


ciao
gustav
Angehängte Dateien:
Gast #6310988
Lesenswert?

werner schrieb:
> zwei Jahre später kann man einfach eine entsprechende Library verwenden,
> die die deutschen Umlaute direkt ausgeben kann:

Hi Werner,
bin auf deiner Seite unterwegs gewesen ..., viel/gute Arbeit deine 
Projekt Tutorials!

Kleiner Hinweis zu deinen verwendeten "Timeouts" ...
http://oneweekwonder.blogspot.com/2017/04/sign-up-to-signed-timeouts.html

ich würde mal darüber nachdenken ... :-)!
1
if (millis() - previousMillis > 3 * 1000UL && digitalRead(outputPin) == HIGH)
#6311210
Lesenswert?

Bernd schrieb:
> Sinnvoll wäre eine Möglichkeit, dem Präprozessor/Compiler beizubringen,
> die Ersetzungen (z.B. ü -> \365) automatisch zur Compilezeit zu machen,
> sodass man Strings ganz einfach so schreiben kann, wie man sie meint.
> Und ohne eine ressourcenfressende Funktion zur Laufzeit bemühen zu
> müssen...

Wer den gcc sowieso aus den Quellen selbst baut, kann das einbauen 
(glaube ich; ungetestet, sieht aber einfach aus). In 
src/libiconv-1.xx/HACKING heißt es:
1
Adding new encodings
2
====================
3
For an indication which files need to be modified when adding
4
a new encoding, look for example at the 2007-05-25 ChangeLog
5
entry for RK1048.  The lib/*.h file for an encoding is usually
6
generated by one of the tools in the tools/directory.
7
All you need to provide is the conversion table in the format
8
of the many *.TXT files.
Im wesentlichen ist das eine Tabelle <HD44780-encoding> zu 
<unicode-encoding>. Zum Beispiel ein Ausschnitt aus 
src/libiconv-1.15/tests/ISO-8859-15.TXT, wo das Euro-Zeichen umkodiert 
wird:
1
0xA2    0x00A2
2
0xA3    0x00A3
3
0xA4    0x20AC
4
0xA5    0x00A5
Ganz Faule könnten einfach eine vorhandene Tabelle umbauen, die sonst 
niemand braucht ;)

Mit "-fexec-charset=HD44780-A00" würde man dem gcc sagen, dass er die 
neue Tabelle benutzen soll.
(Firma: TU Chemnitz) #7677147
Lesenswert?

Das mit dem Hack des C-Compilers KANN man machen. Der richtige Weg zur Darstellung von '', '~', Kleinbuchstaben mit Unterlänge (g,j,p,q,y) sowie Umlauten und Sonderzeichen geht NUR mit einer Transkodierung.

Dabei ist zu unterscheiden, ob die 8 selbst definierbaren Zeichen statisch oder dynamisch (also je nach tatsächlicher Anzeige) festgelegt werden.

Und es ist zu unterscheiden, ob die Anzeigestrings parallel auch via serielle Schnittstelle (o.ä.) ausgegeben werden sollen oder nicht.

  • Parallelausgabe seriell: Konvertierung CP1252 oder (moderner aber wegen Multi-Byte komplizierter) UTF-8 in Hitachi-Kode ZUR LAUFZEIT.

  • Keine Parallelausgabe, selbst definierte Zeichen DYNAMISCH: Transkodierung ZUR LAUFZEIT.

  • Keine Parallelausgabe, selbst definierte Zeichen STATISCH: Transkodierung ZUR COMPILEZEIT möglich.

Im folgenden wird der letzte (einfachste) Fall betrachtet.

Für den Programmierer sieht so ein Funktionsaufruf angenehm aus:

1
lcd_puts("tränenüberströmt");

Oder auch

1
int t, // Zehntel °C
2
    r; // Zehn Ω
3
lcd_printf("T =%5,1d °C und R =%5,2d kΩ", t, r);

Zu dem eigenwilligen Formatstring ein anderer Beitrag: "Ein selbst programmiertes printf() mit Komma und Dezimalstellen".

Mit den Mitteln von C++ (ab C++14) ist es endlich möglich, genau dieses zur Compilezeit zu erledigen: Das Transkodieren der Zeichenkette in Hitachi-Codebytes und das Ablegen in den Flash-Speicher. Dreh- und Angelpunkt ist das constexpr-Schlüsselwort.

Als erstes sollte klar sein, dass ein String wie "°C" aus 2 oder 3 Byte bestehen kann, je nachdem ob der Quelltext in ANSI (CP1252) oder UTF-8 gespeichert ist. Standardmäßig nimmt gcc solche Strings /buchstäblich/, und das Ergebnis hängt von der Editor-Codeseite ab!!

Als Konsequenz ist so etwas komplett zu vermeiden!

Portabel aber unschön lesbar sind Hexadezimal- oder Oktal-Ersetzungen wie oben abgegeben. Mehrere Möglichkeiten:

1
"\xDFC" // °C
2
"\xDF" "C"  // nutzt C/C++-Zeichenkettenzusammensetzung
3
"\337C" // °C
4
"\337""C"  // wiederum getrennt, Leerzeichen unnötig
5
#define GRD "\xDF"
6
GRD"C"

Aber genau das will man ja bei einem gut lesbaren Quelltext vermeiden. Zeichenersetzung zur Compilezeit ist SYNTAKTISCHER ZUCKER. Es sollte einem klar sein dass die Ersetzungsroutinen nicht gerade leicht lesbar sind und der Compiler auch mehr Zeit braucht. Zum praktischen Teil ein weiterer Abschnitt.

(Firma: TU Chemnitz) #7677653
Lesenswert?

Zwischendurch ein paar C-Stolperfallen:

  • Woher detektiert der Compiler das Ende des Oktal-Zeichens?

    "\3370" "\33[A" "\0337C"

  • Lösung: Der Compiler liest maximal 3 Ziffern ein und bricht bei der ersten Nicht-Ziffer ab. Was passiert wenn '8' oder '9' angegeben werden ist implementationsabhängig und sollte eine Warnung generieren. Auch was passiert wenn die Oktalzahl größer 255 wird ist implementationsabhängig.

'\0' ist nichts anderes als ein oktal angegebenes Zeichen.

  • Woher detektiert der Compiler das Ende von Hexadezimal-Zeichen?

    "\xak" // = {0x0A,'k'} "\x909" // = {0x90, '9'}

  • Lösung: Genau wie bei Oktalzahlen maximal 2 Ziffern, bei der ersten Nicht-Hexadezimalziffer abbrechend.

  • Von welchem Typ ist der Ausdruck

    "abc"[1]

  • Lösung: Nicht char, sondern (einpauken!!) int.

(Firma: TU Chemnitz) #7677730
Lesenswert?

Die Konvertierroutine kann so aussehen:

1
typedef unsigned char byte; // dem Volk aufs Maul geschaut statt uint8_t
2

3
namespace hd44780{
4
namespace a00{
5
constexpr byte tr(wchar_t wc) {
6
 switch (wc) {
7
  case L'Ä': return 0x11;
8
  case L'Ö': return 0x12;
9
  case L'Ü': return 0x13;
10
  case L'~': return 0x14;
11
  case L'\\': return 0x15;
12
  case L'¥': return 0x5C;
13
  case L'→': return 0x7E;
14
  case L'←': return 0x7F;
15
  case L'°': return 0xDF;
16
  case L'ä': return 0xE1;
17
  case L'ß':
18
  case L'β': return 0xE2;
19
  case L'ε': return 0xE3;
20
  case L'µ': return 0xE4;
21
  case L'ö': return 0xEF;
22
  case L'Ω':
23
  case L'Ω': return 0xF4;
24
  case L'ü': return 0xF5;
25
  case L'÷': return 0xFD;
26
  case L'p':
27
  case L'q': return byte(wc+0x80); // mit Unterlänge
28
 }
29
 return byte(wc);
30
}

Die Verwendung von wchar_t mag erst mal erschrecken. Da die Transkodierung zur Compilezeit stattfindet wird aber kein RAM oder Flash verschwendet. wchar_t (hier: BMP0) sorgt dafür, dass jedes Zeichen gleich breit ist. So ist kein Kuddelmuddel mit der Kodierung des Quelltextes zu erwarten, da gcc automatisch richtig (in UTF-16) transkodiert.

(Firma: TU Chemnitz) #7678574
Lesenswert?

Die Konvertierroutine tr() im vorhergehenden Beitrag mag verwundern, dass 2× auftaucht. Einmal als „Buchstabenartiges Symbol“ (U+2126) und einmal als griechischer Großbuchstabe (U+03A9). Laut Unicode-Standard soll letzteres bevorzugt werden, aber wer weiß das schon?

Jetzt geht's ans Eingemachte: Wie konvertiert man einen String? In C geht das nicht. Hier wohl nicht die beste / eleganteste Methode, aber so habe ich's erst mal gelöst. Noch im Namensraum hd44780::a00:

1
template<size_t N> struct str{
2
  byte a[N] {};  // ohne {} geht's nicht!
3
  constexpr str(const wchar_t s[]) {
4
    for (size_t i=0; i<N; i++) a[i] = tr(s[i]);
5
  }  // Array besetzen
6
  operator const byte*() const {return a;}
7
};

Um die Stringlänge N zu erhalten bin ich über ein #define gegangen:

1
}  // Ende Namensraum hd44780::a00
2
#define A00(s) a00::str<sizeof L##s/2>(L##s)
3
}} // Ende Namensraum HD44780

Um die Bytekette im Flash abzulegen ist dann zu schreiben:

1
static const auto PROGMEM mystr = hd44780::A00("tränenüberströmt");

Das Schlüsselwort auto erlaubt das Trennen von Variablenname und Konstruktor. Der Compiler eliminiert dabei den Kopierkonstruktor =. Das #define pappt das L an den String voran, dass man's nicht vergisst.

Um darauf (lesend) zuzugreifen kann man in etwa schreiben:

1
lcd_puts_P(mystr);

Immer noch umständlich. Ich muss mir daher noch ausdenken, wie mystr anonym gemacht werden kann. Und wie der Funktionsaufruf A00() durch einen eleganteren Suffixoperator ersetzt werden kann. Das Endziel sieht so aus:

1
static const byte PROGMEM mystr[] = "tränenüberströmt"_a00;
(Firma: TU Chemnitz) #7678676
Lesenswert?

So, nun zum Generieren anonymer Zeichenketten im Flash. Ein Blick in <avr/pgmspace.h>, Makro PSTR, zeigt wie es geht:

1
#define P00(s) (__extension__({static const PROGMEM hd44780::a00::str<sizeof L##s/2> c(L##s); c.a;}))

Es ist tatsächlich ein weiteres Makro erforderlich. A00 und P00 können nicht zusammengelegt werden. Der Typecast-Operator ist dazu überflüssig. Die Anwendung ist wie bei PSTR:

1
lcd_puts_P(P00("Test ÄÖÜäöüß °C kΩ"));

Das erscheint erst mal komfortabel genug.

Lästig ist, dass man beim AVR immer die beiden Adressräume, RAM und Flash, im Hinterkopf behalten muss. Dabei gibt es beim Arduino einen Lösungsansatz für die meisten AVR, die ≤ 32 KByte Flash haben: Der Adressraum wird von-neumannisiert, indem Flash-Adressen mit gesetztem Bit 15 markiert werden:

1
#define F00(s) (__extension__({static const PROGMEM hd44780::a00::str<sizeof L##s/2> c(L##s); c.a+0x8000;}))

Die Warnung „index out of range“ muss unterdrückt werden.

Die Anwendung ist dann:

1
lcd_puts(F00("Test ÄÖÜäöüß °C kΩ"));

lcd_puts muss dann zur Laufzeit unterscheiden, ob eine RAM- oder Flash-Adresse vorliegt. Leider macht das der LPM-Assemblerbefehl nicht schon selbst wie bei modernen, vierstelligen PIC-Controllern, sondern das muss die Software machen. Da die Fallunterscheidung nicht viel kostet, kann man das per Byte machen:

1
inline byte read_byte(const void*p) {
2
 byte r;
3
 asm( " sbrc %B1,7  \n" // Skip wenn Bit 15 gelöscht
4
      "  lpm %0,%a1 \n" // Wenn Bit 15 gesetzt, führe lpm aus
5
      " sbrs %B1,7  \n" // Skip wenn Bit 15 gesetzt
6
      "  ld  %0,%a1 \n" // Wenn Bit 15 gelöscht, führe ld aus
7
 :"+r"(r):"z"(p));
8
 return r;
9
}

Die Funktion read_byte liest also vom RAM oder Flash je nach Bit 15 der Adresse. So als ob der Flash „hinten“ im RAM eingeblendet liegt. Wegmskieren muss man überflüssige Bits bei lpm nicht; der Flash erscheint mehrfach im 64-KByte-Adressraum. Hingegen ld versucht bei überflüssigen Bits externen RAM anzusprechen. Daher geht es nur so herum, nicht andersherum. Schade, dass sich das Adress-Inkrement (lpm r,Z+ bzw. ld r,Z+) nicht so einfach einbauen lässt.

Zwar könnte man das gleiche Verfahren auch mit dem EEPROM machen, dann ist's aber nicht mehr inline sinnvoll. Dann schlägt das unintelligente Register-Handling bei Funktionsaufrufen von gcc zu, und der Code bläht sich irre auf.

Die Von-Neumannisierung lässt sich auch durch ein geschicktes Linkerskript bewerkstelligen. Das erspart das Unterdrücken der Out-Of-Range-Warning und das Addieren magischer Offsets, dürfte aber Programmer und Debugger erheblich durcheinander bringen.

#7678698
Lesenswert?

Henrik H. schrieb:

Zwischendurch ein paar C-Stolperfallen:

Henrik H. schrieb:

So, nun zum Generieren anonymer Zeichenketten im Flash.

Henrik H. schrieb:

Jetzt geht's ans Eingemachte:

Das hast du alles seeeehr schön gemacht!

Nur für die Leute der Zielgruppe, die gerade eben mal ein Character LCD zum Laufen gebracht hat, werden dies Böhmische Dörfer sein und bleiben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren