Forum: Mikrocontroller und Digitale Elektronik Flash Byte lesen / schreiben auf AT89C51RB2


von Juergen M. (juergen_m510)


Lesenswert?

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
von c-hater (Gast)


Lesenswert?

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...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

c-hater schrieb:
> Tipp1: du bist in diesem Sub-Forum völlig falsch.

Ich habe den Thread verschoben.

von Peter D. (peda)


Lesenswert?

Juergen M. schrieb:
> .. habe
> ich einige Fragen.

Frag einfach mal.

von Juergen M. (juergen_m510)


Angehängte Dateien:

Lesenswert?

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

von Nachdenklicher (Gast)


Lesenswert?

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.

von Klaus S. (kseege)


Lesenswert?

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)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Peter D. (peda)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
Noch kein Account? Hier anmelden.