www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Grafikdaten im Flash ablegen


Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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] ?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

pointer = (uint8_t *)0xA0000;

Matthias

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++; }

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.