www.mikrocontroller.net

Forum: Compiler & IDEs Schriftart in GCC Programmieren


Autor: Rudolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rudolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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}
                            };

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rudolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rudolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rudolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh habe ich ganz übersehen DANKE

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.