mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik pgm_read_byte umschreiben


Autor: Albert K. (buzzed)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

Wie mein Betreff verrät habe ich ein Problem mit der
Funktion

pgm_read_byte

Ich möchte den ENC28J60 Lan-Chip programmieren
und da kommt eben diese Zeile vor.

Da ich den Baustein aber nicht mit einem AVR Controller programmieren
möchte, sondern mit einem NXPLPC935 von (ich glaube Phillips)
muss ich den Code umändern.

Soweit so gut, ich habe ein Problem mit der obengenannten Operation.

Im Code wird diese so verwendet:

r = pgm_read_byte( &enc_configdata[i++] );

( enc_configdata ist ein Feld oder so und mein Problem ist nun , dass 
mein uC diese Operation nicht kennt)

Könnte mir einer von euch einen Tipp geben wie ich diese Codezeile 
umschreiben kann um den selben Effekt zu erhalten oder wie ich die 
Funktion einbinden kann?

Ich kann ja schlecht die AVR Library einbinden , da mein uC ja ein 
anderer ist oder?

MfG

Albert K.

Autor: Denny S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Das Feld nicht im Flash ablegen sondern im SRAM.
"PROGMEM" bei der Deklaration des Feldes löschen.

Gruß Denny

Autor: Albert K. (buzzed)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey

Danke für die Antwort aber ich kenn mich ehrlich gesagt nicht so gut
in der Materie aus ^^

PROGMEM hab ich schon gelöscht bei der Felderstellung
aber die Funktion erkennt er deswegen trotzdem noch nicht.

Wie meinst du das in den SRAM ablegen?

MfG

Albert K.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich kann ja schlecht die AVR Library einbinden, da mein uC ja ein
>anderer ist oder?

Du könntest aber mal in der avrlibc-Doku nachsehen, was die Funktion 
eigentlich macht.

Und wenn du dann rausgefunden hast, das die eine Bytevariable aus dem 
bordeigenen EEPROM des AVR liest, kannst du dir überlegen, wie das alles 
auf deinen Prozessor zu übertragen ist.

a) Hat der überhaupt ein EEPROM?
a1) Wenn ja, wie spricht man das in deinem Progarmmiersystem an?
b) wenn nicht, gibt es sonst irgend einen vom Programm aus 
beschreibbaren nichtflüchtigen Speicher?
c) Wenn auch nicht, wie bekommst du da extern so etwas dran?
c) Wenn auch nicht, wie lässt sich deine Schaltung auf einen AVR 
umbauen?
c) Wenn auch nicht, lass es.

Oliver

Autor: gastlich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pgm_read_byte() liest ein byte aus dem program-memory (sprich flash beim 
AVR).

du könntest also

r = pgm_read_byte( &enc_configdata[i++] );

durch

r =  &enc_configdata[i++];

ersetzten, wenn dein Compiler/Linker weiss wo enc_configdata liegt.

Ich schätze mal im AVR projekt ist vor der declaration/definition von 
enc_configdata noch ein Attribut vorhanden, das mitteilt, das 
enc_configdata im flash oder pgm Bereich liegt.

Gruss Claudio

Autor: Denny S. (nightstorm99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Albert K. schrieb:
> Hey
>
> Danke für die Antwort aber ich kenn mich ehrlich gesagt nicht so gut
> in der Materie aus ^^
>
> PROGMEM hab ich schon gelöscht bei der Felderstellung
> aber die Funktion erkennt er deswegen trotzdem noch nicht.
>
> Wie meinst du das in den SRAM ablegen?
>
> MfG
>
> Albert K.

Sollte dann glaube ich so werden:
r = &enc_configdata[i++];

Gruß Denny

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gastlich schrieb:
> pgm_read_byte() liest ein byte aus dem program-memory (sprich flash beim
> AVR).
>
> du könntest also
>
> r = pgm_read_byte( &enc_configdata[i++] );
>
> durch
>
> r =  &enc_configdata[i++];
>
> ersetzten, wenn dein Compiler/Linker weiss wo enc_configdata liegt.

  r =  enc_configdata[i++];

Für eine erste Version ist das sicherlich ausreichend.
Aber letztenendes wird man sich die betreffende Stelle ganzheitlich 
ansehen und dann entscheiden, was eigentlich an dieser Stelle die 
Absicht war und dann weiter entscheiden ob diese Absicht beim 
Zielprozessor überhaupt noch notwendig ist bzw. wie man diese Absicht 
auf dem Zielprozessor implementiert.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AAARGH,

vergiß alles, was ich geschrieben haben, ...

pgr_read_byte liest eine Bytevariable (eigentlich eine Konstante) aus 
dem Programmspeicher. Diese wird dort vom Compiler per PROGMEM angelegt.

Wenn du ausreichend Platz im Ram deines Prozessors hast, kannst du auch 
einfach schreiben:

r = nc_configdata[i++];
und bei der Deklaration von nc_configdata das PROGMEM weglassen.

Wenn nc_configdata allerdings nicht ins Ram passt, gilt sinngemäß doch 
wieder mein Beitrag vor diesem ;-)

