Forum: Mikrocontroller und Digitale Elektronik ASCII-Zeichen nach 128 in C auf DOGXL darstellen nicht möglich


von Bernd G. (docbg)


Lesenswert?

Hallo an alle Forumsmitglieder,
ich beschäftige mich beharrlich mit einem EA DOGXL 240-7 und bin in C 
noch nicht sehr erfahren. Gleichwohl interessiert und wissbegierig.
Ich bin inzwischen soweit, dass mein Display ASCII-Codes bis zum 96. 
Zeichen (hex7F oder Dezimal 127) anzeigt. Für Zeichen grösser Dezimal 
128 zeigt es Kauderwelsch.
Mein Code zwingt mich in der Funktion LCD_String für die ASCII-Zeichen 
den Typ const char anzugeben, ansonsten meckert der Compiler folgenden 
Fehler an: invalid conversion from 'const char*' to 'unsigned char*' 
[-fpermissive] LCD_string(8,10,"2");
Ich denke, dass genau hier das Problem liegt, denn ein const char kann 
nur den maximalen Wert 128 annehmen. Sehe ich das richtig?
Der pointer zeigt - in arrays bin ich noch nicht wirklich zuhause - auf 
ein übliches font-array, dessed Anfang wie folgt aussieht und von EA 
stammt.

 /*-----------------------------------------------------------|
|File:     font_6X8.h                      |
|Date:      August 2011                   |
|Author:   ELECTRONIC ASSEMBLY               |
|Description:File including font data             |
|                               |
|The file is build with EA USBSTICK-FONT           |
|for more information, please go to                 |
|http://www.lcd-module.com/eng/pdf/zubehoer/usbstick-font.pdf|
|------------------------------------------------------------*/

/* font_6X8.FV' as include

 the array starts with a 8 byte header:
 1st Byte: 'F' first 2 bytes are always FV
 2nd Byte: 'V' for FONT VERTICAL
 3rd Byte: First code to define
 4th Byte: Last  code to define
 5th Byte: Width of character in dots
 6th Byte: Height of character in dots
 7th Byte: Height of character in bytes
 8th Byte: Bytes needed for each character (1..255)
            or 0 for big fonts calculate WidthInDots * HeightInBytes
  After that font data will follow */
#ifndef _FONT_6x8_H
#define _FONT_6x8_H

  unsigned char font_6x8[] =
{
  70, 86, 32, 128,  6,  8,  1,  6,
  0,  0,  0,  0,  0,  0,
  0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,    // hex geht auch!
//  0,  0, 95,  0,  0,  0,
  0,  7,  0,  7,  0,  0,
  20,127, 20,127, 20,  0,
     usw.

Um das 4th byte habe ich mich in meinen späteren Versuchen nicht mehr 
gekümmert, da es m. E. in meinem C-Code keine Rolle spielt. Mit höheren, 
an die jeweilige array-Grösse angepassten Werten des 4th byte, war die 
Ausgabe ebenso fehlerhaft. Sowie ich in dem array mehr als 128 Zeichen 
definiere, entsthet der Kauderwelsch (dann für alle Zeichen) auf dem 
Display.

Im Folgenden mein C-Code, mit dem ich die Ausgabe steuere. Und wie 
gesagt, bis ASCII 0-127 ist alles korrekt angezeigt.

//-----------------------------------------------------
//Func: LCD_data(data)
//Desc: sends data to display
//-----------------------------------------------------
void LCD_data(unsigned char *data, unsigned int len)


{
  DOGDATA;

  while(len--)
    dogSPIout(*data++);
}



//-----------------------------------------------------
//Func: LCD_string
//Desc: shows ascii character on screen
//-----------------------------------------------------
void LCD_string(unsigned char column, unsigned char page, const char 
*str)


{
  unsigned int pos_array;

  LCD_position(column, page);

  while(*str!= 0)
  {
    //calculate positon of ascii character in font array
    //bytes for header + (ascii - startcode) * bytes pro char)
    pos_array = 8 + (unsigned int)(*str++ - font_6x8[2]) * font_6x8[7];

    LCD_data(&font_6x8[pos_array], font_6x8[4]); //Argument 1: Data to 
send; Argument 2: len = width of char
  }
}


//---------------------------------------------------------------------- 
-------

int main()

{
  // Init-Code

       initDDRB();
       initDDRD();

//-------------------------Reset display
       _delay_ms(200);
    DOGRESET;
       _delay_ms(2);
    DOGRESETOFF;
       _delay_ms(150);
//-------------------------

//-------------------------communication test - all pixel to on
    DOGENABLE;
    DOGCOMMAND;

    dogSPIout(0xA9);  // display enable (20, 0xA8); b/w.mode (0xA8); 
disp active (0xA9)

    dogSPIout(0xA5);  // set all pixel on (18, 0xA4): on (0xA5)

       _delay_ms(50);

    dogSPIout(0xA4);  // set all pixel on (18, 0xA4): off (0xA4)
//-------------------------



//-------------------------initialize display
       LCDinit();
    LCDClear();


//-------------------------Ausgabe der Testdaten

    LCD_string(8,10,"2");



   while (true)      // Mainloop


   {



   }
 return 0;
}
//---------------------------------------------------------------------- 
-------


//-----------------------------------------------------
//Func: LCD_data(data)
//Desc: sends data to display
//-----------------------------------------------------
void LCD_data(unsigned char *data, unsigned int len)


{
  DOGDATA;

  while(len--)
    dogSPIout(*data++);
}



//-----------------------------------------------------
//Func: LCD_string
//Desc: shows ascii character on screen
//-----------------------------------------------------
void LCD_string(unsigned char column, unsigned char page, const char 
*str)


{
  unsigned int pos_array;

  LCD_position(column, page);

  while(*str!= 0)
  {
    //calculate positon of ascii character in font array
    //bytes for header + (ascii - startcode) * bytes pro char)
    pos_array = 8 + (unsigned int)(*str++ - font_6x8[2]) * font_6x8[7];

    LCD_data(&font_6x8[pos_array], font_6x8[4]); //Argument 1: Data to 
send; Argument 2: len = width of char
  }
}


//---------------------------------------------------------------------- 
-------

int main()

{
  // Init-Code

       initDDRB();
       initDDRD();

//-------------------------Reset display
       _delay_ms(200);
    DOGRESET;
       _delay_ms(2);
    DOGRESETOFF;
       _delay_ms(150);
//-------------------------

//-------------------------communication test - all pixel to on
    DOGENABLE;
    DOGCOMMAND;

    dogSPIout(0xA9);  // display enable (20, 0xA8); b/w.mode (0xA8); 
disp active (0xA9)

    dogSPIout(0xA5);  // set all pixel on (18, 0xA4): on (0xA5)

       _delay_ms(50);

    dogSPIout(0xA4);  // set all pixel on (18, 0xA4): off (0xA4)
//-------------------------



//-------------------------initialize display
       LCDinit();
    LCDClear();


//-------------------------Ausgabe der Testdaten

    LCD_string(8,10,"2");



   while (true)      // Mainloop


   {



   }
 return 0;
}
//---------------------------------------------------------------------- 
-------

Die "2" habe ich nur für meine letzten Tests benutzt, solange ich das 
array nur bis zm 127. Zeichen fülle, zeigt das Display brav beliebige 
strings korrekt an. Tja, nun die grosse Frage: Was mache ich verkehrt?
Ich danke für jede Hilfe, da ich nun selbst keine zündende Idee mehr 
habe...
Gruß Bernd

von S. R. (svenska)


Lesenswert?

Ändere erstmal von "const char" nach "const unsigned char" und die 
Warnung sollte verschwinden. Ob ein "char" mit oder ohne Vorzeichen ist, 
hängt von System und Compiler ab - definiere es einfach als "unsigned" 
und gut ist (besser: nutze uint8_t aus <stdint.h>).

Bist du dir sicher, dass dein Font überhaupt mehr als 128 Zeichen 
enthält? Wenn das Array nur 128 Einträge enthält, dann wird ein Zugriff 
auf z.B. das 210. Zeichen irgendwo ins Leere gehen, die Daten als 
Pixelwerte interpretieren und damit irgendwelchen Mist rendern.

von Bernd G. (docbg)


Lesenswert?

Nachsatz:

Sehe gerade, dass die Funktion LCD_string zweimal in meinem Code 
auftaucht, das entspringt wohl den vielen Versuchen, ist natürlich 
Unsinn. Sorry dafür..

von Bernd G. (docbg)


Lesenswert?

Hallo svenska,
den Versuch mit unsigned const char habe ich im Laufe meiner vielen 
Versuche schon gemacht, die Compilermeldung bleibt, ausser das nun 
unsigned const char angemeckert wird.
Das array umfasste ursprünglich alle Zeichen bis 255, habe lange 
gebraucht, bis ich heraus hatte, dass es an dem zu grossen array liegt.
Danke für deine schnelle Reaktion.

von meckermotz (Gast)


Lesenswert?

Bernd G. schrieb:
> unsigned const char
1
 const unsigned char
!!

von docbg (Gast)


Lesenswert?

Ich habe sowohl unsigned const char als auch const unsigned char bereits 
gehabt. Der Compiler meldet beides als unzulässig.
Ich bin bisher davon ausgegangen, dass ich ASCII-Zeichen sowohl als 
char, int oder andere Zahl verwenden kann, solange der Wertebereich 
passt. Sehe ich das falsch?

von Dirk B. (dirkb2)


Lesenswert?

ASCII ist nur bis 127 definiert. Alles darüber hinaus sind 
Erweiterungen.

Du müsstest also erstmal wissen, welche Codierung das Display benutzt 
und auch dein Entwicklungssystem.

Oft ist char als signed definiert. Reicht bei ASCII auch aus.
Wenn du dann einen Wert größer als 127 zuweist, wird das entsprechende 
Bitmuster abgelegt. Bei 255 wäre das 0xFF. Als signed ist das -1.

Wenn du einem signed int ein char zuweist, ist der negativ.

von Dirk B. (dirkb2)


Lesenswert?

Bernd G. schrieb:
> Um das 4th byte habe ich mich in meinen späteren Versuchen nicht mehr
> gekümmert, da es m. E. in meinem C-Code keine Rolle spielt. Mit höheren,
> an die jeweilige array-Grösse angepassten Werten des 4th byte, war die
> Ausgabe ebenso fehlerhaft.

Hast du die Werte im Array dann auch erweitert?

von docbg (Gast)


Lesenswert?

Moin Dirk,
Vielen Dank für deine Ausführungen.
Zu deinen Zweiten: ich habe bei meinen Versuchen das Array zunächst nur 
mit dem ASCII-Code für das ! gefüllt und als 4th Byte 14 eingetragen für 
die acht header Bytes plus sechs für das !. Dann habe ich das Array 
immer 16-Zeichen-weise vergrößert, das vierte Byte ebenfalls erhöht und 
hatte keine Fehler. Das Display hat brav angezeigt, was an pixelmuster 
in der Font-Datei hinterlegt war. Das ging bis 127 gut.

An 128 Test dann der pixelsalat auf, obwohl auch für diese Positionen im 
Array entsprechende pixelmuster existierten.

Das Display selbst hat keine ascii-Zeichen im RAM oder woanders, es 
stellt nur die übertragenen pixelmuster dar. Und sie entstammen der 
fontdatei (s. o).

von Wolfgang (Gast)


Lesenswert?

Bernd G. schrieb:
> Für Zeichen grösser Dezimal 128 zeigt es Kauderwelsch.

Kein Wunder, wenn du in deinem Array die Obergrenze auf 128dez setzt.

Bernd G. schrieb:
> 70, 86, 32, 128,  6,  8,  1,  6,

von Dirk B. (dirkb2)


Lesenswert?

Hast du es denn mal mit einer Zwangsumwandlung (innerhalb der Funktion) 
probiert.

Mit einem cast sagst du dem Compiler, dass du weißt was du tust und es 
gibt keine Warnung.
1
pos_array = 8 + (unsigned int)((unsigned char)*str++ - font_6x8[2]) * font_6x8[7];

oder
1
unsigned char *ustr = (unsigned char*)str;
 am Anfang der Funktion und dann
1
pos_array = 8 + (unsigned int)(*ustr++ - font_6x8[2]) * font_6x8[7];

Das const bleibt für dich ;-)

von docbg (Gast)


Lesenswert?

Kein Wunder, wenn du in deinem Array die Obergrenze auf 128dez setzt.

Die 128dez stehen da nur momentan. Ich hatte auch größere Werte dort 
stehen. Dennoch konnte ich keine größeren ascii-Werte darstellen, was 
mir auch logisch vorkam, solange ich -weil sonst der Compiler meckert - 
nur const char verwenden konnte.

von docbg (Gast)


Lesenswert?

An Dirk:
Den Gedanken mit einer Umwandlung hatte ich auch schon, wusste aber 
nicht, wie das korrekt geht. Stimmt also vielen Dank für deinen Code, 
das werde ich später probieren, derzeit bin ich noch bei der Arbeit.
Hast du denn deine Idee, warum ich const char nehmen muss? Das sieht 
doch für mich zumindest so aus, als würde
LCD_string(2,8,“2“);
Das erzwingen. Jedoch kann ich die erste 2 (column-wert) und die 8(page) 
doch auch als integer weiter verarbeiten. Woher der Unterschied?

von Dirk B. (dirkb2)


Lesenswert?

docbg schrieb:
> Hast du denn deine Idee, warum ich const char nehmen muss? Das sieht
> doch für mich zumindest so aus, als würde
> LCD_string(2,8,“2“);
> Das erzwingen.

Mit const versicherst du (als Programmierer), dass du an den Daten 
nichts änderst.
Wenn du es doch machst, kann dich der Compiler warnen.
Ein Stringliteral (wie "2") sollte nunmal als nicht änderbar betrachtet 
werden.

> Jedoch kann ich die erste 2 (column-wert) und die 8(page)
> doch auch als integer weiter verarbeiten. Woher der Unterschied?

Das Font-Array ist doch unsigned char.

Lass dir mal bei deinem bisherigen Code vor dem Aufruf von 
LCD_data(&font_6x8[pos_array], ... den Wert von pos_array ausgeben.
Und dann mit denm verbesserten Code.

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

Bernd G. schrieb:
> Ich bin inzwischen soweit, dass mein Display ASCII-Codes bis zum 96.
> Zeichen (hex7F oder Dezimal 127) anzeigt. Für Zeichen grösser Dezimal
> 128 zeigt es Kauderwelsch.

Bernd G. schrieb:
> Mein Code zwingt mich in der Funktion LCD_String für die ASCII-Zeichen
> den Typ const char anzugeben

Bernd G. schrieb:
> denn ein const char kann
> nur den maximalen Wert 128 annehmen.

Bernd G. schrieb:
> ich beschäftige mich beharrlich mit einem EA DOGXL

Ja ja ja ja ja...


Also....

Du pfriemelst beharrlich mit irgend einem Stück Treiber von EA herum, 
ohne auch nur im geringsten zu wissen, was da überhaupt abgeht. Hast du 
schon mal in die Quellen von EA geschaut? Weißt du übehaupt, was da für 
ein Font drinsteckt und welche Zeichen dieser überhaupt enthält?

Nun hast du eine ganze Latte an deinem Quellcode gepostet - erwartest 
du, daß da alle anderen Forenteilnehmer besser durchsehen als du? Oder 
erwartest du, daß man ohne Kenntnis der Hintergründe wissen kann, was da 
bei DOGDATA; passiert:
1
void LCD_data(unsigned char *data, unsigned int len)
2
{ DOGDATA;
3
  while(len--) dogSPIout(*data++);
4
}

Da es einen Font zu geben scheint, nehme ich mal an, daß es sich um ein 
grafisches Display handelt. Bei so etwas sollte es eine Funktion geben, 
die an eine wählbare Stelle auf dem Display ein Zeichen in einem 
wählbaren Font und in einer wählbaren Farbe hinschreibt. Sowas sollte 
Teil der Grafik-Lib sein und NICHT die Teile der Firmware belästigen, 
die das Display benutzen wollen.

Fazit: mir scheint der Krempel von EA ein ziemlicher Mist oder dessen 
Dokumentation ein Mist zu sein oder du hast ihn nicht verstanden. Also 
mach es anders. Anstatt dich mühsam durch schlechten Code und 
unzureichende Fonts zu quälen, ohne das alles wirklich zu verstehen..

(!!! siehe "Um das 4th byte habe ich mich in meinen späteren Versuchen 
nicht mehr gekümmert, da es m. E. in meinem C-Code keine Rolle spielt."
.. wobei das 4. Byte angibt, welches der höchste im Font vorkommende 
Char ist, also GENAU DAS Problem, was du hier schilderst)

..solltest du anfangen, die Funktionalität von grafischen 
Zeichenausgaben verstehen zu lernen:

1. Zum Benutzen braucht man eine Funktion, die so etwa so aussieht:
1
int Zeichenausgabe (int X,      // Pixel von links 
2
                    int Y,      // Pixel von oben
3
                    char C,     // das Zeichen
4
                    der Font,   // Typ des Fonts je nach deinem Zeugs
5
                    die Farbe); // Typ der Farbe je nach deinem Zeugs
Und alles Andere soll gefälligst im zugehörigen GDI abgehen, so daß man 
sich beim benutzen nicht drum scheren muß. Bei einem monochromen Display 
hat man bei den Farben nur schwarz, weiß und toggle.

2. Um flott arbeiten zu können, braucht man einen Canvas, also eine 
Zeichenfläche im RAM mit je einem Bit (oder bei bunten Displays einem 
Farbeintrag) je Pixel.

Hat man genug RAM für den Canvas, dann zeichnet man mit obiger Funktion 
dort hinein und überträgt später den ganzen Canvas ins Display.

hat man nicht genug RAM für den Canvas, dann muß man sich jeweils einen 
Mini-Canvas pro auszugebendem Zeichen anlegen, den vorherigen 
Hintergrund aus dem Dislay lesen und hineintun, dann dort hineinzeichnen 
und dann diesen Canvas wieder ins Display zurückschreiben. Ist mühsam 
und langsam.

Mein Rat wäre wieder mal, die Dinge zu trennen. Das physische Ansteuern 
eines Displays also trennen vom logischen Schreiben oder Zeichnen auf 
einem Canvas. Ebenso sollten die Schreibroutinen selber mit dem 
bezeichneten Font umgehen und nicht die benutzenden Teile deiner 
Firmware damit belästigt werden.

W.S.

von leo (Gast)


Lesenswert?

W.S. schrieb:
> 1. Zum Benutzen braucht man eine Funktion, die so etwa so aussieht:int
> Zeichenausgabe (int X,      // Pixel von links
>                     int Y,      // Pixel von oben
>                     char C,     // das Zeichen
>                     der Font,   // Typ des Fonts je nach deinem Zeugs
>                     die Farbe); // Typ der Farbe je nach deinem Zeugs

Sicher nicht. Von der Mixtur aus Deutsch und English, Grossschreibung 
und Syntaxfehlern mal abgesehen, ist es unsinnig bei jedem Zeichen Font 
und Farbe setzen zu wollen. Position ist auch sehr zweifelhaft, da meist 
einfach von links nach rechts fortlaufend geschrieben wird. Ich will 
sicher nicht die X-Position mitrechnen wollen.

> Mein Rat wäre wieder mal, die Dinge zu trennen.

Sag ich ja.

leo

von W.S. (Gast)


Lesenswert?

leo schrieb:
> Sicher nicht. Von der Mixtur aus Deutsch und English, Grossschreibung
> und Syntaxfehlern mal abgesehen, ist es unsinnig bei jedem Zeichen Font
> und Farbe setzen zu wollen. Position ist auch sehr zweifelhaft, da meist
> einfach von links nach rechts fortlaufend geschrieben wird. Ich will
> sicher nicht die X-Position mitrechnen wollen.

Hä?

Also mir scheint, du willst mit dem Grafikdiplay lediglich ein reines 
Alpha-Text-Display nachbilden.

Und was Font und Farbe betrifft: da kann man auch mit einer Art 
Device-kontext arbeiten. Das spart einerseits 2 Argumente, erfordert 
aber ein zuvoriges Einstellen.

OK, wer ein Grafik-Display eigentlich gar nicht wirklich benutzen will, 
also weder Grafik noch Fonts variabler Größe und Breite verwenden will, 
sondern nur eben den Canvas in Stücke zu 6x8 oder 8x12 Pixel aufteilen 
will, um dort Textzeichen zu plazieren, der kann das Ganze auch um 
einiges primitiver gestalten.

Aber wozu kauft man sich dann dafür in der Apotheke EA ein grafisches 
Display?

W.S.

von Dirk B. (dirkb2)


Lesenswert?

W.S. schrieb:
> 1. Zum Benutzen braucht man eine Funktion, die so etwa so aussieht:

Und wenn genau diese Funktion fehlerhaft ist?
Das ist der Part vom TO, der nicht funktioniert. Da ist es egal was da 
noch drum herum gebastelt wird.

von leo (Gast)


Lesenswert?

W.S. schrieb:
> Also mir scheint, du willst mit dem Grafikdiplay lediglich ein reines
> Alpha-Text-Display nachbilden.

Ich habe dein Interface kritisiert, welches genau 1 Zeichen Text 
ausgab.
Von Grafik war nicht die Rede. BTW: bei einem S/W-Display die Textfarbe 
mitzugeben ist auch total unsinnig.

leo

von docbg (Gast)


Lesenswert?

Nur mal zur Klarstellung, ich beschäftige mit einem Grafikdisplay, weil 
ich - wenn ich alles so hin hab wie es soll - genau das darstellen will. 
Am Ende soll das Ganze eine Windrose und eine grafische und numerische 
Darstellung der Windgeschwindigkeit erledigen. Ich habe auch schon 
Grafiken auf dem Display erzeugt, aber das war auch nicht meine Frage! 
Ich komme lediglich mit den ascii-Zeichen jenseits der 128 nicht klar 
und hatte die Hoffnung, dass jemand mehr Ahnung hat als ich und mir in 
diesem einen Punkt weiter helfen kann.

Dass ich kein Experte in c bin, habe ich anfangs erwähnt. Aber ich habe 
Spaß daran, mich mit solchen Dingen zu beschäftigen und gedenke, Neues 
zu erlernen. Wenn es jemandem nicht passt, dass ich zu viel Code 
gepostet habe: niemand ist gezwungen, meinen Text zu lesen!!!! Wenn ich 
aber eine Frage stelle, gehören Informationen dazu. Und die wollte ich 
geben.

von leo (Gast)


Lesenswert?

docbg schrieb:
> ascii-Zeichen jenseits der 128

Es gibt keine ASCII-Zeichen jenseits von 127.
Welche Fonts/Charsets hast du? Was sagt deine Doku dazu,
Stichwort: Charset

leo

von docbg (Gast)


Lesenswert?

Ich benutze Vorerst eine fontdatei von ea, die anscheinend relativ 
verbreitet ist: font_6*8. einen Auszug habe ich ganz am Anfang gepostet.
Dabei will ich nicht bleiben, ich möchte auch andere Schriften einbauen, 
aber soweit bin ich noch nicht.
NB: wie würdest du hier die Kopie meines Textes mit dem grünen Balken 
davor? Das finde ich sehr nützlich.

von docbg (Gast)


Lesenswert?

Sorry, ich schreibe vom Handy..
Bei NB sollte es nicht wie würdest du sondern wir erzeugst du... heißen.

von Dirk B. (dirkb2)


Lesenswert?

docbg schrieb:
> Bei NB sollte es nicht wie würdest du sondern wir erzeugst du... heißen.

„Markierten Text zitieren“ oder „Antwort mit Zitat“ unten rechts beim 
Text.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Jede Zeile, die mit "> " beginnt, wird grün. Was manche umgebrochene 
Formel etwas seltsam aussehen lässt.

Mal sehen:
> dies müsste grün geworden sein

von leo (Gast)


Lesenswert?

docbg schrieb:
> Ich benutze Vorerst eine fontdatei von ea, die anscheinend relativ
> verbreitet ist: font_6*8.

Mann, wieviele Eintraege hat diese? Von 32-128, wie du definiert hast?

leo

von Joachim B. (jar)


Lesenswert?

leo schrieb:
> Mann, wieviele Eintraege hat diese?

ist und bleibt sein Geheimnis, hat er im Eröffnungspost ja rausgekürzt!

von Dirk B. (dirkb2)


Lesenswert?

Joachim B. schrieb:
> leo schrieb:
>> Mann, wieviele Eintraege hat diese?
>
> ist und bleibt sein Geheimnis, hat er im Eröffnungspost ja rausgekürzt!

Steht eigentlich da Beitrag "Re: ASCII-Zeichen nach 128 in C auf DOGXL darstellen nicht möglich"

von docbg (Gast)


Lesenswert?

Dirk B. schrieb:
> Joachim B. schrieb:
>> leo schrieb:
>>> Mann, wieviele Eintraege hat diese?
>> ist und bleibt sein Geheimnis, hat er im Eröffnungspost ja rausgekürzt

Kommt heute Nachmittag, ich kann berufsbedingt nicht jederzeit 
schreiben,

von Joachim B. (jar)


Lesenswert?

Dirk B. schrieb:
> Steht eigentlich da

du siehst die 128 Zeichen nach usw.?

Bernd G. schrieb:
> unsigned char font_6x8[] =
> {
>   70, 86, 32, 128,  6,  8,  1,  6,
>   0,  0,  0,  0,  0,  0,
>   0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,    // hex geht auch!
> //  0,  0, 95,  0,  0,  0,
>   0,  7,  0,  7,  0,  0,
>   20,127, 20,127, 20,  0,
>      usw.

docbg schrieb:
> Kommt heute Nachmittag, ich kann berufsbedingt nicht jederzeit
> schreiben,
lieber TO bitte den Code hochladen, so lang im Posting muss nicht sein!

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

leo schrieb:
> Ich habe dein Interface kritisiert, welches genau 1 Zeichen Text
> ausgab.
> Von Grafik war nicht die Rede. BTW: bei einem S/W-Display die Textfarbe
> mitzugeben ist auch total unsinnig.

Du springst ein zweitesmal zu kurz.

Auf einem Grafik-Display IST von Grafik die Rede - und zwar 
ausschließlich Grafik. Nichts Anderes. Ein Textzeichen ist da nämlich 
auch eine Grafik, die eben pixelweise auf der Glotze plaziert werden 
muß. Und die ist regelmäßig in pixelweisen Koordinaten X und Y 
organisiert. Wenn dir X und Y nicht gefallen, dann nenne das eben 
Ottokar und Heinrich, aber merke dir was wer ist.

Und die Farbe ist auch auf einem monochromen Display ein Thema. Ich 
schrieb's ja bereits: schwarz, weiß und invertierend.

Und bevor du hier was kritisierst, ohne selbst einen positiven Beitrag 
zu liefern, lies mal zuvor, wie das z.B. in der Lernbetty gemacht worden 
ist. Das dortige GDI kann nämlich mit Fonts aller Größe und fester und 
variabler Breite umgehen und es kann die Texte an beliebige 
X,Y-Positionen zeichnen. Und das Ganze ist bereits asbach uralt, sollte 
also keine Neuigkeit für jemanden darstellen, der Grafik auf ein 
grafisches LCD bringen will.

Und ehe du dich verwunderst, warum besagte Funktion nur ein Textzeichen 
zeichnet, sei dir gesagt, daß man durch wiederholtes Aufrufen so einer 
Funktion auch Zeicheketten darstellen kann. Zu diesem Zweck liefert die 
Funktion nämlich die Zeichenbreite zurück, so daß man X entsprechend 
erhöhen kann.

W.S.

von leo (Gast)


Lesenswert?

W.S. schrieb:
> Auf einem Grafik-Display IST von Grafik die Rede - und zwar
> ausschließlich Grafik.

Aha. Das Lesen des Subjects ist aber nicht so deines.

> wie das z.B. in der Lernbetty gemacht worden ist.

Jaja. Mit der bist du schon oft hausieren gegangen und zu Recht 
kritisiert worden.

leo

von W.S. (Gast)


Lesenswert?

docbg schrieb:
> Nur mal zur Klarstellung, ...
> ... Ich habe auch schon Grafiken auf dem Display erzeugt...
> Ich komme lediglich mit den ascii-Zeichen jenseits der 128 nicht klar
> und hatte die Hoffnung, dass jemand mehr Ahnung hat als ich und mir in
> diesem einen Punkt weiter helfen kann.

Also erstens: Ich und andere hatten vor vielen Jahren mit der Lernbetty 
bereits die Ausgabe von Texten in verschiedenen Fonts, Linien und 
Flächen den hiesigen Lesern vorgeturnt. Hier triffst du also auf Leute, 
die dediziert mehr Ahnung haben von diesem spezielen Thema als du.

Man braucht das Zeugs aus der Lernbetty nur nachzumachen - aber man 
sollte verstehen, was man da tut. Ich habe hier auch schon mal diverse 
Fonts und einen kleinen Font-Compiler gepostet, mit dem man sich seine 
eigenen Fonts oder Klein-Grafiken selber machen kann.

So. Du hast also nicht nachgeschaut, warum du bei Zeichen > 7Fh nur 
Kauderwelsch kriegst. Und du hast dich auch nicht um die Grenzen im Font 
gekümmert: (Zitat)"Um das 4th byte habe ich mich in meinen späteren 
Versuchen nicht mehr gekümmert, da es m. E. in meinem C-Code keine Rolle 
spielt". Ach so.

Also das 3. und 4. Byte sollen das kleinste und größte darstellbare 
Zeichen anzeigen. Das ist offensichtlich dazu gedacht, daß man beim 
Benutzen des Fonts eben NICHT über diese Grenzen hinaustanzt.

Und wenn du das 4. Byte erhöhst, dann mußt du eben auch die zugehörigen 
Glyph-Daten in den Font einarbeiten. So etwas sollte dir eigentlich 
bekannt sein.

Und: die konkrete Programmiersprache (hier: C) spielt für das 
Verständnis der Algorithmen eines GDI und der Struktur eines Fonts keine 
Rolle.

W.S.

von guest (Gast)


Lesenswert?

Joachim B. schrieb:
> du siehst die 128 Zeichen nach usw.?

Braucht man gar nicht unbedingt. Das Fontarray hat einen Header in dem 
steht welche Zeichen es enthält (32-128). Und in dem von Dirk verlinkten 
Beitrag (Beitrag "Re: ASCII-Zeichen nach 128 in C auf DOGXL darstellen nicht möglich") ist die 
128 sogar extra fett hervorgehoben.

von Joachim B. (jar)


Lesenswert?

guest schrieb:
> Das Fontarray hat einen Header in dem
> steht welche Zeichen es enthält (32-128)

das er schon geändert hat unabhängig davon ob überhaupt 32-128 Zeichen 
defininiert sind!

Ich wollte die Zeichen wenigstens mal sehen und zählen und nicht um 
seine Änderungen spekulieren

: Bearbeitet durch User
von Bernd G. (docbg)


Angehängte Dateien:

Lesenswert?

leo schrieb:
> Es gibt keine ASCII-Zeichen jenseits von 127.
> Welche Fonts/Charsets hast du? Was sagt deine Doku dazu,
> Stichwort: Charset
>
> leo

Sorry, dass es so lange gedauert hat, die liebe Arbeit...

Dies ist die vollständige Originaldatei, die ich anfangs benutzt habe. 
Wegen der beschriebenen Probleme habe ich im Weiteren das Original 
gekürzt und herausgefunden, dass ich die Zeichen korrekt darstellen 
kann, wenn ich nur die Zeichen bis hex7F in der font-Datei habe.
Die in der datei vollstaendig_font_6*8.h enthaltenen Zeichen sind in dem 
pdf zu finden.

Beitrag #6141435 wurde vom Autor gelöscht.
von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Bernd G. schrieb:
> Wegen der beschriebenen Probleme habe ich im Weiteren das Original
> gekürzt und herausgefunden, dass ich die Zeichen korrekt darstellen
> kann, wenn ich nur die Zeichen bis hex7F in der font-Datei habe.
> Die in der datei vollstaendig_font_6*8.h enthaltenen Zeichen sind in dem
> pdf zu finden.

sehr merkwürdig, schliesslich gibt es Zeichen von 32 bis 255

warum also nur bis 127 (0x7F) funktionieren soll erklärt es nicht.

ich habe mal mit meinem Font verglichen

65 ist wirklich das große A und der Font reicht bis 255

Mist weder mit font.c oder font.txt weden die Zeilennummern gezeigt.

Ich hatte das so schön eingruppiert SPACE 32 Font bis 255

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

HI

Die Beschreibung der Font-Dateien:

http://www.lcd-module.de/fileadmin/eng/pdf/zubehoer/usbstick-font.pdf

MfG Spess

von leo (Gast)


Lesenswert?

Bernd G. schrieb:
> Wegen der beschriebenen Probleme habe ich im Weiteren das Original
> gekürzt und herausgefunden, dass ich die Zeichen korrekt darstellen
> kann, wenn ich nur die Zeichen bis hex7F in der font-Datei habe.

Na ja, die Fontdatei ist ok. Bleibt nur die Frage, wie du den Text, der 
nicht funktionierte, dargestellt/eingegeben hast. Ich vermute mal, das 
war Unicode.

leo

von Bernd G. (docbg)


Lesenswert?

> Ich vermute mal, das war Unicode.

Ich rufe in der main() die Funktion LCD_string auf: 
LCD_string(8,10,"Auszugender Text");

void LCD_string(unsigned char column, unsigned char page, const char 
*str)


{
  unsigned int pos_array;

  LCD_position(column, page);

  while(*str!= 0)
  {
    //calculate positon of ascii character in font array
    //bytes for header + (ascii - startcode) * bytes pro char)
    pos_array = 8 + (unsigned int)(*str++ - font_6x8[2]) * font_6x8[7];


//    LCD_data(&font_6x8[pos_array], font_6x8[4]); //Argument 1: Data to 
send; Argument 2: len = width of char
  }
}

von Joachim B. (jar)


Lesenswert?

leo schrieb:
> Na ja, die Fontdatei ist ok

dann kann man über char(127) statt ein Zeichen auch ein Byte an die 
Ausgabe schicken.

statt
LCD_string(8,10,"2");
LCD_string(8,10,"\50\0");
eben
LCD_string(8,10,"\160\0"); oder so ähnlich, manchmal auch /

von leo (Gast)


Lesenswert?

Bernd G. schrieb:
> Ich rufe in der main() die Funktion LCD_string auf:
> LCD_string(8,10,"Auszugender Text");

Hrmpf, das ist ASCII und macht keine Probleme. Muss man dir alles 
vormalen?

e.g. ein Linux-Beispiel:
1
$ echo ü > ue.txt
2
$ xxd < ue.txt 
3
00000000: c3bc 0a

Also Unicode. Was dein Editor macht solltest du schon wissen.

leo

von Dirk B. (dirkb2)


Lesenswert?

Dann schau dir mal die Werte von pos_array für das Zeichen 127 und für 
128 an.

Also vom Compiler ausgeben lassen.

: Bearbeitet durch User
von Bernd G. (docbg)


Lesenswert?

Dirk B. schrieb:
> Dann schau dir mal die Werte von pos_array für das Zeichen 127 und für
> 128 an.
>
> Also vom Compiler ausgeben lassen.

Das werde ich morgen machen, gute Idee.
Gruß und danke

von Bernd G. (docbg)


Lesenswert?

Bernd G. schrieb:
> Dirk B. schrieb:
>> Dann schau dir mal die Werte von pos_array für das Zeichen 127 und für
>> 128 an.
>> Also vom Compiler ausgeben lassen.
>
> Das werde ich morgen machen, gute Idee.
> Gruß und danke

Hallo Dirk,
zur Zeit kann ich mein Projekt nicht weiter betreiben. Bin etwas knapp 
in Zeit und brauche auch mal eine ‚schöpferische Pause‘.
 Ich möchte aber nicht versäumen, dir für deine nette Unterstützung zu 
danken. Deine Beiträge waren diejenigen, die mir die meisten Denkanstöße 
gegeben haben und freundlich und sachlich waren. Dafür danke und alles 
Gute für dich.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

W.S. schrieb:
> leo schrieb:
>> Ich habe dein Interface kritisiert, welches genau 1 Zeichen Text
>> ausgab. [...]
>> Von Grafik war nicht die Rede. BTW: bei einem S/W-Display die Textfarbe
>> mitzugeben ist auch total unsinnig.
>
> Auf einem Grafik-Display IST von Grafik die Rede - und zwar
> ausschließlich Grafik. Nichts Anderes. Ein Textzeichen ist da nämlich
> auch eine Grafik, die eben pixelweise auf der Glotze plaziert werden
> muß.

Du willst leo einfach nicht verstehen. Das Interface Deiner tollen 
Zeichen-Malfunktion ist einfach sch...lecht. Einzelzeichen-Ausgabe? Da 
muss man ja in der Schicht darüber dauernd die Cursorposition 
nachrechnen, wenn man mehrere Zeichen hintereinander ausgeben will. Bei 
Proportionalschrift wirds dann richtig ätzend.

In der Regel gibt man Strings und nicht einzelne Zeichen aus. Dann kann 
die Textausgabefunktion den virtuellen Cursor intern nachziehen und 
Zeichen für Zeichen an der korrekten Position ausgeben, ohne dass man 
sich darum auch noch kümmern muss.

Zudem ist es sinnvoll, auch Funktionen anzubieten, bei denen man 
Cursor-Positionen und/oder Farben separat setzen kann. Das hat den 
Vorteil, dass man Text auch in kleineren Portionen sukzessive 
hintereinander ausgeben kann, falls dies notwendig sein sollte, ohne 
sich um aktuelle virtuelle Cursorpositionen und aktuell eingestellte 
Farben kümmern zu müssen.

Deine viel zu spezielle Funktion Zeichenausgabe() wäre dann einfach eine 
High-Level-Funktion, welche die Low-Level-Funktionen für SetCursor() und 
SetColor() und DrawText() nacheinander aufruft. Dann kann man DrawText() 
auch mehrfach hintereinander aufrufen und der Text landet immer an der 
richtigen Stelle, z.B.
1
SetCursor (300, 150);
2
SetColor (COLOR_BLACK, COLOR_WHITE);
3
SetFont (ARIAL_12);
4
DrawText ("Hello "); // wird an (300,150) ausgegeben
5
...
6
DrawText ("World"); // wird hinter "Hello " ausgegeben.

W.S. schrieb:
> Man braucht das Zeugs aus der Lernbetty nur nachzumachen

Wenn Sie so programmiert wurde:
1
int Zeichenausgabe (int X,      // Pixel von links 
2
                    int Y,      // Pixel von oben
3
                    char C,     // das Zeichen
4
                    der Font,   // Typ des Fonts je nach deinem Zeugs
5
                    die Farbe); // Typ der Farbe je nach deinem Zeugs

dann sicher nicht.

Das wäre bei obigem wesentlich flexibleren Interface höchstens eine 
Funktion (oder gar ein Macro), um das Ganze für Tippfaule abzukürzen. 
Aber ganz gewiss wäre das nicht die zentrale Textausgabefunktion, 
welche die Pixel auf dem Display setzt.

: Bearbeitet durch Moderator
von W.S. (Gast)


Lesenswert?

Frank M. schrieb:
> Das Interface Deiner tollen
> Zeichen-Malfunktion ist einfach sch...lecht. Einzelzeichen-Ausgabe? Da
> muss man ja in der Schicht darüber dauernd die Cursorposition
> nachrechnen, wenn man mehrere Zeichen hintereinander ausgeben will. Bei
> Proportionalschrift wirds dann richtig ätzend.

Beim Lesen deiner Zeilen wird mir danach, ausgesprochen unhöflich zu 
werden.

Also wenn du schon rein garnichts verstehst, dann lerne doch zuerst mal 
etwas dazu, bevor du derartig unzutreffendes Zeugs von dir gibst.

Einzelzeichen-Ausgabe? Na selbstverständlich! Das ist die Grundlage für 
alles Weitere. Die Stringausgabe setzt darauf auf. Du hast das ganze 
bloß nicht verstanden.

Also hier noch mal zum Nachlesen für dich:
1
/***************************************************************
2
 Zeichnet einen String im aktuellen Font an der
3
 angegebenen Stelle und liefert die Breite des Strings
4
 ***************************************************************/
5
int CgStr_at (int x, int y, char* P, word FontMode)
6
{ int z;
7
  while (*P)
8
  { z = CgCh_at(x,y,*P++, FontMode);
9
    x = x + z;
10
  }
11
  return (x);
12
}

So sieht sauberes Programmieren aus: Die String-Funktion setzt auf die 
Char-Funktion auf. Das schafft Klarheit in der Hierarchie und es 
vermeidet zwei parallele Funktionalitäten, die ohnehin dasselbe tun 
sollen.

Und - oh Wunder! - das ganze funktioniert auch mit proportionalen Fonts. 
In der Lernbetty stecken nämlich einige proportionale Fonts.

Und - oh zweites Wunder! - wenn man den Returnwert von CgStr_at() 
beachtet, dann kann man sogar mehrere Strings hintereinander ausgeben - 
OHNE daß man zu diesem Zwecke noch irgend eine globale Variable im GDI 
zum Speichern der X-Position vorhalten und initialisieren müßte (ohne 
beim Schreiben des GDI zu wissen, ob diese später überhaupt gebraucht 
wird).

Ich hatte die Struktur des GDI in der Lernbetty ganz bewußt einfach 
gemacht, um die Lernwilligen nicht zu überfrachten. Ich hatte durchaus 
überlegt, X und Y durch einen TPoint zu ersetzen, aber das macht sowohl 
beim Code schreiben als auch in der Ausführung den gleichen Aufwand, 
also hab ich's bei einzelnen Koordinaten belassen.

In meinen kommerziellen Projekten arbeite ich hingegen mit 
Device-Kontexten. Da sieht die Funktion dann so aus:
1
int CgCh_at (TDCB* DC, int X, int Y, char Ch); /* einzelnes Textzeichen zeichnen */

Der Grund dafür ist, daß das GDI nicht nur auf verschiedenen TFT's 
funktionieren soll, sondern eben auch die Ausgabe auf den Kassenbon und 
für Doppelpufferungen in einen MemoryDC zu erledigen hat. Da ändern sich 
je nach Device die Dimensionen, Farben etc.

Für die Lernbetty wäre das zuviel Overhead gewesen.

Und dein Vorschlag, das ganze auf 4 Funktionsaufrufe aufzublähen: 
Position setzen, Farbe setzen, Schrift setzen, String ausgeben - 
bedeutet eigentlich nur eines: gesteigerte Umständlichkeit. Nein, du 
hast das nicht wirklich bis zum Ende durchdacht, sondern einfach nur 
alles ignoriert, was dir nicht sofort in den Sinn gekommen ist, sondern 
etwas gründlicheres Nachdenken erfordert hätte.

So, du Schlaumeier und Erfinder von MINOS, dem völlig spezialen OS, wird 
dir jetzt ein wenig klarer, wie herum man sowas richtig macht?

W.S.

von Dirk B. (dirkb2)


Lesenswert?

Bernd G. schrieb:
> zur Zeit kann ich mein Projekt nicht weiter betreiben. Bin etwas knapp
> in Zeit und brauche auch mal eine ‚schöpferische Pause‘.

Danke für die Rückmeldung.

Ich würde (irgendwann) aber doch gerne wissen woran es liegt.

von Bernd G. (docbg)


Lesenswert?

Dirk B. schrieb:
> Ich würde (irgendwann) aber doch gerne wissen woran es liegt.

Bekommst du, versprochen

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

W.S. schrieb:
> Und - oh zweites Wunder! - wenn man den Returnwert von CgStr_at()
> beachtet, dann kann man sogar mehrere Strings hintereinander ausgeben

Okay, dieses kleine Detail hattest Du leider bei Deiner ursprünglich 
vorgestellten Funktion Zeichenausgabe() verschwiegen, nämlich dass Du 
den neuen X-Offset als Return-Wert zurückgibst. Dann passt das 
natürlich... in Deiner Welt.

Nichtsdestrotz kann man das auch anders aufziehen. Deshalb finde ich 
persönlich Deine Darstellung "Nur ich machs richtig und alles andere ist 
grundweg falsch" einfach zu großmäulig.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

W.S. schrieb:
> Man braucht das Zeugs aus der Lernbetty nur nachzumachen

Ne, das ist ein Beispiel wie mans NICHT macht.

von W.S. (Gast)


Lesenswert?

Frank M. schrieb:
> Okay, dieses kleine Detail hattest Du leider bei Deiner ursprünglich
> vorgestellten Funktion Zeichenausgabe() verschwiegen, nämlich dass Du
> den neuen X-Offset als Return-Wert zurückgibst.

Was meinst du eigentlich, warum die Funktion int und nicht void ist?

Und warum weißt selbst du so viele Jahre nach der Lernbetty noch immer 
nicht, wie man solche (und andere) Programmieraufgaben sinnvoll, 
effektiv und einfach löst?

Ich werfe das einem Neuling nicht vor, schließlich haben wir alle mal 
klein angefangen. En Neuling sollte deshalb als allererstes mal 
dazulernen, wenn er vor einem Problem steht - und er sollte nicht ohne 
zu lernen Ergebnisse haben wollen.

Aber jemandem wie dir werfe ich Ignoranz vor, denn du könntest (und 
solltest) es von deiner Position her besser wissen.

Nochwas: Dein Spruch zum Schluß ist sowohl dumm als auch beleidigend. Du 
bist es, den ich erst mit der Nase auf die Lösung habe stucken müssen.

Ich hingegen habe das alles schon vor Jahren gewußt und auch so 
geschrieben und zum Lesen bekanntgegeben.

Natürlich kann man alles auch anders machen - aber so wie ich das 
schon jahrelang mache, funktioniert es - und deshalb ist das meinerseits 
eben nicht "großmäulig", sondern einfach nur sachlich richtig.

W.S.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

W.S. schrieb:
> Und warum weißt selbst du so viele Jahre nach der Lernbetty noch immer
> nicht, wie man solche (und andere) Programmieraufgaben sinnvoll,
> effektiv und einfach löst?

Weil deine Lernbetty niemanden interessiert!
Da gibts ein paar DLs in deinem Thread, aber keine Antworten.
Die Google und Forensuche nach Lernbetty sieht auch eher mau aus.
Das könnte an deinem Codingstyle liegen ;)

W.S. schrieb:
> Aber jemandem wie dir werfe ich Ignoranz vor, denn du könntest (und
> solltest) es von deiner Position her besser wissen.
Es gibt Sätze die sollte jemand nicht bringen der im Gegensatz zu Frank 
M schon durch sehr viel dämliches Gelaber aufgefallen ist.
Wie dem Cortex-M4 ohne DSP Befehle LOL!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

W.S. schrieb:
> Was meinst du eigentlich, warum die Funktion int und nicht void ist?

Du hast es NICHT erklärt, was Deine Funktion zurückliefert. Hätte ja 
auch ein Error-Code sein können, wie C-Funktionen im allgemeinen 
Rückgabewerte behandeln. Ich hatte es jedenfalls nicht erraten können.

Es bleibt dabei: Ohne Deine Erklärung, was die Funktion 
Zeichenausgabe() zurückliefert, ist diese Funktion zur Ausgabe von 
Strings unbrauchbar. Diese Erklärung hattest Du nicht geliefert. Deshalb 
habe ich es kritisiert.

Daraufhin hattest Du die Erklärung nachgeliefert und ich habe 
Verständnis geübt. Was also willst Du noch von mir? Genugtuung?

> Und warum weißt selbst du so viele Jahre nach der Lernbetty noch immer
> nicht, wie man solche (und andere) Programmieraufgaben sinnvoll,
> effektiv und einfach löst?

Weil ich mir auch nach Jahren Deinen Lernbetty-Source nicht näher 
angeschaut habe. Dieser interessiert mich auch nicht die Bohne. 
Allerdings habe ich schon einige negative Kritiken zu Deinem Source 
gelesen. Das hat mir gereicht, um zu wissen, dass ich mir Deinen 
Lernbetty-Source, den Du bei allen Gelegenheiten anbietest wie sauer 
Bier, nicht anschauen brauche.

Nein, ich werde Deinen Lernbetty-Source nicht lesen. Ja, ich habe das 
Recht, Deinen Lernbetty-Source nicht zu lesen.

> Aber jemandem wie dir werfe ich Ignoranz vor, denn du könntest (und
> solltest) es von deiner Position her besser wissen.

Ja, ich weiß es besser. ;-)

