Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfangswertproblem BASCOM ERAM
autoguider
07.09.2007, 18:59
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
roboterheld
07.09.2007, 19:06
bascom hat für alles eine lösung.
autoguider
07.09.2007, 20:23
Das ist schön. Aber wie sieht diese Lösung konkret aus ?
Dani-Bruchflieger
07.09.2007, 21:20
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...
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
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...)
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 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.
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.
autoguider
07.09.2007, 23:32
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
chill-flo
08.09.2007, 01:14
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
CR-Racing
08.09.2007, 09:36
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:
Dta:
$eeprom
$eepromhex 'Falls nicht mit Bascom Übertragen wird, sondern mit externem Programm
Data 2 , 2 , 25 , 25 , 3 , 3 , 5 , 15 , 20
$data
Die Datei wird dann ebenfalls übertragen und deine Startwerte sind definiert!
Ach ja,
Data 23456& 'speichert einen Long-Wert
Data "ABC" 'speichert einen String (hier 3bytes + 0-Byte)
Du kannst auch Single (!) Double (#) und Integer bzw. Word(%) speichern.
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.
Dani-Bruchflieger
08.09.2007, 14:01
Hi,
sorry, kann dir noch nicht ganz folgen.
Bei meiner Flugmodellfernsteuerung habe ich sowohl im Prozessor des "Senders" als auch im Prozessor des Modells bestimmte Parameter im Eeprom abgelegt, die ich allesamt im Menü des Senders bearbeiten und wenn ich das will auch danach wieder im Eeprom abspeichern kann, damit die Einstelungen für das nächste mal erhalten bleiben.
Um das zu erreichen lade ich als erstes die Werte aus dem Eeprom und sichere sie in Variablen im normalen Ram. Das Programm arbeitet dann die ganze Zeit mit diesen Variablen im Ram und nicht im Eeprom (schon deswegen, weil der Eeprom viel zu langsam ist) Ich kann diese Variablen im Menü verändern und auch wieder im Eeprom absichern, wenn ich mir Sicher bin, daß die Werte stimmen.
zB habe ich dort die Daten der Steuerknüppelbelegung (wie die 4 Steuerfunktionen auf die 2 Kreuzknüppel verteilt sind - ob jemand Rechtshänder ist oder Linkshänder. Werte zur Calibrierung der Steuerknüppel usw... Im µC des Modells sind unter anderem die Daten für die Trimmung und das Failsafe abgelegt.)
Wenn man nun einen Neuen µC nutzt, ist der gesamte Eeprom mit &HFF gefüllt. Dann kann man entweder sich ein Programm schreiben, was nach aufspielen den Eeprom mit Werten der Grundeinstellung beschreibt und danach in einer Endlosschleife endet, wo er zB eine Led Blinken läßt.
Oder du spielst dein Programm auf, der Prozessor nimmt die teilweise vielleicht unsinnigen Daten aus dem Eeprom und dann mußt du sie eben korrekt einstellen.
Oder es wird beim Initialisieren geprüft, ob die Werte aus dem Eeprom sinnvoll sind - wenn nicht, werden Ersatzdaten geladen. Wichtig ist nur, daß du die Initialroutine, wenn die Werte aus dem Eeprom geladen werden, vor der Do Loop programmiert hast.
PS: der erste Codeschnipsel in meinem obigen Post ist die initialroutine meines Senders und nur der 2. Codeschnipsel ist das Brennen ins Eeprom...
Edit:
Ja, die schreibroutine prüft, ob die Werte im Eeprom überhaupt überschrieben werden müssen - Wenn sie schon mit den zu speichernden Werten übereinstimmen, muß man ja nicht sinnlos einen der möglichen 100.000 Schreibzugriffe verschwenden... ;)
Um für das allererste Einschalten deinen Prozessor mit den gewünschten sinnvollen Werten zu bespielen, solltest du meiner Meinung nach am einfachsten ein extra Programm schreiben, welches die gewünschten Werte der Grundeinstellung einmalig im Eeprom ablegt. Danach spielst du dann das eigentliche Programm auf - Das ist wahrscheinlich die allereinfachste Möglichkeit, weil du dann im Programm selbst keine zusätzliche Gültigkeitsprüfung mehr benötigst, was sonst nur zusätzlich Programm-Speicher belegen würde. Wenn du aus Bascom heraus Programmierst, kannst du dir auch den Inhalt des Eeprom anzeigen lassen und so vergleichen, ob das richtige drinn steht, oder nicht.
Hallo Dani,
das ist schon richtig so. Aber ein separates Programm braucht es dafür nicht unbedingt. Du kannst auch einfach eine eep-Datei an den Prozessor schicken. Diese kann Bascom automatisch erzeugen. Der Inhalt dieser Datei wird ins EEProm geschrieben und beinhaltet deine Grundeinstellungen. Wenn du die Hex-Datei mit deinem Programm und die EEP-Datei mit den EEProm-Daten übertragen hast, ist alles da was du brauchst.
autoguider
08.09.2007, 15:28
Danke an Alle
Problem ist gelöst
beste Grüsse
Christian
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.