Forum: Compiler & IDEs AVR-GCC - seltsames array-index verhalten


von Peter (kaputteshirn)


Angehängte Dateien:

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
}

von pegel (Gast)


Lesenswert?

Ich würde erst einmal Pixel und Linien auf dem Display setzen.
Orientierung/RAM lässt sich verschieden einstellen.

Das muss man zuerst verstehen.

von Peter (kaputteshirn)


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

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.