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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.