> Nochwas: Dein Spruch zum Schluß ist sowohl dumm als auch beleidigend.

Wer beleidigt mit "dumm" gerade wen?

> Du
> bist es, den ich erst mit der Nase auf die Lösung habe stucken müssen.

Du meinst also, jeder andere der Leser hier konnte erraten, was die 
Funktion Zeichenausgabe() zurückliefert? Nämlich einen x-Offset, den Du 
beim nächsten Call von Zeichenausgabe() wieder reinstopfst?!?

> Ich hingegen habe das alles schon vor Jahren gewußt und auch so
> geschrieben und zum Lesen bekanntgegeben.

Du bist einfach Klasse. Aber leider kein Gott. Amen.

> Natürlich kann man alles auch anders machen

Eben. Man kann es und vor allem: man darf es.

W.S. schrieb:
> So, du Schlaumeier und Erfinder von MINOS

MINOS, die Sprache NIC und der NIC-Compiler stehen der Allgemeinheit 
nicht mehr zur Verfügung - nämlich aufgrund der Borniertheit eines 
Einzelnen im MINOS-Thread, der mal wieder meinte, wie in anderen 
Projekte-&-Source-Threads anderen seinen Programmier-Stil aufzwingen zu 
müssen und den TOs mitzuteilen, dass ihr Source einfach Scheiße ist.

