Forum: Mikrocontroller und Digitale Elektronik xc866 indirekt adressierbaren speicher in C beschreiben


von xc866 (Gast)


Lesenswert?

hallöchen zusammen.

Weiss jemand von euch wie man bei einem u kontroller (XC866 VON 
INFINEON) den indirekt adressierbaren bereich in der programmiersprache 
c anspricht?
in assembler benötigt man MOVC oder@ aber in C?????


ich wollte daten in einem array speichern nun habe ich zu viel im 
dataflash und der compiler motzt. aber das xram wäre noch leer.

kann man das auch mit dem dave initialisieren?

hat jemand eine Idee?

gruss erol

von crazy horse (Gast)


Lesenswert?

das dürfte ziemlich stark vom Compiler abhängen - um welchen geht es 
denn??
xdata oder far könnten Möglichkeiten bei der Deklaration sein. Kenne 
aber den Prozessor nicht.

von xc866 (Gast)


Lesenswert?

Ich arbeite mit dem u Vision compiler...

wie könnte man das deklarieren?

gruss erol

von Carsten S. (carsten)


Lesenswert?

Was willst du jetzt machen?
Eine Variable im Codespeicher ablegen um mit "movc" zuzugreifen
(z.B. code int test[5] = {1,2,3,4,5};)
oder eine Variable im externen RAM ablegen um mit movx zugreifen
(z.B. xdata int test2[5] = {6,7,8,9,0};)

von Carsten S. (carsten)


Lesenswert?

mit externen RAM meinte ich internes XRAM - sorry

von Matthias (Gast)


Lesenswert?

Ich kenne zwar nicht genau den XC866, vermute aber das das XRAM zwar 
intern im µC liegt, physikalisch jedoch genau so angesprochen wird, wie 
externer Speicher.

mit:
  #include <absacc.h>
  ...
  x = XBYTE[0x1000];
kannst Du z.B. direkt auf XRAM zugreifen.

Eleganter geht es mit der Methode von Carsten, wobei Du dem Linker 
mitteilen musst, wo der XRAM-Bereich liegt. Der XRAM Zugriff ist 
wesentlich langsamer.

Ein deutlich schneller Zugriff auf XRAM-Bereiche ist über PDATA möglich 
(max. 256 Byte Bereich = 1 Page). Auch hier muss unbedingt der Linker 
wissen, wo die PDATA-Page liegt.

z.B. int pdata test2[5] = {6,7,8,9,0};

Gruß
Matthias

von xc866 (Gast)


Angehängte Dateien:

Lesenswert?

Ja ich will ein array ins xram schreiben.

also mit der dekleration:

z.B. xdata int test2[5] = {6,7,8,9,0};)

scheint es mir am einfachsten.
Geschwindigkeit spielt keine rolle...

wie teile ich dem linker den bereich mit? Befehle?

im datei anhang ist die memory map für xram F000H bis F200H iost etwas 
verwirrend....

gruss erol

von Carsten S. (carsten)


Lesenswert?

Setzte in den Projektoptionen unter Target den Haken bei "Use On-chip 
XRAM (0xF000-0xF1FF)"

von xc866 (Gast)


Lesenswert?

cool funktioniert!! so einfach! aber wird nirgens beschrieben... weiss 
man anscheinend einfach ;-)

für was ist das das on chip Rom 0x0-0x2fff , 0xa000 - 0xafff ?

der memory map nach müssen ja noch einige Kb Dataspeicher verfügbar 
sein. ist dieser auch so einfach zu beschreiben wie das xram?

gruss erol

von Carsten S. (carsten)


Lesenswert?

0x0000-0x2FFF sind die 3 Code-Flash-Bereiche 
(0x0000-0x0FFF,0x1000-0x1FFF,0x2000-0x2FFF).

Der Bereich 0xA000 - 0xAFFF ist das Datenflash. Dieses kann als 
Programmspeicher oder zur EEPROM-Emulation genutzt werden.

von xc866 (Gast)


Lesenswert?

das heist die 4 Kb der D-Flash bank könnten auch noch genutz werden um 
variablen zu speichern?

0xA000 - 0xAFFF

ist dieser Speicher bereich in c auch mit einer deklaration 
anzusprechen?

