Forum: Mikrocontroller und Digitale Elektronik flash speicher xc866 in C


von Kartoffel S. (kartoffelsalat)


Lesenswert?

Hallo zusammen.

ich habe schon vor einger zeit etws zu diesem thema gefragt.

Ich arbeite mit dem xc866 von infineon. ich möchte über den ad wandler 
erfasste daten im mikrokontroller abspeichern. habe es mal mit einem 
gewöhnlichen Array versucht was auch funktioniert. bedingt durch den 
relativ kleinen Programmspeichr ist allerding maximal ein 3*5 array 
möglich. würde dises Array deshalb gerne im internen Flash speicher 
sichern.
weiss jemand wie man in C ein Array in den flash speicher schreibt und 
wieder ausliest?
hat jemand erfahrung damit?

Gruss Raphael

von Ralph (Gast)


Lesenswert?

Hallo

Häng an die SPI Schnittstele ein EEPROM an, dort kannst du die Daten in 
(fast) beliebiger Menge speichern.

Bei Flashspeicher hast du nur eine begrenzte Anzahl an Schreibzugriffen, 
danach kannst du dich nicht mehr auf die Daten verlassen.
Eine solche Begrenzung gibt es zwar auch bei EEPROM , jedoch liegt die 
Grenze hier um einiges höher.

Außerdem bietet ein EEPROM eine bessere Adressierbarkeit für Lösch und 
Schreibzugriffe als dies bei Progammflash in µC üblich ist.

Ralph

von Kartoffel S. (kartoffelsalat)


Lesenswert?

Hallo Ralph

Um zu präziesieren, der flash speicher des uP ist ein EEPROM. mit 16kB 
speicher das würde für einige 1000 Messwerte ausreichen, also weitaus 
genügend für meine Anwedung.
Aber wie definiere ich dass, das mein array im EEprom gespeichert wird 
und nicht im Programmspeicher???
gibt es dafür in C spezielle befehle?
Im Handbuch wird lediglich die möglichkeit in Assembler angeschnitten. 
Hilft aber nicht viel wenn man in c programmiert.

Gruss Raphael

von Carsten S. (carsten)


Lesenswert?

Hallo Raphael,
leider muss ich dich enttäuschen. Der Programmspeicher des XC866 ist ein 
Flashspeicher der in einem Bereich nur eine spezielle Struktur für die 
EEPROM-Emulation aufweist.

Wenn du die Information hast, wie du es in Assembler programmierst, dann 
dürfte es ja nicht so schwer sein das ganze in C zu übersetzen.
Eine Funktion nach dem Prinzip vWriteFlash(Adresse,Datenbyte); gibt es 
soweit ich weiß nicht bzw. ist nicht für jeden frei verfügbar.

Gruß Carsten

von Kartoffel S. (kartoffelsalat)


Lesenswert?

Ja so habe ich das auch in etwa gemeint. es ist ein nicht flüchtiger 
Datenspeicher.

Die Informationen beschränken sich lediglich auf einige Adressen die mit 
MOVC angesprochen werden können?
wie das in c aussehen soll??? und dann für ein ganzes Array...

