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.