da es sich um einen nicht flüchtigen speicher handelt müsste man die 
daten ja auch wider explizit löschen können...

gruss erol

von Carsten S. (carsten)


Lesenswert?

Als Variablenspeicher ist der D-Flash nicht unbedingt gedacht, mehr zum 
sichern von erfassten Daten (Datalogger für z.B. Temperaturwerte, etc).

Man muss hierbei beachten, dass ein Flash nicht unedlich oft 
schreib-/löschbar ist und du nicht jede Speicherstelle einzeln 
schreiben/löschen kannst.
Du legst ja deine Variablen bei anderen µCs auch nicht ins EEPROM - 
dafür ist ja der RAM und wenn der nicht reicht, nimm die XC88x (die 
haben 1kB mehr RAM)

von xc866 (Gast)


Lesenswert?

es handelt sich streng genommen auch um messwerte welche ich erfasse. 
sie werden allerdings nach einer Stunde wider mit aktuellen 
überschrieben. und nur im fehlerfall zur analyse ausgelesen.
nun da ich da xram jetzt im griff habe kann ich alle 2min einen 
datensatz erfassen. mit den 4 kb des d-flashes würde das noch 
detailierter gehen.

wenn ich allerdings das manual von infineon bezüglich EEprom emulation 
lese sieht das ziemlich kompliziert aus (in assembler). wenn das in C 
auch so aufwändig ist werde ich es so belassen und mich mit einer 
aufzeichnung alle 2 min zufrieden geben...

ausser es ist relativ einach zu lösen mit c. aber da findet man nirgens 
die befehle für c nur für asm.
kann man das in c einfacher realisieren?

gruss erol


von Carsten S. (carsten)


Lesenswert?

Es ist kompliziert! Du greifst dabei auf Flashroutinen des Bootroms zu, 
etc.
Besser ist regelmäßig abfragen.

Wenn du die Messwerte irgendwo ohne PC (oder sonstige externe Anbindung) 
erfassen musst, und dein Gerät wird zwischendurch ausgeschaltet kommst 
du halt nicht um die E²-Emulation herum. Aber wenns nicht zwingend 
erforderlich ist, lass es sein.

Ein Alternative ist über die SSC im SPI-Modus ein serielles EEPROM 
anzusprechen (oder für sehr viele Daten eine SD-Karte)

von xc866 (Gast)


Lesenswert?

ok. das habe ich eben vermutet. Ja die Möglichkeit mit dem externen 
eeprom über die ssc habe ich mir auch schon überlegt.

die Genauigkeit der Aufzeichnung alle 2 min ist grundsätzlich genügend, 
deshalb werd ich es so belassen. (ohne das xram hatte ich alle 14 min 
eine Aufzeichnung) Stromausfälle beuge ich mit einer Backup batterie 
vor.

Vielen Dank für deine Hilfe!!! (xram). Die Memory organisation des xc866 
und vorallem das ansprechen in C, ist nun einiges klarer geworden....

Gruss erol

von Korny (Gast)


Lesenswert?

Der Beitrag ist zwar schon etwas älter, aber bei mir gerade 
hochaktuell...

Wenn ich das aus dem Beitrag hier richtig verstehe ist der XRAM ein 
flüchtiger Speicher, also sind die Daten nach dem Neustart weg.

Ich benötige aber für den Infineon XC888 einen Speicher für 
Kalibrierwerte, welcher während des Programmablaufs beschrieben werden 
kann und nach dem Reset noch erhalten bleibt (oder wenn die Spannung 
fehlt).

Ich habe mir auch das EEPROM- Manual von Infineon angeschaut, dort gibt 
es ja bereits einen FlashHandler, mit welchem man in den D-Flash 
schreiben kann, alles auf C- Basis.

 Ich werde leider aus den Beispielen überhaupt nicht schlau - ich möchte 
einfach nur wissen, mit welcher Funktion ich einen Wert (8 oder 16 Bit) 
in den D-Flash speichern kann und wie ich diesen Wert wieder auslesen 
kann.

Hat hier schonmal jemand Erfahrung mit dem FlashHandler gemacht oder 
gibt es vllt. sogar einfachere Methoden, um eine Variable beim XC888 
nicht flüchtig abzuspeichern?

Danke vorab für Eure Hilfe!

Gruß

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.