wieso muss bei infineon immer alles auf dem kompliziertesten Weg 
realisiert werden!! :(

von Carsten S. (carsten)


Lesenswert?

Naja, das ist nicht nur bei Infineon so.

Der MOVC befehl greift auf eine Routine im BootRom zu, wie auch der 
Bootloader. Aber damit alleine ist es noch nicht getan.
Wie schon Ralph sagte, der wesentlich einfachere Weg ist ein externes 
serielles EEPROM.

von Kartoffel S. (kartoffelsalat)


Lesenswert?

Mein serieller Port am uP ist leider schon in verwendung bei diesem 
Programm, kann ihn deshalb nicht mehr für ein externes EEprom verwenden.
gibt es noch eine andere alternative? diese daten zu speichern?

von Carsten S. (carsten)


Lesenswert?

Was steuerst du den mit dem SSC an? Kann man nicht das EEPROM als 2. 
Gerät an den SPI-Bus anschließen?
Altrernativ kannst Du SPI auch relativ einfach mit normalen Portpins 
nachbilden.

Um wieviel Daten geht es überhaupt, die du sichern willst? Und wie oft 
sollen die gesichert werden (1 mal pro µs/ms/s/min/etc.)?

von Kartoffel S. (kartoffelsalat)


Lesenswert?

Auf dem up läuft ein programm ab, welches analoge daten erfasst und 
diese über den UART an ein übermittlungssystem sendet. zusätzlich sollen 
die gesendeten daten eben in einem internen Speicher abgelegt werden, 
sodass diese nachträglich ausgelesen werden könnten falls das 
übertragungssystem versagt.
die gesendeten daten sind jeweils 4 floatwerte welche periodisch alle 
ca. 10 sekunden gesendet werden.

Es reicht allerdings aus wenn die vier werte nur jede minute im flash 
oder eeprom oder wo auch immer, für eine Stunde gespeichert werden. die 
gespeicherten daten, welche älter als eine stunde sind, könnten dann 
wider überschrieben werden.

es soll so sichergestellt sein das die erfassten daten der jeweils 
vergangenen stunde erhalten bleiben, falls diese durch das 
übertragungsystem nicht übertragen werden konnten.

von Carsten S. (carsten)


Lesenswert?

Und für was nutzt du die SSC?

von Kartoffel S. (kartoffelsalat)


Lesenswert?

man lernt nie aus! ssc/spi und Uart sind also nicht die selbe 
Schnittstelle? bin eben noch uP frischling:)
dann kann ich ein externes eeprom an diese "ssc" schnittstelle 
anschliessen und meine werte einfach in den transmittbuffer der ssc 
schreiben? oder wie muss ich mir das vorstellen?


von Carsten S. (carsten)


Lesenswert?

Ganz so einfach ist das auch nicht, aber fast.
Du initialisierst die SSC-Schnittstelle dass sie sich als 
SPI-Schnittstelle verhält. Da musst du aufpassen, da SPI nicht so 
richtig standardisiert ist.
Man muss im Datenblatt vom EEPROM nachschauen, wie es "angesprochen" 
werden will, also MSB oder LSB zuerst, wann die Daten anliegen - 
steigende oder fallende Flanke des Clocksignals.
Wenn das geklärt ist kannst du das EEPROM ansprechen - "Steuerbefehle" 
wie Adresseingabe, Schreib/Lese-Zugriff stehen ebenfalls im Datenblatt 
des EEPROMs.

Wenn du von Infineon den DAVE nutzt ist zumindest der 1. Teil 
(Initialisierung der SSC) ziemlich schnell zusammengeklickt. Dann musst 
du nur noch die Befehle und Datenbytes rausschicken.

von Kartoffel S. (kartoffelsalat)


Lesenswert?

vielen dank für deine Infos, war sehr hilfreich
werde mal ein  passendes EEprom beschaffen und dann mein Glück 
versuchen.

Ja ich arbeite mit Dave. sieht alles recht logisch aus für die 
initialisierung. einzig das clock signal auf die 10Mhz des eeproms 
anzupassen scheint mir noch etwas unklar.

Werden die entsprchenden Befehle um das eeprom anzusprechen jeweils 
einfach dem datenstrom voran gestellt?

gruss Raphael

von Carsten S. (carsten)


Lesenswert?

Du musst nicht exakt 10Mhz anlegen , du solltest nur nicht die maximale 
Geschwindigkeit der beteiligten Bauteile überschreiten. Aber diese 
Geschwindigkeiten sind bei deiner Applikation garnicht notwendig, da 
würde auch 100kHz (ca. 10kB/s) reichen.

Zu dem Datenstrom:
wie das ganz genau abläuft steht im Datenblatt des EEPROM. Bei den 
EEPROMs von Microchip geht das ungefähr so - mit Befehl das EEPROM in 
den Lese-Modus bringen, Highbyte der Adresse senden, Lowbyte senden, 
dann Daten etc.

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.