www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sonderzeichen mit sprintf


Autor: Sven W. (wache)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Ich möchte auf meinem Display folgendes darstellen:

Winkel: 123,3°

Mein Problem ist das °-Zeichen.

Mein vorgehen ist das folgende:
sprintf(text, "Winkel: %5.1f°", Winkel);

auch die Version
sprintf(text, "Winkel: %5.1f" "°", Winkel);
fuktioniert auch nicht.

Leider will das aber nicht. Was mache ich denn falsch?

Die Entwicklungsumgebung ist WinAVR mit dem AVRStudio. Der µC ist ein 
AT90CAN128 und das Display ist ein eDIP240-7 über I2C angesteuert.

Vielen Dank schon einmal für die Antworten!

Gruß,

Sven

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, versuchs doch mal mit

sprinf("Winkel: 123,4%c", 123);

die 123 sollen das Grad Zeichen darstellen, musste mal im Datenblatt des 
Displays nachschauen, welcher es wirklich ist.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck mal, ob dein Display den Kringel überhaupt im Zeichensatz hat.

Autor: Sven W. (wache)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Die Option %c funktioniert nicht. Gibt es die denn überhaupt im GCC 
Compiler? Ich kenne die nur unter C++.
Laut Datenblatt sol das °-Zeichen Lower 8 und Upper 240 sein (dez). Das 
müsste doch 248 ergeben, oder?

weder
sprintf(text, "Winkel: %3.1f %c", Winkel, 248);
noch
sprintf(text, "Winkel: %3.1f %c", Winkel, '°');

führen zum Erfolg.

Irgendwie komisch...

Noch jemand eine Idee?

Gruß,

Sven

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich hab so was mal in Bascom gemacht. Mein Code dazu sieht so aus:

Befehle = "#ZF3,#ZL10,70,Temperatur:  xx.x{248}C{013}"

xx.x wird später mit ASCII zeichen aufgefüllt und die 248 ist das 
°-Zeichen.
Bei mir ist das die Schriftart 3 aus dem Datenblatt. Benutzt du 
vielleicht eine Andere, in der das °-Zeichen nicht vorkommt?

Ansonsten sieht das mit dem %c und 248 für mich erstmal richtig aus.

Viele Grüße

Autor: Kobaltchlorid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sonderzeichen werden in einem C-String normalerweise mit Backslash, 
führender Null und dem Oktalwert des Zeichens angegeben. Wenn dein '°' 
auf deinem Display den Dezimalwert 248 hat, sollte eigentlich
 sprintf(text, "Winkel: %3.1f\0370", Winkel); 
zum Ziel führen.

Die Umrechnung Dezimal-Oktal macht übrigens ganz bequem der 
Windows-Rechner in der wissenschaftlichen Ansicht. Im Dezimal-Modus 
deine Dezimalzahl eingeben, links dann Okt statt Dez anklicken, 
Umrechnung fertig.

Welchen (Dezimal-)Wert das Grad-Zeichen wirklich hat, lässt sich leicht 
feststellen, schick' einfach alle Werte von 0-255 an das Display.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Welchen (Dezimal-)Wert das Grad-Zeichen wirklich hat, lässt sich leicht
>feststellen, schick' einfach alle Werte von 0-255 an das Display.

Oder im Datenblatt nachsehen. Sollte 0xDF sein.

MfG Spess

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Statt der antiquierten Oktaldarstellung lässt C seit C89 in Strings auch 
hexadezimale Zeichenkonstanten zu. 248dez ist 0xf8, was mit
sprintf(text, "Winkel: %3.1f\xf8", Winkel);

ausgegeben werden sollte. Wenn Spess aber richtig liegt, ist 248 und 
also auch 0xf8 falsch, und sollte durch 223 resp. 0xdf ersetzt werden.

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kommt aufs Display an.
sprintf (lcd_buffer,"%2uß",KTY10);         //Temperatur anzeigen

Mal so ein Fragment aus einem alten Programm :-)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade im HD44780-Datenblatt nachgeschaut. Falls dein Display
einen dazu kompatiblen Controller ohne zusätzlichen µC zur Umsetzung von
Zeichencodes hat, ist 0xDF richtig, wie spess53 oben geschrieben hat.

Also so:
  sprintf(text, "Winkel: %5.1f\xdf", winkel); // hex

oder so:
  sprintf(text, "Winkel: %5.1f\337", winkel); // okt

oder (umständlich) so:
  sprintf(text, "Winkel: %5.1f%c", winkel, 223); // dez

