Forum: Compiler & IDEs Schriftart in GCC Programmieren


von Rudolf (Gast)


Lesenswert?

Hallo,

ich arbeite derzeit an einer LED-Leuchtschrift.
Buchstaben darstellen funktioniert soweit.
Nachdem ich aber kein GCC programmier Profi bin wollte ich euch einmal 
fragen wie man so eine schriftart abspeichert und dann abruft.

Derzeit lade ich die 9 Zeilen in globale Variablen und schiebe diese 
dann raus in Schieberegister


void font_klein_a(void) {
  ByteZeile1 = 0b00000000;
  ByteZeile2 = 0b00000000;
  ByteZeile3 = 0b00000000;
  ByteZeile4 = 0b01110000;
  ByteZeile5 = 0b00001000;
  ByteZeile6 = 0b01111000;
  ByteZeile7 = 0b10001000;
  ByteZeile8 = 0b10001000;
  ByteZeile9 = 0b01111100;
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wenn das funktioniert, ist das OK.

Du könntest dem Compiler noch bekannt machen, ob sich die Daten für die 
Zeichen ändern (wie jetzt) oder nicht (const Schlüsselwort). Der 
Compiler kann dann u.U. schnelleren oder schlankeren Code produzieren.

Du könntest statt vieler Variablen ein Feld (Array) benutzen und über 
den Index zugreifen. Damit können dann Schleifen programmiert werden.

Bei µC mit wenig RAM könntest du auch die Daten statt im RAM im 
Flash-ROM halten. Beim AVR ist das im AVR-GCC-Tutorial erklärt unter dem 
Schlüsselwort PROGMEM.

von Karl H. (kbuchegg)


Lesenswert?

Rudolf schrieb:

> Nachdem ich aber kein GCC programmier Profi bin wollte ich euch einmal
> fragen wie man so eine schriftart abspeichert und dann abruft.

Du musst die Daten aus dem Programm rausholen und in einer Tabelle 
ablegen.
Sinnvollerweise macht man das dann so, dass man den ASCII Code des 
auszugebenden Zeichens direkt als Index in diese Tabelle benutzen kann.

> Derzeit lade ich die 9 Zeilen in globale Variablen und schiebe diese
> dann raus in Schieberegister
>
>
> void font_klein_a(void) {
>   ByteZeile1 = 0b00000000;
>   ByteZeile2 = 0b00000000;
>   ByteZeile3 = 0b00000000;
>   ByteZeile4 = 0b01110000;
>   ByteZeile5 = 0b00001000;
>   ByteZeile6 = 0b01111000;
>   ByteZeile7 = 0b10001000;
>   ByteZeile8 = 0b10001000;
>   ByteZeile9 = 0b01111100;
> }

Du solltest in deinem C-Buch über Arrays nachlesen.
Wann immer du versucht bist, mehrere gleichartige Variablen anzulegen, 
die alle gleich heißen und sich nur durch eine laufende Nummer 
unterscheiden, dann willst du meistens ein eigentlich ein Array.

uint8_t DisplayByte[9];

jetzt hast du 9 gleichartige Variablen

  DisplayByte[0], DisplayByte[1], ... DisplayByte[8]

nur: Die Zahl in den eckigen Klammern beim Zugriff kann auch errechnet 
werden. Und da fängt dann die ganze Sache an interessant zu werden.

von Rudolf (Gast)


Lesenswert?

Das heißt mit den array meinst du das so oder?

uint8_t font[255][9] = {
//{...},{...},{....},{...},{...},{...},.........
//............................
//97. klammer auf = kleines a
{0b00000000, 0b00000000, 0b00000000, 0b01110000, 0b00001000, 0b01111000, 
0b10001000, 0b10001000, 0b01111100},

//{...},{...},{....},{...},{...},{...},...........
//............................
//255. klammer
{0,0,0,0,0,0,0,0,0}
                            };

von Karl H. (kbuchegg)


Lesenswert?

Rudolf schrieb:
> Das heißt mit den array meinst du das so oder?

ganz genau.
Wobei man nicht unbedingt alle Zeichen braucht.
Im ASCII Code sind die ersten 32 Zeichen zb so, dass es keine sinnvolle 
Darstellung dafür gibt (sind Steuerzeichen wie zb Zeilenvorschub).
D.h. man muss dafür daher auch keine Einträge in der Tabelle spendieren. 
Beim Zugriff auf die Tabelle da erst mal 32 abziehen, ist ja nicht das 
Thema.

von Rudolf (Gast)


Lesenswert?

Vielen Dank

Das mit den Steuerzeichen weiß ich. Die benütze ich für einen Reset des 
Controllers und die Blinkfrequenz.

Gibt es bei einen Mega32 auch die mölichkeit einen Text in den internen 
Speicher zu schreiben und diesen nach einen Neustart wieder auszulesen?

von Karl H. (kbuchegg)


Lesenswert?

Rudolf schrieb:

> Gibt es bei einen Mega32 auch die mölichkeit einen Text in den internen
> Speicher zu schreiben und diesen nach einen Neustart wieder auszulesen?

Natürlich.
Das EEprom ist dafür gedacht, dass man sich dort Werte ablegen kann, die 
zb auch einen Stromausfall überleben müssen.

von Rudolf (Gast)


Lesenswert?

Jetzt muss ich nochmal nachfragen ob es auch moglich ist die schriftart 
in das Flash zu schreiben da mit
uint8_t font[255][9] = {{....}.....{.....}}
fast der ganze Ram voll ist?

Danke schon mal für alle Antworten

von Klaus W. (mfgkw)


Lesenswert?

Rudolf schrieb:
> ob es auch moglich ist die schriftart
> in das Flash zu schreiben

Stefan B. schrieb:
> Bei µC mit wenig RAM könntest du auch die Daten statt im RAM im
> Flash-ROM halten. Beim AVR ist das im AVR-GCC-Tutorial erklärt unter dem
> Schlüsselwort PROGMEM.

von Rudolf (Gast)


Lesenswert?

Oh habe ich ganz übersehen DANKE

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.