PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen im Flash speichern



Brantiko
18.03.2007, 11:22
Moin,
Ich möchte mit Bascom über einen Taster eine Variable hoch zählen lassen.
Je höher die Variable desto höher die PWM. Somit kann man dann mit einem Taster die Gesch. einstellen.
Wenn man das Modellfahrzeug nun ausschaltet soll die alte Gesch. Einstellung allerdings gespeichert werden. Ich muss die Variable also irgendwo im Flash speichern?
Wie mache ich das?

Ich Arbeite mit einem Aittny26

Aruss

Alex

Dirk
18.03.2007, 11:50
Ich muss die Variable also irgendwo im Flash speichern?
Wie mache ich das?

ERAM-Variablen definieren:
Dim MyEVar As Eram Byte

Dann kann man sie normal nutzen:
MyEVar = 22

Man sollte Schreibzugriffe auf das ERAM begrenzt halten (möglichst selten).

Gruß Dirk

Brantiko
18.03.2007, 12:13
Hallo,
Danke.
Neu beschrieben wir die Variable ja nur wenn manuell die Fahrgeschnwindigkeit verändert werden.
Also nicht sehr oft.
Werds gleich mal testen.

Edit: Die Variable die ich speichern möchte ist vom Typ Single, da ich mit dieser Variable bis 400 hochzählen möchte und mit Dezimalzahlen multiplizieren muss.

Was mache ich jetzt?

Gruss

Alex

E-Fan
19.03.2007, 11:56
Speicher nur das ab was Du wirklich brauchst - in dem Fall würde eine Wordvariable reichen (Dim A as Eram Word)
An Deiner Stelle würde ich die Werte der Single nach dem Starten eher neu berechnen lassen, mal davon abgesehen das ich kein Freund von letztgenannter Datenform bin weil sie enorm viel Resourcen und Rechenarbeit in Anspruch nimmt.
Was das Abspeichern beim Ausschalten angeht könntest Du die Stromversorgung des µC über eine Diode und einen zusätzlichen Kondensator entkoppeln und einen Interrupteingang belegen der an der Stromversorgung (vor der Diode) hängt und beim Abschalten die Speicherroutine aufruft bevor die BOD beim Controller den Reset einleitet.

Brantiko
19.03.2007, 14:07
Moin,
Mit Word werde ich es mal probieren!
Duhast recht, Singlefirsst unheimlich viel an Speicherplatz.

Ein Problem habe ich noch:

Ich muss der Variable doch einen Anfangswert zuweisen.

Wenn ich es so mache:

Dim MyEVar As Eram Word
MyEVar = 22

Do
...
Loop

Dann wird ja bei jedem neuen Einschalten der Wert der Variable wieder auf 22 gesetzt.
Dabei soll er den alten Wert initialisieren.

Wenn ich den Wert von MyEvar bloß abfrage zählt es nicht zu den max. 100.000 Zyklen die das EEPROM Aushält?

Gruss

Alex

E-Fan
19.03.2007, 14:28
Die EEpromvariable solltest Du nur auslesen oder schreiben, aber nicht zum arbeiten im laufenden Programm nutzen.
Schreib doch einfach:

Dim A as Eram Word
Dim B as SRAM Word (sinngemäß - hab schon ne Weile net mehr mit Bascom geproggt und weiß den genauen Befehl grad nicht)
Dim C as SRAM Byte
Enable Interrupts
Config Int0 = Falling
On Int0 Speichern

B = A
C=0

Do
...
Loop

Speichern:
A = B 'Arbeitsvariable im EEprom ablegen (wird automatisch gespeichert)
Do 'warten bis die BOD am µC wegen Unterpannung den Reset einleitet
nop
Loop
Return

Damit übergibst Du den Wert der Eepromspeicherzellen in eine SRAM-Zelle und kannst den µC runde 100.000 mal ein und ausschalten. Gegebenfalls kannste ja auch eine Prüfschleife einbauen die nach dem zwei-von-drei Verfahren geht und die Gleichheit der Speicherinhalte kontrolliert und im Falle des Falles einfach auf die nächsten zur Verfügung stehenden Zellen zurückgreift.
Hunderttausendmal ein und Ausschalten muss man aber erst mal schaffen.
Übrigens ist der SRAM auch "minimal" schneller als der ERAM. Letztgenannter braucht nämlich runde 1 bis 4ms um ausgelesen zu werden. Der SRAM arbeitet dagegen im Takt des µC's und kann bei 20Mhz in nicht mal ner halben Mikrosekunde angesprochen werden - also über 2000 mal flotter. ;)

Was mir grad noch auffällt ist die Tatsache das sich der µC bei Spannungsschwankungen in meiner oben getippselten Variante festhängen kann. Also muss sichergestellt werden das die INT-Routine die anliegende Versorgungsspannung überwacht und im Falle einer simplen Störung der Stromversorgung einfach wieder zurück ins Hauptprogramm springt.