Auf so einen Zoff habe ich keinen Bock. Ich muss mir ein 
Open-Source-Projekt, welches ein Geschenk an die Allgemeinheit war, 
nicht zerreissen lassen - aufgrund einer simplen 
Taster-Polling-Funktion, die überhaupt nicht das MINOS-Projekt inkl. 
NIC-Compiler repräsentiert. Nein, derjenige, der seine Religion in 
diversen P&C-Threads vorbetet und dabei schon einige P&C-Threads 
mutwillig gegen die Wand gefahren hat, hat MINOS noch nichtmals 
ausprobiert. Warum also sollte ich mir das antun und Deinen 
Lernbetty-Source lesen?!? Ganz im Gegenteil: Das schreckt ab!

Akzeptiere einfach: Jeder hat die Freiheit, seinen Source so zu 
gestalten, wie er es selber will. Du darfst natürlich höflich Kritik 
üben, aber nicht in dem großmäuligen Ton analog zu "Nur mein Source ist 
die Wahrheit, alles andere ist Scheiße!".

: Bearbeitet durch Moderator
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Frank M. schrieb:
> Nein, derjenige, der seine Religion in
> diversen P&C-Threads vorbetet und dabei schon einige P&C-Threads
> mutwillig gegen die Wand gefahren hat

