- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Anfangswertproblem BASCOM ERAM

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.08.2007
    Beiträge
    30

    Anfangswertproblem BASCOM ERAM

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    bascom hat für alles eine lösung.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    31.08.2007
    Beiträge
    30
    Das ist schön. Aber wie sieht diese Lösung konkret aus ?

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.07.2005
    Ort
    18km südl. Lutherstadt Wittenberg
    Alter
    48
    Beiträge
    142
    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...
    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
    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:
      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.
    MfG Dani.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    31.08.2007
    Beiträge
    30
    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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    15.06.2007
    Beiträge
    18
    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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    27.01.2005
    Ort
    München
    Beiträge
    20
    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.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    09.05.2007
    Beiträge
    202
    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:

    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
    Die Datei wird dann ebenfalls übertragen und deine Startwerte sind definiert!
    Gruß, Stefan

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    09.05.2007
    Beiträge
    202
    Ach ja,

    Code:
    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.
    Gruß, Stefan

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen