www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Flash programmieren


Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich möchte während der Laufzeit einige Variablen auf dem 
Flash-Speicher sichern.

- Was muss ich beachten, um den Flash benutzen zu können?

- Welchen Bereich kann ich benutzen?

- Woher weiß ich, ob dieser Speicherblock nicht schon benutz wird?

- Muss ich immer ganze Blöcke löschen, um benutzen zu können?

- Es ist auch möglich einzelne Word-Adressen zu löschen?

Um den Flash benutzen zu können, muss ich immer erst den Schutz 
aufheben. Was passiert wenn ich den Schutz wieder setzte? Kann die CPU 
noch zugereifen?

Datenblatt habe ich schon öfter durchgelesen, aber ich verstehe es nicht 
richtig :-(

Danke im Voraus

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

von wessen Flash redest Du eigentlich? ;)

Üblicherweise liegen nur Konstanten im Flash, Variablen im SRAM, sonst 
wären sie nicht variable genug...

Gruß aus Berlin
Michael

Autor: 6641 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist doch klar, er redet vom %$^%$%@#$@#$ Controller, den haben wir 
leider nicht im Griff.

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ist doch klar, er redet vom %$^%$%@#$@#$ Controller

ach man, echt schade. Ich hatte gehofft, dass es jemand bei dem 
%$^%$%@#$@#$ Controller weiterhelfen würde :'(

ich sag mal so, ich benutze einen Kontroller der weder SRAM noch EEPROM 
besitzt. Mir steht nur ein Flash-Speicher zur Verfügung, um die 
Variablen abzulegen.

ich bezeichne es auch als %$^%$%@#$@#$ Controller, aber will mir niemand 
abkaufen :-(

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das beste ist, nach dem ich ein Block genommen habe und Paar Daten 
ablege, spinnt danach das eigentliche Programm und es läuft gar nicht 
mehr.

Ich meine wie kann es sein, nach dem ich an die Adresse xy mein Datum 
gespeichert  habe, dass der Timer kein Interrupt mehr auslöst.

Der Timer läuft und läuft und läuft aber es wird kein Interrupt 
ausgelöst, damit das Programm in die ISR sprigt und dort ein Flag 
setzt.....

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht nix...

Am liebsten würde ich das Board mit dem Kontroller nehmen und VOLL gegen 
die Wand werfen :-D

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Byte-Word-Adressierung?

MfG Spess

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Word-Adressierung!!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Lass mich raten: die Daten werden in Bytes adressiert und du hast die 
Wordadresse nicht x2 genommen (bei AVRs lpm/spm).

MfG Spess

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix wrote:
> Ich meine wie kann es sein, nach dem ich an die Adresse xy mein Datum
> gespeichert  habe, dass der Timer kein Interrupt mehr auslöst.


Liegt an Zeile 73,5 in dem uns unbekannten Code für nen unbekannten MC 
mit unbekanntem Compiler.

Ich kenne außerdem keinen einzigen MC, der keinen SRAM hat.


Peter

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

@Peter: At90S1200, ATTiny15

MfG Spess

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein falsch geraten. Da ich in C programmiere, kann ich direkt sagen 
SetWord oder SetByte..

>Lass mich raten: die Daten werden in Bytes adressiert
Aber was hat das damit zu tun, dass der Timer kein Interrupt mehr 
auslöst?

Ich benutze ein Paar Speicherzellen am Ende des Flash-Speichers, wo 
eigentlich ganz leer sein müsste.

Autor: Frank N. (arm-fan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sag mal, wieviele Aufforderungen brauchst du eigentlich noch,
um mal mit den notwendigen Infos rüberzukommen?

Soviel Ignoranz tut beim Mitlesen schon weh!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wenn dein Programm nach so einer Aktion spinnt, hast du mit Sicherheit 
Programmcode überschrieben. Aber so wie du dich anstellst wird dir auch 
keiner helfen können (wollen).

MfG Spess

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  byte Flash_err;
  
  word Adresse = AREA_END; //mit der letzten Adresse beginnen (7ff7)


  Flash_err=IFsh1_SetGlobalProtection(FALSE); //GlobalProtection deaktiveren um auf Flash zu schreiben

  Flash_err=IFsh1_EraseSector(AREA_SIZE); //Sektor löschen (0x100 - 256 Words)
  
  
  Flash_err = IFsh1_SetWordFlash(Adresse, modus); //Modus sichern (modus:global)
  Adresse--; //Adresse dekrementieren


  if( !Flash_err ) // wenn kein Fehler, Daten auf Flash gesichert -> Flag zurücksetzen und auch sichern
  {
    flash_schreiben = FALSE; //Flag zurücksetzen
  
    IFsh1_SetWordFlash(Adresse, (word)flash_schreiben); //Flag sichern
  }

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sag mal, wieviele Aufforderungen brauchst du eigentlich noch,
>um mal mit den notwendigen Infos rüberzukommen?

Lassen wir ihn einfach dumm sterben ;)

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja da ich weiß, dass hier niemand mit dem Controller was anfangen kann 
brauche ich es auch gar nicht zu nennen.

Jeder der mit dem Kontroller was zu tun hat, würde sofort aus den Codes 
erkennen um welchen Hersteller es sich handelt ;-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnstest Du bitte mal das zusammenhanglose Codeschnipselchen ins 
Chinesische übersetzten, es würde den Informationsgehalt um genau 0,0% 
vermindern.


Peter

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Lassen wir ihn einfach dumm sterben ;)