Wobei ich mich da so langsam Frage wieso da nicht so langsam mal 
konsequent gelöscht wird.
Es ist ja bekannt wos hinführt sobald das W.S. auftritt.

von Bernd G. (docbg)


Lesenswert?

Bernd G. schrieb:
> Dirk B. schrieb:
>> Ich würde (irgendwann) aber doch gerne wissen woran es liegt.
>
> Bekommst du, versprochen

Hallo Dirk,
möchte gern mein Versprechen einlösen, habe aber noch keine Lösung, nur 
Phänomene für dich.
Inzwischen habe ich ein (minimales) Testprogramm benutzt, um die in der 
Funktion errechneten Werte auszugeben. Zur Sicherheit kurz der Code, die 
Font-Datei kennst du sicher noch:

//-----------------------------------------------------
void LCD_string(char *str)
{
  unsigned int pos_array;

  while(*str!= 0)
  {
    //calculate positon of ascii character in font array
    //bytes for header + (ascii - startcode) * bytes pro char)
    pos_array = 8 + (unsigned int)(*str++ - font_6x8[2]) * font_6x8[7];

    printf("%i \n", pos_array);

//    LCD_data(&font_6x8[pos_array], font_6x8[4]); //Argument 1: Data to 
send; Argument 2: len = width of char
  }
}

int main()
{
        LCD_string("~");

    return 0;
}

Bis zum 126. ASCII-Zeichen (Tilde) ist alles gut, die 
Array-Startposition wird mit 572 korrekt errechnet.
Das 127. Zeichen (⌂) ergibt drei Werte: -364, -880 und -940,
das 128. Zeichen (Ç) ergibt statt dem Soll-Wert 584 eine -526.

von Dirk B. (dirkb2)


Lesenswert?

Bernd G. schrieb:
> Das 127. Zeichen (⌂) ergibt drei Werte: -364, -880 und -940,
> das 128. Zeichen (Ç) ergibt statt dem Soll-Wert 584 eine -526.

Das Problem wird sein, das char signed ist.
Da wird 128 zu -128.
Zwei mögliche Lösungen hatte ich schon gepostet: 
Beitrag "Re: ASCII-Zeichen nach 128 in C auf DOGXL darstellen nicht möglich"

Wie hast du die Zeichen angegeben?
Als Hexcode oder als Zeichen im Editor?
Nur bei "\x7e\x7f\x80" kannst du sicher sein, dass du den richtigen Code 
hast.

von Dirk B. (dirkb2)


Lesenswert?

Bernd G. schrieb:
> das 128. Zeichen (Ç) ergibt statt dem Soll-Wert 584 eine -526.

