Forum: Compiler & IDEs Umlaute im eeprom -> Fehler


von Uwe Seidel (Gast)


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

von Matthias (Gast)


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

von Uwe Seidel (Gast)


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

von Matthias (Gast)


Lesenswert?

Hi

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

Also \ und anschließend den Code des Buchstabens.

Matthias

von Uwe Seidel (Gast)


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.

von Peter Fleury (Gast)


Lesenswert?

Die korrekte Syntax zum Schreiben von Konstanten in C ist

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

oder

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

von Uwe Seidel (Gast)


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

von Peter Fleury (Gast)


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.

von Joerg Wunsch (Gast)


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

von Uwe Seidel (Gast)


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

von Florian Pfanner (Gast)


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

von Ronny Schulz (Gast)


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.

von Uwe Seidel (Gast)


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

von Ronny Schulz (Gast)


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.

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.