Forum: Mikrocontroller und Digitale Elektronik Grafikdaten im Flash ablegen


von Benedikt (Gast)


Lesenswert?

Hallo,
ich versuche gerade beim M16C 64kB Grafikdaten über Assembler an
Adresse A0000 (oberster Flash Block bei 384kB) ins Flash zu schreiben.
Dazu verwende ich ein einfaches Assemblerprogramm (eigentlich kein
Programm, sondern nur Daten):
.section Grafikdaten
.org a0000h
.Byte "hier stehen die Grafikdaten"

Solange ich bei org unter a0000 bleibe funktioniert es, aber a0000
aufwärts verursacht einen Fehler beim Compilen:
test.a30 2 Error (asp30): Operand value is not defined

Nun das nächste Problem:
Ich schreibe jetzt, sagen wir mal 10 Bilder mit je 1024Bytes ins Flash
an Adresse A0000.
Wie kann ich in C ein Array erzeugen, das genau diese Daten enthält,
also an Adresse A0000 beginnt und in etwas so aufgebaut ist:
Bilder [10] [1024] ?

von Matthias (Gast)


Lesenswert?

Hi

IIRC ist es nötig die Zahl für den Assembler als Zahl zu markieren ->
du mußt eine Null vor die eigentlich Zahl stellen. Ansonsten kann der
Assembler nicht zwischen einer irgendwo definierten Konstante A0000h
und deiner Zahl A0000h unterscheiden.

.org 0a0000h sollte also funktionieren.

bilder[10][1024] dürfte eigentlich nicht funktionieren da bilder[10]
einen Pointer zurückgeben müßte. Diese Pointer müßtest du in einer
Schleife getrennt initialisieren.

uint8_t * bilder;

bildbayte = *(bilder+1024*x+y);

für den Zugriff auf Bild x an Byte y sollte aber funktionieren.

Matthias

von Benedikt (Gast)


Lesenswert?

Super, Danke !
Das mit der vorgestellten 0 hat schonmal funktioniert.
Das mit den Pointern bekomme ich dann hoffentlich auch noch hin, sowas
lernt man leider in der Schule in Informatik nicht. Und die meisten C
Tutorials sind für Mikrocontroller eher weniger zu gebrauchen.

von Benedikt (Gast)


Lesenswert?

Eine frage habe ich noch zu dem Pointer:
Wie bekomme ich die Adresse a0000h in den Pointer ?
In allen Beispielen werden nur Variablenadressen mit
Pointer=&Variable geladen, aber ich muss benötige ja sowas wie
Pointer = a0000h, was aber in einem Fehler beim Compilen endet.

von Matthias (Gast)


Lesenswert?

Hi

pointer = (uint8_t *)0xA0000;

Matthias

von Benedikt (Gast)


Lesenswert?

So habe ich das auch gemacht, der Compiler meldet keinen Fehler, aber
auf dem LCD erscheint etwas, das eher nach Programmcode aussieht.
Im Debugger sieht man, dass der Pointer nicht mit A0000h initialisiert
wird, sondern mit 0. Aber die Software ist doch OK, oder ?


    char *_far Bilddaten;

    Bilddaten= (unsigned char *)0xA0000;

    for (y=0; y<8; y++)
      for (x=0; x<256; x++)
          {SendCom (29);   //Data Write
           SendDat (*Bilddaten);
           Bilddaten++; }

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.