mikrocontroller.net

Forum: Compiler & IDEs Umlaute im eeprom -> Fehler


Autor: Uwe Seidel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute.

Das Problem sieht so aus.
Wenn ich mit WinAVR und PN einen String im eeprom ablege, kann ich den
sauber auslesen und auf LCD darstellen.
Aber wehe dem, es ist ein Umlaut...
Das LCD kann die Umlaute darstellen, wenn ich sie direkt mit meiner
Routine als hexwert an das LCD übergebe. Aber aus dem eeprom kommt in
diesem Fall nur Unfug.

Kann das sein, dass PN die Umlaute nicht korrekt übergibt oder was kann
das sein ??

Ach ja , noch was ganz allgemeines:
Kann man eigentlich mit VC++ o.ä. auch solche Programme schreiben und
kompilieren oder geht das grundsätzlich nicht.
Wäre mal interessant wenn beim tippen dann die property-list aufgeht.
Ich dächte, ich hab da mal was gelesen, weiß aber nicht mehr wo.
´Habt ihr davon mal was gehört?

Ciao Uwe

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

die Kodierung der Umlaute im ASCII-Code ist anders als die im LCD. Du
mußt das also entweder zur Laufzeit oder im Quelltext anpassen.

Matthias

Autor: Uwe Seidel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Matthias

das ist schon klar, die Reihefolge stimmt in meinem Fall mal schon.
Allerdings muss halt für das LCD 0x20 abgezogen werden...wegen der
nicht vorhandenen Fernschreib-Steuerzeichen im Zeichensatz des LCD´s.
Ansonsten wie gesagt stimmt alles.. ich kann es ja ausgeben.

Es geht nur darum, WIE ich dem PN beibringe, das richtige Zeichen zu
speichern.

Bsp.:
static char p3z3[2][27]    eeprom_segment  = {"Temperatur des
Kühlkörpers:".....}

wie muss ich da denn "ü" und "ö" anpassen

Oder versteh ich dich da falsch ?!?!

Danke Uwe

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

so:
...emperatur des K\252hlk\246rpe...

Also \ und anschließend den Code des Buchstabens.

Matthias

Autor: Uwe Seidel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachdem ich jetzt mal die ASCII-Tabellen durchforstet hab, kommen mir
die Zahlen bekannt vor. ;-)

des K\252hlk\246rpe... funktioniert übrigens nicht.

Allerdings hat sich heraus gestellt, dass dieses Problem nur bei dem
Programmers Notepad auftaucht, UltraEdit schreibt das file richtig.
Grübel.
Hatte mich schon mit dem Gedanken:
if(data==0xFC)data=0x81;
abgefunden.


Aber du hast mir auf jeden Fall schon mal weitergeholfen.
DANKE.

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die korrekte Syntax zum Schreiben von Konstanten in C ist

  '\ooo'   (ooo = Oktalcode des ASCII-Zeichens)

oder

  '\xhh'   (hh) = HexCode des ASCII-Zeichens)

Autor: Uwe Seidel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tjaaaa,

'\ooo' funktioniert mal einwandfrei.

'\hxx' funktioniert NUR wenn nachfolgend ein Leerzeichen steht.
aber das ist dann ja auch im Text

An solchen Kleinigkeiten kann man Zeit verschwenden....mann mann mann.

BTW ich bekommen bei UltraEdit beim ausführen der make-anweisen den
Fehler:
Fehler beim Erzeugen des Prozesses297 bla bla bla....
schon mal jemand gehört ?
Liegt das vielleicht an XP ?!?!

Ansonsten schon mal

HERZLICHEN DANK an alle

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>'\hxx' funktioniert NUR wenn nachfolgend ein Leerzeichen steht.
>aber das ist dann ja auch im Text

Ich habe doch geschrieben '\xhh', als z.B. \x0D  für ASCII-Code
<OD>=CR

Zu UltraEdit:
Ich habe unter ToolConfiguration folgendes Eingetragen:
Command Line:   C:\winavr\utils\bin\make
Working Directory: %p
Output to List Box  (*)
Capture Output      (*)
Dann funktioniert Make Aufruf via UltraEdit einwandfrei auch unter XP.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich habe doch geschrieben '\xhh'

Hilft übrigens auch nicht, Peter.  Entgegen landläufiger Meinung enden
Escape-Folgen nicht nach zwei oder drei Ziffern automatisch, sondern
am ersten Zeichen, das nicht mehr eine gültige Ziffer zur Zahlenbasis
ist.  Bei Oktalzahlen ist das natürlich einfacher als bei
hexadezimalen.

