Flash Byte lesen / schreiben auf AT89C51RB2

OP #7162358
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
Gast #7162914
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...
OP #7164479
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
Angehängte Dateien:
Gast #7164491
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.
#7164507
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)
(Firma: matzetronics) #7164535
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)
#7164536
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren