-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Ich verstehe die Welt nicht mehr...

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.07.2005
    Ort
    Enns
    Alter
    32
    Beiträge
    129

    Ich verstehe die Welt nicht mehr...

    Anzeige

    Hallo,

    ich habe ein Projekt, bei dem ich mir einige Servopositionen im EEPROM speichere. Dies funktioniert wunderbar und lesen kann ich sie auch wieder.
    Der Leseprozess geschieht immer gleich nach dem Hochlauf.

    Nun der Skandal: Bei jedem 10.Mal einschalten, steht nix mehr im EEPROM - was mach ich bloss falsch??? Es ist Gewiss kein Programmfehler, ich denk eher an irgendwelche EMV-Probleme, weil ein relativ großer Motor in unmittelbarer Nähe ist.

    Hat irgendwer eine Ahnung, bzw. kennt irgendjemand das Phänomen der verschwindenden EEPROM Daten?

    Stromversorgung kommt von einem Akku, also sollte es bezüglich Versorgung auch keine Schwankungen geben...

    Zur Sicherheit trotzdem das Programm:
    Code:
    .
    .
    .
     '******************************************************************************
     ' Main Program
     '******************************************************************************
     Main:
        Readeeprom Servo1opened , 0
        Readeeprom Servo1closed , 1
    
        If Switchpressed = 1 Then
           Print "Servo SetUp Mode "
           Call Ledacknowledge()
           Wait 2
           'first set opened state
           Bitwait Switchpressed , Reset
           While Switchpressed <> 1
             Servovalue = 10.2 * Controlvalue
             Servo(1) = Servovalue
           Wend
           Call Ledacknowledge()
           Call Ledacknowledge()
           Bitwait Switchpressed , Reset
           Waitms 500
    
           Print "Set opened Value: " ; Servo(1)
           Writeeeprom Servo(1) , 0
           Servo1opened = Servo(1)
    
           'then set closed state
           While Switchpressed <> 1
             Servovalue = 10.2 * Controlvalue
             Servo(1) = Servovalue
           Wend
           Call Ledacknowledge()
           Bitwait Switchpressed , Reset
           Print "Set closed Value: " ; Servo(1)
           Writeeeprom Servo(1) , 1
           Servo1closed = Servo(1)
        End If
    .
    .
    .
    ==> ist übrigens ein MEGA8 und ich nutze das interne EEPROM

    Danke, lg

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo Zentauro,
    benutzt du das interne EEPROM?
    Da gibt es wohl ein Problem mit den ersten Bytes. Die werden beim Booten manchmal gelöscht. Evtl. auch nur bei bestimmten AVRs.
    Ich habe die ersten 8 Bytes deshalb bei mir ausgelassen.

    Gruß

    Rolf

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.07.2005
    Ort
    Enns
    Alter
    32
    Beiträge
    129
    Hallo Rolf,

    danke für die Info - passiert das aber nicht immer oder??

    lg

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo Zentauro,
    ich kann mich leider an die genauen Zusammenhänge nicht mehr erinnern.
    In meiner Anwendung hatte ich die Adressen der DS1820 (jeweils 8 Byte) im EEPROM abgelegt. Von Zeit zu Zeit war die erste Adresse nach dem Neustart kaputt. Seit ich die ersten Bytes auslasse, ist das Problem nie mehr aufgetreten.
    Vielleicht weiss ja noch jemand anderes genaueres zum Thema.

    Gruß

    Rolf

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    10.10.2005
    Ort
    Nähe Biberach a.d. Riss
    Alter
    47
    Beiträge
    44
    Das hab ich andere Stelle irgendwo auch schonmal in nem Buch oder Datenblatt gelesen (Erste Stelle im Eprom löscht sich).
    Auf die schnelle find ich nur das: (Datasheet Atmega8, Seite 21)

    During periods of low VCC, the EEPROM data can be corrupted because the supply voltage
    is too low for the CPU and the EEPROM to operate properly. These issues are the
    same as for board level systems using EEPROM, and the same design solutions should
    be applied.
    An EEPROM data corruption can be caused by two situations when the voltage is too
    low. First, a regular write sequence to the EEPROM requires a minimum voltage to
    operate correctly. Second, the CPU itself can execute instructions incorrectly, if the supply
    voltage is too low.
    EEPROM data corruption can easily be avoided by fol lowing this design
    recommendation:
    Keep the AVR RESET active (low) during periods of insufficient power supply voltage.
    This can be done by enabling the internal Brown-out Detector (BOD). If the
    detection level of the internal BOD does not match the needed detection level, an
    external low VCC Reset Protection circuit can be used. If a reset occurs while a write
    operation is in progress, the write operation will be completed provided that the
    power supply voltage is sufficient.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.383
    kann ich bestätigen, entweder du schaltest ne art "einschaltverzögerung" an RESET damit der µC ne halbe sekunde oder so im reset verharrt, oder du machst die BOD lösung, also wenn BOD(2.7V sollte reichen) pin auf high geht den reset auf low ziehen (oder wars wenn BOD auf low geht ???? habs schon lange net mehr in der form aufgebaut sry)

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Und bezieht sich das jetzt auf das gesamte EEP oder nur die ersten Bytes?
    Könnte der OP das nochmal mit Bytes 8 bis irgendwas testen, ohne den Rest zu ändern?

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.383
    ich vermute das was beim lesen schiefgeht, also würde es sich auf den gesammten EEP auswirken, weis ja nciht wie for_ro gemacht hat, aber gut möglich das bei ihm nur die ersten lesevorgänge den EEP kompromittiert haben und wenn er während der zeit dummybytes liesst die er verwirft ist klar das der fehler icht auffällt aber dennoch stattfindet ... versuchs mal mit ner einschaltverzögerung und berichte dann was passiert

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.11.2006
    Ort
    K-Town
    Alter
    39
    Beiträge
    178
    wie kann man den die ersten Bytes eigentlich ausschließen wenn man z.B. mit ERAM Variablen arbeitet????
    dann hat man ja keinen einfluß wo Bascom dann die Variable hinlegt!

    wenn man mit writeeeprom var, adress arbeitet kann ich ja eine (muß ich sogar) angeben!

    aber ansonsten gehts wohl nicht, oder?

    (PS: man könnte natürlich beim Programmstart einen String oder Byte Array von 10 - 16 Bytes in das EEPROM schreiben, somit hätte man eine hohe Wahrscheinlichkeit das die ersten Byte belegt sind, aber das ist ja wohl kaum im INterresse des Programmieres so Speicher zu verschwenden...)
    die Einen sagen so, die anderen sagen so....!

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    42
    Beiträge
    849
    Servus Zapo.,

    Du kannst einfach in der Reihenfoge der Vergabe der Eeprom-Variablen 2x Dummy schreiben und danach die restlichen ablegen

    Dim Dummy1 As ERAM Byte
    Dim Dummy2 As ERAM Byte
    Dim DeineVar As ERAM Byte

    Dann wird die Variable von dir (und die fortfolgenden) automatisch angehängt und die ersten beiden Variablen als Dummy (die du natürlich nicht benutzen solltest wenn du probleme hast) deklariert.

    Zweite Variante wenn man selbst Hand anlegen will in der Adressvergabe ist die Vergabe als Position:

    Dim DeineVar As Byte At &h100

    &h100 wäre demnach beispielsweise die hexadezimale Adresse die du vergeben willst (absolut).

    Grüße Wolfgang

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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