www.mikrocontroller.net

Forum: Compiler & IDEs atmega64, GCC 3.3.1


Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo!

wer zeigt mir meinen Fehler auf?:



ich möchte einen Datenblock "pgm_data[8]" im Programmspeicher ablegen
und zur laufzeit wieder abholen

Das habe ich wie folgt programmiert:

#include <avr/pgmspace.h>

// Das kommt auch im Flash an:
prog_uchar pgm_data[8] = { 2,3,4,5,6,7,8};


// ein paar Variablen im RAM
unsigned char ram_data[8];
unsigned char i;

// Diese Schleife sollte doch die pgm-Daten in sram_data kopieren,
// tut sie aber nicht.

    for(i=0;i<8;i++)
    {
       ram_data[i] = pgm_data[i];
    }


// Das hier wird erzeugt - muss da nicht ein LPM-Befehl entstehen:


    for(i=0;i<8;i++)
 27c:  90 e0         ldi  r25, 0x00  ; 0
 27e:  35 e1         ldi  r19, 0x15  ; 21
 280:  a3 2e         mov  r10, r19
 282:  31 e0         ldi  r19, 0x01  ; 1
 284:  b3 2e         mov  r11, r19
 286:  ac 0e         add  r10, r28
 288:  bd 1e         adc  r11, r29
 28a:  d5 01         movw  r26, r10
 28c:  ec e8         ldi  r30, 0x8C  ; 140
 28e:  f0 e0         ldi  r31, 0x00  ; 0
    {
       ram_data[i] = pgm_data[i];
 290:  81 91         ld  r24, Z+
 292:  8d 93         st  X+, r24
 294:  9f 5f         subi  r25, 0xFF  ; 255
 296:  98 30         cpi  r25, 0x08  ; 8
 298:  d8 f3         brcs  .-10       ; 0x290
    }




Wer kann mir da helfen???
Gruß Martin

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies Dir mal das Kapitel über `program space strings' in der Doku
durch.  Du mußt sowas wie pgm_read_byte() benutzen, um die Daten aus
dem Flash zu lesen.

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pgm_read_byte bzw. _LPM  hat mir erstmal weitergeholfen, vielen Dank.

aber von meinem (begrenzten) C-Verständnis her müsste doch mein
Beispiel auch ohne pgm_read_byte funktionieren.

Das Feld pgm_data[8] ist doch extra als "prog_uchar" definiert
worden?!


Gruß Martin

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber von meinem (begrenzten) C-Verständnis her müsste doch mein
> Beispiel auch ohne pgm_read_byte funktionieren.

Nein, der GCC kann das nicht automatisch handhaben, weil er nichts von
Harvard-Architekturen wissen will.

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.