Probleme mit pgm_read_byte()

OP Persönliche Seite #1776216
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
1
char fd[8] = { 0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e };
2

3
void linux_putc(unsigned char x_off, unsigned char y_off, unsigned char font, unsigned short color, char c) {
4
  char w=8, h=8;
5
  char x, y;
6
  
7
  for(y = 0; y < h; y++) {
8
    for(x = 0; x < w; x++) {
9
      if(fd[y] & (1<<x)) put_px(x_off+x, y_off+y, color);
10
    }
11
  }
12
  
13
  return;
14
}

Und hier der Code, der nicht funktioniert:
1
void linux_putc(unsigned char x_off, unsigned char y_off, unsigned char font, unsigned short color, char c) {
2
  char w=8, h=8;
3
  char x, y;
4
  
5
  for(y = 0; y < h; y++) {
6
    for(x = 0; x < w; x++) {
7
      if(pgm_read_byte(&acorndata_8x8[c+y]) & (1<<x)) put_px(x_off+x, y_off+y, color);
8
 
9
    }
10
  }
11
  
12
  return;
13
}

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.
Angehängte Dateien:
OP Persönliche Seite #1776321
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:
1
if(pgm_read_byte(&fontdata[y+(c*h)]) & (1<<x)) put_px(x_off-x+w, y_off+y, color);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.