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.
Hallo! Das Feld nicht im Flash ablegen sondern im SRAM. "PROGMEM" bei der Deklaration des Feldes löschen. Gruß Denny
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.
>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
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.
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!
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.
Albert K. schrieb: > Danke nochmal für die Antworten > > Ich hab das jetzt probiert mit > > r = &enc_configdata[i++]; r = enc_configdata[i++];
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"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.