bascom hat für alles eine lösung.
Hallo zusammen,
nach Studium einiger Artikel im Netz kam ich leider noch zu keiner Lösung meines Problems und bitte deshalb hier um Hilfe.
Problemstellung:
Mein Bascom Programm ist wie folgt aufgebaut:
Dim ....
Dim .... ERAM ...
.
.
Config ....
init:
do
Hauptprogramm
loop
In der Init Routine werden müssen einige gültige Parameter aus dem EEPROM gelesen werden.
Diese Werte werden aber auch in der Init Routine initialisiert.
Im Laufe des Programm werden diese Werte überschrieben. Nach dem nächsten Einschalten der Steuerung soll das Programm mit den zuletzt abgespeicherten Werten arbeiten. Dummerweise werden auch wieder die Werte im ERAM im Rahmen der Init Routine überschrieben.
Wie lässt sich dieser Teufelskreis durchbrechen ?
Wenn der ERAM Speicher ausserhalb des Programm z.B. mit FF Zeichen gefüllt wäre, dann kann die Init Routine abfragen ob der ungültige Wert FF in der Zelle ist und dann vernünftig initialisieren. Dazu muss aber der ERAM Speicher vorher, ausserhalb der Applikation, initialisiert werden.
Gibt es hierzu Routinen oder hat Bascom eine Lösung dafür ?
besten Dank im Voraus
Christian
bascom hat für alles eine lösung.
Das ist schön. Aber wie sieht diese Lösung konkret aus ?
Hi,
ich habe bei meinem Umbau meiner RC-Funke auch so etwas benötigt. Nach dem Einschalten werden Werte aus dem Eeprom geladen und in Variablen abgelegt. Das mache ich, indem ich ein Byte-Array per Overlay auf die Variablen lege, die ich verwenden will (egal ob Word oder Single oder was auch immer) erst danach kommt die Do loop Schleife...
Im Programm arbeite ich dann mit den Variablen die per overlay geladen wurden. Habe ich Änderungen daran vorgenommen aktiviere ich per tastendruck das schreiben in den Eeprom mittels dieser Routine. Dadurch stehen dann beim nächsten Einschalten wieder die aktuellen Werte zur verfügung. (Du kannst es aber auch einfach so mit laufen lassen, da diese Routine vor dem schreiben überprüft, ob das schreiben des aktuellen Bytes überhaupt nötig ist...)Code:Dim Mo As Byte At &H250 'Mode der Belegung der 4 Steuerfunktionen Dim S As Byte At &H251 'Seitenruder Dim M As Byte At &H252 'Motorregler Dim H As Byte At &H253 'Höhenruder Dim Q As Byte At &H254 'Querruder Dim Mini(4) As Word At &H255 'Array der 4 Minimumwerte Dim Eedat(13) As Byte At &H250 Overlay 'Array der Eepromdaten zum Verarbeiten in For / Next Dim A As Byte 'Zähler For Next Dim Adress As Byte 'aktuelle Adresse der Eepromnutzung . . . Const Eestart = &H00 'Beginn des benutzten Eeprombereiches 'Einlesen der Knüppelbelegung Adress = Eestart For A = 1 To 13 Readeeprom Eedat(a) , Adress Incr Adress Next
Diese Routine vergleicht den Wert im Eeprom mit dem der Variablen und speichert nur neu, wenn der neue Wert abweicht. Danach wird nochmal überprüft - bei Brennfehler wird das ganze max. 10 mal versucht. Klappt das Brennen nicht, wird ein Errorbit gesetzt, und am Ende der Routine eine Fehlermeldung auf dem Display ausgegeben. Hat alles geklappt kommt eine Bestätigung aufs Display.Code:Cnt = 0 Adress = Eestart For A = 1 To 13 Brennen0: Readeeprom Eetemp , Adress If Eetemp <> Eedat(a) Then Writeeeprom Eedat(a) , Adress Waitms 25 If Cnt > 10 Then Set Burnerror Goto Brennen1 End If Incr Cnt Goto Brennen0 End If Brennen1: Cnt = 0 Incr Adress Next Waitms 600 If Burnerror = 1 Then Set Eewriteerror1 Burnerror = 0 Lcd_text = "Error" Else Lcd_text = "FC16 OK" End If Reset Eewriteerror Lcd_posx = 70 Lcd_posy = 1 Gosub Lcd_print
Diese Routine soll beim Schreiben den Eeprom schonen, da er ja nur begrenzte Anzahl an Brennvorgängen verkraften kann. Falls Bytes nicht mehr beschreibbar sein sollten, kann man einfach die Konstante Eestart verändern, und nutzt dann einen anderen Bereich des Eeprom...
Ich hoffe, daß dir das etwas nützt, und du dich in den Code reindenken kannst - aber eigentlich habe ich die Variablen so benannt, daß vieles sich selbst erklären sollte.
MfG Dani.
Hi Dani,
danke für den Code und Deine Erläuterungen.
Wenn ich es richtig verstehe dann werden nur dann Daten ins EEPROM geschrieben wenn diese sich von den im EEPROM abgelegten Werten unterscheiden.
In meinem Programm möchte ich die Daten im EEPROM vor dem allerersten Programmlauf mit definierten Werten belegen.
Ich möchte verhindern dass unsinnige Werte meine Steuerungsaufgabe torpedieren. Das kann ich mit einer Initialisierungsroutine verhindern.
Im Programm werden dann Parameter abgeändert und bei erfolgter ins EEPROM geschrieben. Das habe ich im Griff.
Beim nächsten Programmstart kann ich nicht verhindern dass auch die Initialisierungsroutine läuft. Damit werden auch die Werte im EEPROM initialisiert. Damit ist die Einstellung wieder zurückgestellt.
Es muss eine Lösung für das Problem geben.
Ich will aber nicht ausschliessen dass ich ein Problem sehe wo vielleicht keines ist.
Irgendwie ist es das alte Problem -- was war zuerst da die Henne oder das Ei.
Wenn ich den EEPROM Bereich vor dem ersten Brennen mit einem definierten Wert belegen könnte, dann wäre die Sache einfach.
Dann bräuchte ich nur eine Abfrage ob die Variable diesen vordefinierten Füll-Wert hat. Falls ja wird einmalig der Defaultwert eingetragen. Danach kann nur das Programm diese Werte verändern. Durch entsprechende Verriegelungen kann dann der Wertebereich eingeschränkt werden. Der Füllwert steht dann nicht mehr im Wertebereich der Variablen zur Verfügung. Hier bietet sich &HFF als Füllwert an.
Vielleicht ist jetzt mein Dilemma noch klarer geworden.
beste Grüsse
Christian
pony prog bietet glaube ich eine funktion dafür werde ins eeprom des avr's zu schreiben weis blos nicht wie deise datei aussehen muss (vermute eine hex-datei wie für den normalen programm speicher)wen nicht ponyprog dann AVR dude oder iergend so ein prog kann das weis blos nicht mehr wie dass heist ist aber ziemlcih bekannt
Du brauchst doch blos in eine bestimmte stelle im EEprom einen bestimmten wert schreiben z.B. 10, beim ersten Programmstart ist der wert natürlich nicht 10 sondern FF also, if <>10 then Initialisierung des EEprom und wenn nicht überspringst Du das ganze.
Hallo,
du kannst doch von Bascom eine Datei für die Belegung des Eeproms schreiben lassen. Bei der Compilierung wird dann zusätzlich eine .eep-Datei erzeugt:
Die Datei wird dann ebenfalls übertragen und deine Startwerte sind definiert!Code:Dta: $eeprom $eepromhex 'Falls nicht mit Bascom Übertragen wird, sondern mit externem Programm Data 2 , 2 , 25 , 25 , 3 , 3 , 5 , 15 , 20 $data
Gruß, Stefan
Ach ja,
Du kannst auch Single (!) Double (#) und Integer bzw. Word(%) speichern.Code:Data 23456& 'speichert einen Long-Wert Data "ABC" 'speichert einen String (hier 3bytes + 0-Byte)
Gruß, Stefan
Ein simple Prüfsumme bei den Eram-Werten ist im allgemeinen eine recht sichere Methode, Schrott von sinnvollen Werten zu unterscheiden.
Die einfache Lösung von @CR-Racing tut's aber meistens auch.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen