Hallo, ich programmiere auf dem AT89C51RB2 und möchte im Flash ein Byte schreiben und auslesen. Ich benutze die API Funktionen von Atmel / Microchip. Da es sich um eine Mischung aus Assembler und C Funktionen handelt, habe ich einige Fragen. Wer kennt sich mit der API und dem Chip aus und kann helfen. Gruß Jürgen
:
Verschoben durch Moderator
Juergen M. schrieb: > Hallo, ich programmiere auf dem AT89C51RB2 und möchte im Flash ein Byte > schreiben und auslesen. Ich benutze die API Funktionen von Atmel / > Microchip. > Da es sich um eine Mischung aus Assembler und C Funktionen handelt, habe > ich einige Fragen. Wer kennt sich mit der API und dem Chip aus und kann > helfen. Tipp1: du bist in diesem Sub-Forum völlig falsch. Tipp2: Wenn du das nicht alleine herausfinden konntest, sehe ich sehr schwarz für eine Lösung deines eigentlichen Problems...
c-hater schrieb: > Tipp1: du bist in diesem Sub-Forum völlig falsch. Ich habe den Thread verschoben.
In der API ist folgende Funktion enthalten : /*F********************************************************************* ** * NAME: __api_rd_code_byte *----------------------------------------------------------------------- -- * PARAMS: * unsigned int address : address in flash memory to read * return: * unsigned char device : read value *----------------------------------------------------------------------- -- * PURPOSE: * This function allows to read a flash memory byte. *----------------------------------------------------------------------- -- * EXAMPLE: *----------------------------------------------------------------------- -- * NOTE: *----------------------------------------------------------------------- -- * REQUIREMENTS: ************************************************************************ **/ unsigned char __api_rd_code_byte (unsigned char code * pt_address) { return(*pt_address); } Für mich macht diese Funktion keinen Sinn , ich erkenne keinen Zugriff auf die Hardware Register Speicher Abgesehen davon passt der Text unter PARAMS: nicht zur Funktion Die komplette API habe ich angehängt
Juergen M. schrieb: > Abgesehen davon passt der Text unter PARAMS: nicht zur Funktion Wieso nicht? Der Parameter ist ein Zeiger auf einen unsigned char-Wert. Ich bi mit der Architektur nicht vertraut, aber die Chancen stehen gut, daß das speichertechnisch die gleiche Größe ist wie ein unsigned int auf dieser Plattform, nur daß der Inhalt eben eine Adresse ist. Ist halt etwas um die Ecke gedacht formuliert.
Juergen M. schrieb: > { > return(*pt_address); > } > > Für mich macht diese Funktion keinen Sinn , ich erkenne keinen Zugriff > auf die Hardware Register Speicher Aber der C-Compiler. Der erkennt aus der return-Zeile, daß er aus der angegebenen Adresse ein Byte holen und zurückliefern soll (* ist in C der Operator für den Inhalt einer Speicherzelle). Gute Compiler können den generierten Assemblercode ausgebe, da wirst Du den Zugriff auf die Hardwareregister sehen. C-Code ist schließlich eine Abstraktion von Hardware, das ist einer seiner Zwecke. Gruß Klaus (der soundsovielte)
Man muss allerdings dazu sagen, das MCS51 schon einen Unterschied zwischen Programmspeicher und Datenspeicher macht. Auf Assemblerebene sind das dann MOVC A,@DPTR für den Programmspeicher und MOVX A,@DPTR für Daten. Die API lässt es also offen, was da nun wirklich gelesen wird. So gilt das nur für den Sonderfall, das RAM und Flash per Hardware in den gleichen Bereich gelegt werden (/RD und /PSEN verUNDet)
:
Bearbeitet durch User
Juergen M. schrieb: > Für mich macht diese Funktion keinen Sinn , ich erkenne keinen Zugriff > auf die Hardware Register Speicher Klingt eher nach dürftigen C-Kenntnissen, es ist alles korrekt. Den * Operator kann man im C-Buch nachlesen. "code" ist ein Schlüsselwort für den Keil C51 und nicht allgemein portabel. Es sagt dem Compiler, daß er auf den Flash zugreifen soll, also mit MOVC. Juergen M. schrieb: > Abgesehen davon passt der Text unter PARAMS: nicht zur Funktion Daran ist alles korrekt. Du übergibst einen Pointer (int) und liest das Byte (char), auf das er zeigt.
Matthias S. schrieb: > Man muss allerdings dazu sagen, das MCS51 schon einen Unterschied > zwischen Programmspeicher und Datenspeicher macht. Es gibt da noch mehr: https://www.keil.com/support/man/docs/c51/c51_le_memtypes.htm
Peter D. schrieb: > "code" ist ein Schlüsselwort für den Keil C51 und nicht allgemein > portabel. Ahh, verstehe. Keil war mir immer zu teuer :-)
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.