Oliver

Autor: Denny S. (nightstorm99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Für eine erste Version ist das sicherlich ausreichend.
> Aber letztenendes wird man sich die betreffende Stelle ganzheitlich
> ansehen und dann entscheiden, was eigentlich an dieser Stelle die
> Absicht war und dann weiter entscheiden ob diese Absicht beim
> Zielprozessor überhaupt noch notwendig ist bzw. wie man sie dort
> umsetzen kann.

Dann sollte er aber den ganzen Code hier rein stellen!

Autor: Albert K. (buzzed)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke nochmal für die Antworten

Ich hab das jetzt probiert mit

r = &enc_configdata[i++];

aber da bekomm ich ne Fehlermeldung

C260: '=': pointer truncation

Die deklaration sieht so aus von meinem Feld

static unsigned char enc_configdata[] = {

  // enc registers

  // tx buffer
  ENC_REG_ETXSTL, LO8(ENC_TX_BUFFER_START),
  ENC_REG_ETXSTH, HI8(ENC_TX_BUFFER_START),
  ENC_REG_ETXNDL, LO8(ENC_TX_BUFFER_END),

MfG

Albert K.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Albert K. schrieb:
> Danke nochmal für die Antworten
>
> Ich hab das jetzt probiert mit
>
> r = &enc_configdata[i++];

  r = enc_configdata[i++];

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Denny S. schrieb:
> Karl heinz Buchegger schrieb:
>
>> Für eine erste Version ist das sicherlich ausreichend.
>> Aber letztenendes wird man sich die betreffende Stelle ganzheitlich
>> ansehen und dann entscheiden, was eigentlich an dieser Stelle die
>> Absicht war und dann weiter entscheiden ob diese Absicht beim
>> Zielprozessor überhaupt noch notwendig ist bzw. wie man sie dort
>> umsetzen kann.
>
> Dann sollte er aber den ganzen Code hier rein stellen!


Volle Zustimmung.
Aber wie gesagt, fürs erste wirds reichen.


Wort für Wort Übersetzungen gehen bei Programmen aus den gleichen 
Gründen schief, warum sie auch bei gesprochener Sprache schief gehen. 
Ein Wort transportiert eine Bedeutung und es ist diese Bedeutung die bei 
der Zieltransformation ankommen muss und nicht die 
Wörterbuchentsprechung.

CIA, 60-er Jahre. Erster Test eines Übersetzungsprogramms 
Englisch-Russisch und vize versa
Quelltext: "Der Geist ist willig aber das Fleisch ist schwach"
Maschine macht grummel grummel grummel und spuckt etwas auf Russisch 
aus.
Da keiner der Zuschauer Russisch kann, lässt man rückübersetzen.
Heraus kommt: "Der Wodka ist stark aber das Steak ist vergammelt"

Autor: Albert K. (buzzed)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey

Danke :)
Hab das & entfernt und jetzt funktionierts :)

Ich sollte allerdings doch zusehen dass ich
das Feld irgendwie in den Romspeicher krieg oder halt
Programmspeicher, weiß nicht genau ich kenn mich nicht sooo gut aus.

Danke für Eure Hilfe auf alle Fälle :)

MfG

Albert K.

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.