www.mikrocontroller.net

Forum: Compiler & IDEs Zugriff auf mehrdimensionalen Char-Array AVR


Autor: Matthias J. (weteor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich versuche gerade eine LCD-Display mit einem ATMega16 anzusteuern. Das 
Display ist ein DOGM131 mit einem ST7565R-Controller. Das funktionert 
soweit auch gut.
Nun hab ich versucht, Text auf dem Display auszugeben.
Dafür habe ich eine Header Datei font.h, in welcher die einzelnen 
Buchstaben in einem zweidimensionalen Array gespeichert sind (Das ganze 
hab ich glaube ich irgendwo hier aus dem Forum). Die erste "Dimension" 
gibt an welcher Buchstabe gemeint ist (Reihenfolge ist wie 
dezimal-Ascii) und in der zweiten sind die Spalten-Bytes für das Display 
gespeichert. das ganze sieht dann so aus:
const char font[256][6] ={
{0x00,0x00,0x00,0x00,0x00,0x00},  //0x00
//...
//...
{0x00,0x7E,0x11,0x11,0x11,0x7E},  // 0x41 = 'A'
{0x00,0x7F,0x49,0x49,0x49,0x36},  // 0x42 = 'B'
{0x00,0x3E,0x41,0x41,0x41,0x22},  // 0x43 = 'C'
//.. usw.
} 

Im Programm definiere ich nun einen char-Array und versuche diesen über 
die Funktion "PrintMessage" auf dem Display ausgeben zu lassen, was 
nicht klappt. Hier ist einmal der Code, Fehlerbeschreibung kommt danach 
;)
#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>

#include "font.h"

// *Data->Pointer auf Char-Array, Page -> Welche DisplayZeile, Flip-> Zeichenumbruch ja/nein

uint8_t PrintMessage( char *Data, uint8_t Page, uint8_t Flip );

int main(void)
{
    // Hier stehen einige Hardwareinitialisierungen
        
    char Message[]  = {'a','b','c','\0'}; //wird komplett richtig angezeigt
    char Message2[] = {'A','b','c','\0'}; //das 'A' wird nicht richtig
                                          //angezeigt
    char Message1[] = "Abc"; //funktioniert gar nicht ... nur Datenmüll,
                             //viel länger als 3 Zeichen
    
    PrintMessage( Message , 0, 0);
    PrintMessage(Message1 , 1, 0);
    PrintMessage(Message2 , 2, 0);

    while(1)
    {
        //Ein bisschen Aktivitätsblinken
        ToggleBit( PORTC, PC5 );
        _delay_ms(1000);
    }
    return 0;
}

uint8_t PrintMessage( const char *Data, uint8_t Page, uint8_t Flip )
{

    uint8_t i=0;
    uint8_t Error = 0;
    
    SetCommand;                  //Display-KommandoModus
    SendByte( ( 0xb0 | Page ) ); // Set Page
    SendByte( 0x10 );            //Set Start Column
    SendByte( 0x00 );
    SetData;                     // Display-Datenmodus
    
    //Array bis zur Terminierung durchlaufen und ausgeben
    while ( ( 0 == Error ) && ( '\0' != *Data ) )
    {
        //Testfall, wenn 'A' gefunden ausgeben-> funktioninert immer
        if ( 65 == *Data) //auch mit if ('A' == *Data)
        {
            //SendByte sendet ein Byte per SPI an Display
            SendByte(font[65][0]);
            SendByte(font[65][1]);
            SendByte(font[65][2]);
            SendByte(font[65][3]);
            SendByte(font[65][4]);
            SendByte(font[65][5]);

        }
        
        // alle sechs Spalten für einen Buchstaben ausgeben
        // Das funktioniert nur für Zeichen > 'V'
        for (i = 0;i < 6; i++)
        {
            SendByte( font[*Data][i] );
        }
        
        // Pointer weitersetzen
        Data++;
    }

    return Error;
}

Die Anzeige funktioniert für alle Buchstaben und Zeichen die größer 
ascii-Zeichen 'V' (bzw dezimal 86)  sind . Für alle Zeichen darunter 
wird nur Datenmüll angezeigt. Ich kann sie aber richtig anzeigen, wenn 
ich die einzelnen Zeichen explizit mit SendByte(font[Zahl][Zahl]) 
angebe. Mir scheint also irgendetwas mit den Indizes falsch zu laufen. 
Ich hab im Quelltext noch ein paar Variationen mit Fehlerbild eingefügt.

Außerdem funktionieren die Zuordnungen
Message[] = "foo bar";
Message[8] = "foo bar";
nicht, was in C doch eigentlich funktionieren sollte, oder?

Wäre schön, wenn mir jemand auf die Sprünge helfen kann, was ich 
verkehrt mache....ich hab so das Gefühl, das ist was ganz fundamentales 
und ich sehe es vor lauter Probieren nur nicht mehr.

Gruß, Matthias

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
const char font[256][6]
Benötigt 1563 Byte Ram. Du hast aber beim ATmega16
nur 1k zur Verfügung....

Pack den Font erst mal ins Flash:
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Matthias J. (weteor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woah, vielen Dank!

Das wars. Ist ja auch total logisch, hab ich nur überhaupt nicht dran 
gedacht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.