In der Windows Code Page 1252 hat dieses Zeichen den Code
0xC7 = 0b11000111 = 199 (unsigned) = -57 (signed)
https://de.wikipedia.org/wiki/Windows-1252

von leo (Gast)


Lesenswert?

Bernd G. schrieb:
> Bis zum 126. ASCII-Zeichen (Tilde) ist alles gut, die
> Array-Startposition wird mit 572 korrekt errechnet.

Ehem: '572/6 + 32' = 127 # 6 bytes/char startend mit ASCII 32

> Das 127. Zeichen (⌂) ergibt drei Werte: -364, -880 und -940,

Das ergibt keinen Sinn.

> das 128. Zeichen (Ç) ergibt statt dem Soll-Wert 584

Und hier liegst du dann wieder ein Zeichen daneben.

Rechne noch mal nach, und wie schon eingeworfen signed vs. unsigned.

leo

von Dirk B. (dirkb2)


Lesenswert?

leo schrieb:
> Ehem: '572/6 + 32' = 127 # 6 bytes/char startend mit ASCII 32

Da fehlt noch die 8 als Offset für den Header (da wo die 32 und 6 
stehen)
Dann passt das. Auch bei dem soll für 128

von Dirk B. (dirkb2)


Lesenswert?

Ach und noch etwas

Bernd G. schrieb:
> unsigned int pos_array;
> ...
>     printf("%i \n", pos_array);

%i passt nicht zu einem unsigned int.
Da muss ein %u stehen.

Dann steht da auch wieder ein anderer Wert.

Der Compiler meckert das, bei entsprechender Warnstufe, auch an - als 
Warnung, nicht als Fehler.

von Bernd G. (docbg)


Lesenswert?

Dirk B. schrieb:
> leo schrieb:
>> Ehem: '572/6 + 32' = 127 # 6 bytes/char startend mit ASCII 32
>
> Da fehlt noch die 8 als Offset für den Header (da wo die 32 und 6
> stehen)
> Dann passt das. Auch bei dem soll für 128

Sorry, die 8 hatte ich tatsächlich vergessen

von Bernd G. (docbg)


Lesenswert?

Dirk B. schrieb:
> Das Problem wird sein, das char signed ist.
> Da wird 128 zu -128.
> Zwei mögliche Lösungen hatte ich schon gepostet:
> Beitrag "Re: ASCII-Zeichen nach 128 in C auf DOGXL darstellen nicht
> möglich"

In der Tat ist das (signed) char unbrauchbar. Habe jetzt unsigned char 
draus gemacht. Wie du schriebst, bekoome ich dann eine Warnung vom 
Compiler, die da lautet:
warning: pointer targets in passing argument 1 of 'LCD_string' differ in 
signedness [-Wpointer-sign]

Dirk B. schrieb:
> Wie hast du die Zeichen angegeben?
> Als Hexcode oder als Zeichen im Editor?
> Nur bei "\x7e\x7f\x80" kannst du sicher sein, dass du den richtigen Code
> hast.

Ich arbeite mit Code::Blocks und habe die Zeichen in der main in den 
Funktionsaufruf als Text (also beispielsweise LCD_string("ü"); 
eingegeben. Dann kommt als array-position 1328 heraus.
Gebe ich - wie von dir vorgeschlagen - das Zeichen als hex-wert ein 
(also LCD_string("\x81");) kommt korrekt 590 heraus.

von Dirk B. (dirkb2)


Lesenswert?

Bernd G. schrieb:
> Habe jetzt unsigned char
> draus gemacht. Wie du schriebst, bekoome ich dann eine Warnung vom
> Compiler, ...

Ich hatte noch eine zweite Lösung, die einen internen unsigned char 
Pointer nutzt. Durch den cast meckert der Compiler da nicht.

Bernd G. schrieb:
> Dann kommt als array-position 1328 heraus.
> Gebe ich - wie von dir vorgeschlagen - das Zeichen als hex-wert ein
> (also LCD_string("\x81");) kommt korrekt 590 heraus.

Das Problem mit ungleichen Zeichensätzen gibt es aber auch schon bei 
Windows alleine.
Der Editor hat einen anderen Zeichensatz als die Konsole (cmd.exe)
Das kannst du aber dem Compiler (irgendwie) mitteilen, dass er dann die 
Strings anpasst.
Wie das beim gcc geht, kann ich dir leider nicht sagen.

von Bernd G. (docbg)


Lesenswert?

Dirk B. schrieb:
> Ich hatte noch eine zweite Lösung, die einen internen unsigned char
> Pointer nutzt. Durch den cast meckert der Compiler da nicht.

Das hatte ich versucht, ich bekomme dann dieselbe compiler-Warnung.

Deine Tipps waren sehr hilfreich und haben mich der Lösung deutlich 
näher gebracht. Dafür vielen Dank.
ICh werde noch etwas weiter experimentieren, denn ich möchte natürlich 
auf 'direktem' Wege alle Zeichen eingeben können. Und ich merke, dass es 
noch viel zu lernen gibt. Aber schliesslich ist das ja auch der Sinn 
einer Freizeitbeschäftigung.

von Dirk B. (dirkb2)


Lesenswert?

Bernd G. schrieb:
> ICh werde noch etwas weiter experimentieren, denn ich möchte natürlich
> auf 'direktem' Wege alle Zeichen eingeben können.

Du kannst auch den Zeichensatz vom LCD anpassen. ;-)

Bernd G. schrieb:
> Das hatte ich versucht, ich bekomme dann dieselbe compiler-Warnung.

Hast du da auch den str in der Definition (und auch Deklaration) wieder 
auf char gesetzt?

von Bernd G. (docbg)


Lesenswert?

Dirk B. schrieb:
> Du kannst auch den Zeichensatz vom LCD anpassen. ;-)

Das LCD hat keinen Zeichensatz, es ist eine reine Punktmatrix. Deswegen 
ja das array, in dem die einzelnen Pixelmuster stehen.

Dirk B. schrieb:
> Hast du da auch den str in der Definition (und auch Deklaration) wieder
> auf char gesetzt?

Ich hatte unsigned angegeben.

von Bernd G. (docbg)


Lesenswert?

Bernd G. schrieb:
>> Hast du da auch den str in der Definition (und auch Deklaration) wieder
>> auf char gesetzt?
>
> Ich hatte unsigned angegeben.

also ich meine unsigned char

von Dirk B. (dirkb2)


Lesenswert?

Bernd G. schrieb:
> Das LCD hat keinen Zeichensatz, es ist eine reine Punktmatrix. Deswegen
> ja das array, in dem die einzelnen Pixelmuster stehen.

Das meinte ich. Du kannst das Array umsortieren.

Bernd G. schrieb:
> Ich hatte unsigned angegeben.

Ja, daher kommt die Warnung.

von S. R. (svenska)


Lesenswert?

Dirk B. schrieb:
> Du kannst das Array umsortieren.

Wichtig ist dann trotzdem, dass zumindest der Quelltextes einen 8 
Bit-Zeichensatz benutzt. UTF-8 wird die LCD-API garantiert nicht 
fressen, aber das ließe sich ja anpassen (*).

(*) UTF 8-Decoder plus latin1-Mapping sind nicht schwer. Man muss ja 
nicht gleich Arabisch und Aramäisch einbauen.

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.