-         

Ergebnis 1 bis 6 von 6

Thema: eeprom 24lc64 als speicher für temperaturen von ds1621

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52

    eeprom 24lc64 als speicher für temperaturen von ds1621

    Anzeige

    Guten morgen.
    Bin gerade dabei einen Temperaturlogger zu bauen mit oben gennanten bausteinen (plus atmega8 und max232). Das ding soll temperaturen speichern und dann vom computer aus mittels einem Programm in VBA direkt in Excel eingetragen werden.
    Mein Problem ist nur, so leid es mir tut, die addressierung des eeproms. Schreiben und lesen ist alles kein problem nur wenn ich mit dem unten gennanten Code arbeite, sollten ja alle werte von 1 bis 300 ins eeprom geschrieben werden und danach wieder die gleichen werte ausgelesen werden.
    Nur krieg ich werte bis 255 also wenn ein byte zuende ist und dann wieder von null angefangend(siehe 24CL64.LOG)
    Muss man das mit diesem overlay machen, weil ich da noch nciht so recht durchsteige oder geht das auch einfacher. Hab nämlich im Forum viele Beiträge gesehen wo es ähnlich gemacht wurde wie bei mir.
    Vielleicht kann mir jemand helfen.
    Dank im Vorraus und nen guten Rutsch
    Bastian 07

    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    $baud = 9600
    
    
    Config Sda = Portc.4
    Config Scl = Portc.5
    
    I2cinit
    
    Dim Lesen As Byte
    Dim Wert As Integer
    Dim Address As Word
    Dim Speicher_addresse_high As Byte
    Dim Speicher_addresse_low As Byte
    
    Declare Sub Eeprom_write(address As Word , Wert As Integer)
    Declare Sub Eeprom_read(address As Word)
    
    
    
    For Address = 1 To 300
       Incr Wert
          Call Eeprom_write(address , Wert)
       Waitms 10
    Next Address
    
    
    
    For Address = 1 To 300
       Call Eeprom_read(address)
          Print "Lese  EEprom= " ; Lesen ; " Bei Adresse: " ; Address
             Waitms 10
    Next Address
    
    
    End
    
    Sub Eeprom_write(byval Address As Word , Wert As Integer)
    
       Speicher_addresse_high = High(address)
       Speicher_addresse_low = Low(address)
    
          I2cstart                                              'Start I2C
          I2cwbyte &HA0                                         'Sende Slave Adresse
          I2cwbyte Speicher_addresse_high                       'Sende Speicheradresse High
          I2cwbyte Speicher_addresse_low                        'Sende Speicheradresse LOw
          I2cwbyte Wert                                         'Sende Wert
             If Err = 0 Then
                Print "ins EEprom = " ; Wert ; " Bei Adresse: " ; Address
             Else
                 Print "Fehler beim schreiben"
              End If
          I2cstop
    End Sub
    
    Sub Eeprom_read(byval Address As Word)
       Speicher_addresse_high = High(address)
       Speicher_addresse_low = Low(address)
          I2cstart                                              'Start I2C
          I2cwbyte &B10100000                                   'sende Slave Adresse
          I2cwbyte Speicher_addresse_high                       'Sende Speicheradresse High
          I2cwbyte Speicher_addresse_low                        'sende Speicheradresse
    
          I2cstart                                              'Start I2C
          I2cwbyte &B10100001                                   'sende Slave Adresse +1 für Lesen
          I2crbyte Lesen , Nack                                 'lese Adresse vom EEprom
          I2cstop                                               'Stop I2C
    End Sub
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.01.2005
    Ort
    Tokyo
    Alter
    59
    Beiträge
    242
    Hi,
    Byte und Integer sind Datentypen mit einem Wertebereich von 0 bis 255. Mehr passt in eine Eeprom Speicherzellle auch nicht hinein.

    Gruß
    pctoaster

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52
    Also bin ein schritt weiter ich denke das mit der addressierung stimmt alles nur ich kann halt nichts größeres als ein byte schreiben(is ja auch logisch) aber der temperatur fühler gibt halt werte zwischen -550 und +1250 aus also -55° bis +125° und das müsste ich irgendwie speichern.
    im internen eeprom konnte ich einfach nur jedes zweite Byte addressieren und schon konnte ich integer schreiben. Bei dem externen geht das aber eider nicht. Müsste also die Zahl aufteilen. Müsste doch auch mit high() und low() funktionieren aber wie kann ich diese, nachdem ich die werte einzeln geschrieben hab, nach dem auslesen muss ich die nur irgendwie wieder zusammenführen aber wie ?
    gruß
    Gruß


    @pctoaster: Ja genau =) warst schneller als ich

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    nach dem auslesen muss ich die nur irgendwie wieder zusammenführen aber wie ?
    Wert = Speicherstelle_H * 256
    Wert = Wert + Speicherstelle_L

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.11.2003
    Beiträge
    355
    brauchst du Auflösung auf 0.1 °C ?. ansonsten würde ich es als Byte speichern, also einfach Messwert +55 abspeichern, und am PC später wieder abziehen, dann passt es in ein Byte gut rein. Vorteil ist einfach du brauchst 50% weniger Speicher als mit Integer oder Word.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    06.01.2007
    Beiträge
    52
    @ albundy: Ja tip top genau das hab ich gesucht!funktioniert einwandfrei. Danke
    @ MrNiemand: Ja darüber hatte ich auch schon nach gedacht aber bei dem eeprom kann ich so 4000 messungen machen das heist bei stündlich einem messwert sind das 166 tage und bei einem größerem eeprom(512) bis zu 1333 tage reicht also völlig =)

    Trotzdem an alle vielen danke

Berechtigungen

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