pgm_read_byte umschreiben

OP #1619389
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.
OP
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.
Gast
>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
Gast
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
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:
1
r = &enc_configdata[i++];

Gruß Denny
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.
Gast
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
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!
OP
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.
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"
OP
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.