Forum: Mikrocontroller und Digitale Elektronik pgm_read_byte umschreiben


von Albert K. (buzzed)


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.

von Denny S. (Gast)


Lesenswert?

Hallo!

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

Gruß Denny

von Albert K. (buzzed)


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.

von Oliver (Gast)


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

von gastlich (Gast)


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

von Denny S. (nightstorm99)


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:
1
r = &enc_configdata[i++];

Gruß Denny

von Karl H. (kbuchegg)


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.

von Oliver (Gast)


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

von Denny S. (nightstorm99)


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!

von Albert K. (buzzed)


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.

von Karl H. (kbuchegg)


Lesenswert?

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

  r = enc_configdata[i++];

von Karl H. (kbuchegg)


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"

von Albert K. (buzzed)


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.

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.