mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit pgm_read_byte()


Autor: Nils S. (kruemeltee) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin gerade dabei, Linux-Framebuffer-Fonts für ein farbiges glcd zu 
verwenden und habe meine eigene Ausgabe-Routine geschrieben.
Diese funktioniert, wenn ich zum Testen ein Zeichen in ein Array im RAM 
lege und von dort meine Daten hole.
Wenn ich die daten mit pgm_read_byte oder pgm_read_byte_far (jeweils 
selbes ergebnis) hole, kommt nur ein Kästchen von 4x4 pixeln (denke ich, 
lässt sich an diesem mini Display schwer zählen).
Die verwendete Schriftart ist 8x8 Pixel gross, das Headerfile mit dem 
PROGMEM-array ist im Anhang.

Hier der Code, der funktioniert
char fd[8] = { 0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e };

void linux_putc(unsigned char x_off, unsigned char y_off, unsigned char font, unsigned short color, char c) {
  char w=8, h=8;
  char x, y;
  
  for(y = 0; y < h; y++) {
    for(x = 0; x < w; x++) {
      if(fd[y] & (1<<x)) put_px(x_off+x, y_off+y, color);
    }
  }
  
  return;
}

Und hier der Code, der nicht funktioniert:
void linux_putc(unsigned char x_off, unsigned char y_off, unsigned char font, unsigned short color, char c) {
  char w=8, h=8;
  char x, y;
  
  for(y = 0; y < h; y++) {
    for(x = 0; x < w; x++) {
      if(pgm_read_byte(&acorndata_8x8[c+y]) & (1<<x)) put_px(x_off+x, y_off+y, color);
 
    }
  }
  
  return;
}

Am ehesten vermute ich, dass ich pgm_read_byte falsch verwende, alles 
nötige dazu hier im Posting und im Anhang. Meine erste vermutung war, 
dass die Positionsangabe im Array (c+y) nicht stimmt.

Hier der Funktionsaufruf:

linux_putc(100, 100, NULL, GREEN, 'a');


Mein Controller ein AT90USB1287 @ 8Mhz. Der Display Treiber läuft 
einwandfrei, die Grafikfunktionen gehen alle und wie gesagt, wenn ich 
die Daten ins RAM lege, tut auch meine putc-Routine.

Ich kann mir dieses Verhalten nicht erklären und hoffe, dass von euch 
jemand meinen Fehler sieht.

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aaaah ich hab's nach viel herumprobieren doch noch rausbekommen. Es 
waren zwei Fehler drin.

1. Der Datentyp fürs Array passte nicht, so richtig: const unsigned char 
fontdata_...
2. Die Position im Array habe ich falsch berechnet, so richtig:
if(pgm_read_byte(&fontdata[y+(c*h)]) & (1<<x)) put_px(x_off-x+w, y_off+y, color);

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.