Aber:

"\xd\n" ist identich zu "\x0d\n" (oder "\r\n" oder
"\x0d\x0a")

"\7" ist identisch zu "\007" oder "\0000007" (oder \a)

"\xd00f" ergibt nicht etwas das Zeichen 0xd0 gefolgt von '0' und
'f',
sondern es wäre ein String, der aus einem einzelnen Zeichen (wide
char!) besteht.  "\xd0" "0f" wäre dagegen der String, der aus dem
Zeichen 0xd0 plus '0' plus 'f' besteht.  Eigens für diesen Zweck
mußte
ANSI C die string concatenation einführen, d. h. zwei
aufeinanderfolgende string literals werden (ohne ein \0 Zeichen
dazwischen) miteinander verkettet:

"f" "o" "o" ist identisch zu "foo".

Btw., ASCII bezeichnet nur die Zeichen 0 bis 127, alles andere ist
jenseits von ASCII (IBM Codepage 437, oder IBM Codepage 850 oder ISO
8859-1 oder all dies).

Autor: Uwe Seidel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
>Ich habe doch geschrieben '\xhh', als z.B. \x0D  für ASCII-Code
Wechstaben verbuchselt.... tztztztz
zum Thema UltraEdit:
nahe dran... das Arbeitsverzeichnis '%p' funzt nur , wenn man dort
%p hinschreibt und nicht %d  ;-))

@Joerg
>Hilft übrigens auch nicht, Peter.
Gott sei Dank... ich bin nicht zu blöd

@euch beide
Danke , wieder was dazu gelernt.
Ich bin ja schon froh , das wenigstens einer von euch beiden auch nicht
ALLES gewusst hat, da kommt man sich nicht ganz so jämmerlich vor.....
;-)

Danke
Uwe

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab noch einen kleinen Denkanstoss: geht es, wenn ich schreibe
#define ü /x87
#define ä /x88

(die Zahlen stimmen nicht)

also das der Precompiler die Umlaute gleich von selbst ersetzt???
Währe für einen LIB interresant, man müsste sich dann nicht mehr darum
kümmern.

Gruß, Florian

Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie soll das funktionieren? Du kannst ja keine Definitionen in
Anführungszeichen setzen. Wenn Du einen richtigen Namen wählst sollte
das aber so gehen. x87 und x88 sind dabei einfach mal Dummywerte.

1. Möglichkeit:
#define UMLAUT_OE_KLEIN "/x87"
#define UMLAUT_OE_GROSS "/x88"

String: "Umlaute sind m" UMLAUT_OE_KLEIN "glich!"

2. Möglichkeit:
Was zu bevorzugen ist, wenn man auch Texte von außen reinbekommen will
ist natürlich eine Tabelle anzulegen, wo alle Zeichen die reinkommen
können per Index nummeriert sind und dann dort einfach der Codes des
Zeichens vom LCD steht. (verständlich ausgedrückt?)

char win2lcd_table[] = { .., "A", "B", "C", .., 0x87, .., 0x88,
.. };

out_c = win2lcd_table[in_c];
oder
out_c = win2lcd_table + in_c

So sollte das eigentlich funktionieren, wenn ich den Pointer richtig
angegeben habe. :)

3. Möglichkeit
Alles was größer als 127 ist, ist auf alle Fälle nicht ASCII und wird
damit nicht funktionieren. Daher reicht es nur diese zu filtern und
damit die Tabelle klein zu halten. Siehe Möglichkeit 2.

Autor: Uwe Seidel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Ronny

hatte schon für meine beiden nötigen Buchstaben die einfache Variante

if(data==0xFC)data=0x81;

geschrieben.

Die Varianten 2 und 3 taugen aber dann schon zur
"Internationalisierung" falls das Gerät öfters mit PC´s kommuniziert
die vielleicht verschiedene Codepages benutzen.
z.B y <> z bei amerikanischer Tastatur
Bleibt auf jeden Fall mal in meinem Hinterkopf.

Ciao , Uwe

Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Freut mich, dass Du eine Lösung hast. Im übrigen hat sich bei mir oben
der Fehlerteufel eingeschlichen. Die Buchstaben sollten natürlich nicht
in Anführungszeichen stehen, sondern so:

char win2lcd_table[] = { .., 'A', 'B', 'C', .., 0x87, .., 0x88,
.. };

Schliesslich sind das ja keine Strings, sondern nur Zeichen.

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.