Forum: Mikrocontroller und Digitale Elektronik Probleme mit pgm_read_byte()


von Nils S. (kruemeltee) Benutzerseite


Angehängte Dateien:

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
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.

von Nils S. (kruemeltee) Benutzerseite


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:
1
if(pgm_read_byte(&fontdata[y+(c*h)]) & (1<<x)) put_px(x_off-x+w, y_off+y, color);

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.