AVR-GCC - seltsames array-index verhalten

OP #6289559
Lesenswert?

Hallo,

vorab:
 - Ich benutzte Atmel Studio 7.0.1931
 - ein "normales" GCC C++ Projekt mit einem ATMEGA328P

Was mache ich:
ASCII-Zeichen via 2D-Bitmap Byte-Weise auslesen und über SPI auf eine 
Dot-Matrix ausgeben.

Problem:
In einer for-Schleife werden eine bestimmte Anzahl an Zeichen ausgelesen 
und in das Display geschrieben. Lese ich ein Zeichen ungespiegelt aus, 
starte also mit index = 0, erscheint das Zeichen fehlerhaft auf dem 
Display. Lese ich ein Zeichen allerdings "rückwärts"/"gespiegelt" aus, 
also index = 7 (ein Zeichen = 8x8 pixel), wird es richtig dargstellt.
Das ist sehr merkwürdig und diesem Problem bin ich bisher noch nie 
begegnet.
Zuerst dachte ich, vielleicht hat der Compiler ein Problem mit den 
Index-Variablen, und "volatile" benutzt, das hat nicht geholfen. Auch 
die Compiler-Optimierung "-O0 (none)" hat nichts gebracht.
Weiß jemand, warum das "vorwärts"-Auslesen probleme macht, das 
"rückwärts"-Auslesen aber nicht?

MfG

Hier der Code für "vorwärts":
1
//Bitmap:
2
char font8x8_basic[128][8]  = {
3
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0000 (nul)
4
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0001
5
    // [...]
6
    { 0x55, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00},   // U+0040 (@)
7
    { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00},   // U+0041 (A)
8
    { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00},   // U+0042 (B)
9
    { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00},   // U+0043 (C)
10
    { 0x55, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00},   // U+0044 (D)
11
    { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00},   // U+0045 (E)
12
    { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00},   // U+0046 (F)
13
    { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00},   // U+0047 (G)
14
    { 0xaa, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00},   // U+0048 (H)
15
    { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0049 (I)
16
    { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00},   // U+004A (J)
17
    { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00},   // U+004B (K)
18
    { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00},   // U+004C (L)
19
    { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00},   // U+004D (M)
20
    { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00},   // U+004E (N)
21
    { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00},   // U+004F (O)
22
    //[...]
23
    { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00},   // U+007D (})
24
    { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+007E (~)
25
    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff}    // U+007F
26
};
27

28
int charPtr = 0x40; // start at '@'
29
int segmentPtr = 0;
30
for (int i = 0; i < (128 * 2); i++) // 128 x 64 dot-matrix - print two lines
31
{
32
    spi.write((uint8_t)(font8x8_basic[charPtr][segmentPtr]));
33
    segmentPtr++;
34
    if (segmentPtr == 8)
35
        segmentPtr = 0;
36
    if ((i % 8 == 0) && (i != 0))
37
        charPtr++;
38
}

Hier der Code für "vorwärts":
1
int charPtr = 0x40; // start at '@'
2
int segmentPtr = 7;
3
for (int i = 0; i < (128 * 2); i++) // 128 x 64 dot-matrix - print two lines
4
{
5
    spi.write((uint8_t)(font8x8_basic[charPtr][segmentPtr]));
6
    segmentPtr++;
7
    if (segmentPtr < 0)
8
        segmentPtr = 7;
9
    if ((i % 8 == 0) && (i != 0))
10
        charPtr++;
11
}
Angehängte Dateien:
OP #6289598
Lesenswert?

oooooohhh meine Güte wie peinlich...meine Augen brauchen wohl Pause.
Sry für die Frage.
Auf den Bildern ist mir aufgefallen, dass "rückwärts" auch falsch ist.

Das Problem ist, dass if ((i % 8 == 0) && (i != 0)) am Ende der 
for-Schleife steht. Es müsste am Anfang stehen. Noch besser ist das if 
wegzulassen und in
if (segmentPtr == 8) mit rein zupacken.

richtiger Code:
1
int charPtr = 0x40; // start at '@'
2
int segmentPtr = 0;
3
for (int i = 0; i < (128 * 2); i++) // 128 x 64 dot-matrix - print two lines
4
{
5
    spi.write((uint8_t)(font8x8_basic[charPtr][segmentPtr]));
6
    segmentPtr++;
7
    if (segmentPtr == 8)
8
    {
9
        segmentPtr = 0;
10
        charPtr++;
11
    }
12
}

nja die Probleme sind doch meist so simpel^^

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren