Forum: Mikrocontroller und Digitale Elektronik Displayansterung mit AT91SAM9263


von Sebastian (Gast)


Lesenswert?

Hallo @ all

Ich habe das Evaluation Board AT91SAM9263. Dort ist ein Display mit 
320x240 Pixel verbaut.

Folgendes habe ich bis jetzt geschafft:

1. Display erfolgreich initialisiert
2. allen Pixeln eine Farbe zugeordnet


Die Farbwerte für jeden Dipslaypixel habe ich in einem großem Array 
abgespeichert. Das Array besteht aus 76800 Elementen (320x240)Für die 
Intitialisierung des Arrays habe ich eine For-Schleife verwendet. Diese 
schreibt in jede Speicherzelle den Farbwert. Anschließend aktiviere ich 
den DMA-Controller und den LCD-Controller. Nun wird auf dem Display die 
Farbe dargestellt.

Im nächsten Schritt wollte ich ein 2 dimensionales Array auf dem Display 
ausgeben (7x15 Pixel) Dies soll später mal einem Buchstaben entsprechen. 
Hierzu habe ich eine verschachtelte Vorschleife verwendet. Die wird auch 
erfolgreich durchlaufen. Die neunen Farbinformationen stehen im externen 
Speicher. Nun will ich wieder den DMA-Controller und den LCD-Controller 
einschalten. Jedoch funktioniert dieses nicht. Er kann nicht auf das 
DMA-Enable-Register zugreifen.

Für den Zugriff auf die LCD-Controller und DMA-Controller-Register 
benutze ich einen Pointer der auf eine Struktur zeigt. Dies funktioniert 
auch wenn ich eine einfache For-Schleife verwenden. Verwende ich jedoch 
eine verschachtelte For-Schleife geht anscheinend die Adresse, die im 
Pointer gespeichert wird verloren.

Hier mein Quellcode:

void lcd_ctrl_init ()
{
  unsigned long value;
        unsigned int *ptr_lcd_daten;
        unsigned int i,j,farbe,k,l;

        // !!!!!! Pointer auf Struktur erzeugen !!!!!
        AT91PS_LCDC pLCD = (AT91PS_LCDC) AT91C_BASE_LCDC;

        farbe = 0xAAAAAAAA;

        ptr_lcd_daten = AT91C_SDRAM;

        for(i=0; i<=15; i++)
        {
          for(j=0; j<=7; j++)
          {
            *ptr_lcd_daten = 0xFFFFFFFF;
             ptr_lcd_daten = ptr_lcd_daten + 1;
          }
        }

        // !!!!!! Hier muss der Fehler liegen  !!!!
        /* DMA Enable Register */
        // mit dem Pointer auf das DMA-Enable Register zugreifen
        pLCD->LCDC_DMACON    = AT91C_LCDC_DMAEN; /* DMA Enable */

        /* Power Control Register */
  pLCD->LCDC_PWRCON    = AT91C_LCDC_PWR | 0x0c;  /* POWER ON */
  }


Ich habe schon versucht den Pointer auf die Struktur global anzulegen, 
jedoch funktioniert dies auch nicht. Kann jemand einen Tip geben was ich 
falsch mache?

von Sebastian (Gast)


Lesenswert?

Hat denn keiner einen Tip für mich?

von majo (Gast)


Lesenswert?

Pointer die auf Hardwareregister zeigen müssen immer volatile sein!!!!

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.