@ Peter
 Sendepause !

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann leider kein chinesisch. Glaube auch nicht, dass der 
Google-Übersetzer es in chinesisch übersetzen kann

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mir jemand das erklären,bitte?:


Program memory of 64 k to 32 k bytes in length is constructed from a 64 
k byte block. Read access occurs within one cycle with no penalty.

A 64 k block is organized as 1024 rows of 64 bytes each. A 32 K block is 
organized as 512 rows of 64 bytes each.

An erase page contains eight rows of 64 bytes for a total of 512 bytes. 
The erase operation also supports mass erase of an entire block. An 
erased bit reads as one and a programmed bit reads as zero.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix schrieb:
> naja da ich weiß, dass hier niemand mit dem Controller was anfangen
> kann ...

Wenn du davon ausgehst, dass hier niemand mit dem Controller was
anfangen kann, warum fragst du dann überhaupt?

> ... brauche ich es auch gar nicht zu nennen.

Lass mich trotzdem raten: Ist es ein Freescale 56F8xxx?

Autor: 6641 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider nein. Aber der Flash programmierfehler ist mir bekannt. Nach den 
Programmieren des Flash muss man das Flash wieder freigeben. Sollt aber 
im Datenblatt stehen.

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Lass mich trotzdem raten: Ist es ein Freescale 56F8xxx?

Yes!

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nach den Programmieren des Flash muss man das Flash wieder freigeben

ich glaube, ich müsste genauer recherchieren was mit "Flash freigeben" 
gemeint ist.

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich meine wie es zu freigeben ist. Weil ich dachte, ich gebe es wieder 
frei

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
juuuuuuuuuhhhhuuuuuuuuuuuuuuuu ich habe den Fehler raus

an dieser Zeile lag es:
IFsh1_EraseSector(AREA_SIZE); //Sektor löschen (0x100 - 256 Words)

ich darf hier keine AREA_SIZE angeben, sondern muss sagen welche Adresse 
gelöscht werden soll. D.h. es darf kein Sektor angegeben werden, was 
gelöscht werden soll, sondern muss sagen welche Adresse ich schreiben 
möchte. Dann wird der Sektor gelöscht, an dem sich die Adresse befindet.

so
IFsh1_EraseSector(Adresse); //Sektor löschen (Erases the sector 
                            //to which address Addr belongs)

Ich danke euch allen viel Mals, VIELEN DANK..

Autor: Jan P. (flux)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich hab ein ganz ähnliches Problem/Frage, jedoch anderer µC... 
(MSP430F149)

Will das erste mal auf den Flash schreiben, um ein Paar 
Einstellungen/Parameter ändern zu können und diese auch über den 
Spannungsausfall hinweg "retten" zu können.

Mein Hauptproblem ist folgendes: Wurde zwar schon gestellt die Frage, 
aber meiner Meinung nach nicht wirklich beantwortet:

Woher weiss ich, welcher Speicherbereich unbenutzt ist oder ob 
Programmcode drinsteht?

Ich brauche so in etwa 10 byte schätze ich mal.

Also wenn das geklärt ist würd eich zurechtkommen denke ich mal, 
hilfreich wäre aber vielleicht noch ein Beispielprogramm, wenn einer was 
greifbar hat. Bei Ti habe ich mir schon ein angeschaut, aber ein etwas 
umfangreicheres wäre mir ganz lieb. Wie gesagt: ist nur optional! ;)

Wer kann mir helfen?

Gruß, Jan!

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jan,

je nach Compiler. Der IAR-Compiler läßt Variablen auch für den 
Flashbereich deklarieren. Da muss man sich um nichts kümmern. Ansonsten 
schau Dir Dein Hex-File an und nimm einen Bereich (wenn möglich) weit 
über dem Code-Ende. Ansonsten einfach die letztmöglichen Adressen.

Beispiel für den AVR (IAR-Compiler):

extern  __flash unsigned const char Array1[];
extern  __flash unsigned const char Numbers[];

Wo und wie, was organsiert wird erledigt der Compiler von selbst.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erstmal danke für die Antwort!

Das wäre ja super wenn der IAR das automatisch kann, den benutze ich in 
der Trial version...

aber irgendwie klappt das nicht so recht.
Ich hab das jetzt so vertsanden dass man einfach "__flash" vor die 
variable schreibt und er müsste alles andere automatisch machen? schwer 
zu glauben.. und so ist es auch: er macht es nciht! ;)
was habe ich falsch vertsanden?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.