> Laut Datenblatt sol das °-Zeichen Lower 8 und Upper 240 sein (dez).
> Das müsste doch 248 ergeben, oder?

Die 248 ist der Code für ° in der alten IBM-Zeichencodierung (unter
DOS). Wenn das im Datenblatt des Displays so steht, dann ist es
vielleicht doch eines der intelligenteren. Um welchen Typ handelt es
sich denn?

Kobaltchlorid schrieb:
> sprintf(text, "Winkel: %3.1f\0370", Winkel);

Nur zur Info: Die 0 nach dem Backslash ist zuviel. Oktale
Zeichenkonstanten dürfen maximal 3 Ziffern enthalten.

H.joachim Seifert schrieb:
> kommt aufs Display an.
> sprintf (lcd_buffer,"%2uß",KTY10);         //Temperatur anzeigen

ß hat in der Zeichencodierung nach ISO 8859-1 und -15 den Code 223 bzw.
0xdf, was der HD44780 als ° darstellt (s.o.).

@Sven W.:

Welches Zeichen wird den statt des ° auf dem Display angezeigt?

Autor: Kobaltchlorid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nur zur Info: Die 0 nach dem Backslash ist zuviel. Oktale
> Zeichenkonstanten dürfen maximal 3 Ziffern enthalten.

ich habe die Version mit führender Null aus irgendeinem C-Buch, weiss 
jetzt aber nicht mehr, aus welchem. Ich programmiere mit CodevisionAVR, 
da funktioniert es ausschliesslich mit führender Null, auch bei 
dreistelligen Oktalzahlen. Interessanterweise funktioniert aber auch 
\xF8.

[c] "Test\0370 Test\370 Test\xF8" /[c]

wird bei mir angezeigt als: Test° Test70 Test°

In der Codevision-Doku steht überhaupt nichts zu dem Thema. Ich war 
deshalb der Meinung, dass die Version mit vorangestellter Null auch bei 
größeren Oktalzahlen gängiger Standard ist.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich programmiere mit CodevisionAVR, da funktioniert es ausschliesslich
> mit führender Null, auch bei dreistelligen Oktalzahlen.

Dann ist dieser Compiler nicht standardkonform.

> "Test\0370 Test\370 Test\xF8"
>
> wird bei mir angezeigt als: Test° Test70 Test°

Interessant. Ich habe gerade
  printf("Test\0260 Test\260 Test\xb0\n");

mit dem GCC auf dem PC ausprobiert. Den Zeichencode für das ° habe ich
angepasst, damit er zu dem auf ISO 8859-15 eingestellten Ausgabefenster
passt. Man erkennt übrigens schon in der Einfärbung von \0260 durch die
Forensoftware, wie der Hase läuft.

Die Ausgabe sieht wie erwartet so aus:
Test0 Test° Test°

Die 0 nach dem ersten Test ist die letzte 0 in \0260, das Zeichen \026
ist nicht darstellbar und wird deswegen bei der Ausgabe unterdrückt.

Autor: Sven W. (wache)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Vielen Dank für Eure Hilfe!
Die Sache mit dem Backslash habe ich ganz vergessen gehabt, das war die 
Lösung!

Die richtige Zeile lautet alse:
float Winkel;
sprintf(Text, "Winkel: %5.1f\xF8", Winkel);

Die 0xF8 stehen für meine 248.

Warum mault eigentlich der Compiler mit der folgenden Aussage:
warning: format '5.1f' expects type 'double', but argument 3 has type 
'float'
Ich dachte immer, %f wäre für float!
Es funktioniert ja auch, aber mich interessiert die Warnung trotzdem...

@yalu: Ja, es ist ein (mehr oder besser mehr weniger) intelligentes 
Display. Es ist das eDIP240-7 (http://lcd-module.de/deu/dip/edip.htm). 
Das Datenblatt findest Du auch auf der Seite.
Prinzipiell ist das Display recht nett, aber es ist leider recht 
langsam.

Gruß,

Sven

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven W. wrote:

> Warum mault eigentlich der Compiler mit der folgenden Aussage:
> warning: format '5.1f' expects type 'double', but argument 3 has type
> 'float'
> Ich dachte immer, %f wäre für float!

Nein, ist double.  float konnte man früher bei variablen Argumentlisten
auf Grund der argument promotion Regeln nicht transportieren.  Mit
modernen variablen Argumentlisten geht das allerdings, und du musst
explizit nach (double) casten.

> Es funktioniert ja auch

Zufällig, weil im AVR-GCC sizeof(float) == sizeof(double) ist.

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.