- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Long Variable in I2C-EEprom schreiben und wieder lesen ?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576

    Long Variable in I2C-EEprom schreiben und wieder lesen ?

    Anzeige

    Powerstation Test
    Hallo Leute

    Habe da ein kleines Problem.

    Ich möchte eine Long Variable in ein I2C EEprom schreiben und wieder lesen.

    Leider mache ich da irgendwie eine Fehler..
    Habe das bis jetzt nur mit Word-Variablen gemacht.

    Jetzt kann die Zahl aber auch negativ sein.

    Die zerlegung habe ich wieder mit Overlay gemacht:
    Code:
    Dim Koordinate As Long At $162
    Dim Koordinate_teil1 As Byte At $162 Overlay
    Dim Koordinate_teil2 As Byte At $163 Overlay
    Dim Koordinate_teil3 As Byte At $164 Overlay
    Dim Koordinate_teil4 As Byte At $165 Overlay

    Es kommt aber nur Müll beim Lesen raus.(EEprom)

    Darum habe ich mir mal Werte ohne EEprom auf das LCD schreiben lassen:

    Wert: 45 = 45 , 000, 000 , 000
    Wert 294= 38 , 001, 000 , 000
    Also Ok

    Wert -13 = 243, 255 , 255 , 255
    Wert -313= 199, 254 , 255 , 255

    Wie kriege ich da wieder eine Minus-Zahl raus ??


    Andere Frage:
    Ins EEprom schreibe ich normal so:



    Code:
    I2cstart                                                    'Start
    I2cwbyte &B10100010                                          'Sende Slavadresse  
    I2cwbyte High_adresse                                        'Sende Speicheradresse High
    I2cwbyte Low_adresse                                         'Sende Speicheradresse LOW
    I2cwbyte Wert                                    'Sende Wert
    I2cstop                                                      'stop

    Kann man das dann bei 4Byte hintereinander auch so schreiben: ?!



    Code:
    I2cstart                                                     'Start
    I2cwbyte &B10100010                                          'Sende Slavadresse  (Adresse für A0=EIN)
    I2cwbyte High_adresse                                        'Sende Speicheradresse High
    I2cwbyte Low_adresse                                         'Sende Speicheradresse LOW
    I2cwbyte Koordinate_teil1                                    'Sende Wert
    I2cwbyte Koordinate_teil2                                    'Sende Wert
    I2cwbyte Koordinate_teil3                                    'Sende Wert
    I2cwbyte Koordinate_teil4                                    'Sende Wert
    I2cstop                                                      'stop
    b.z.w. so lesen : ?
    Code:
    I2cstart                                                     'Start
    I2cwbyte &B10100010                                          'Sende Slavadresse  (Adresse für A0=EIN)
    I2cwbyte High_adresse                                        'Sende Speicheradresse High
    I2cwbyte Low_adresse                                         'Sende Speicheradresse Low
    
    I2cstart                                                     'Start
    I2cwbyte &B10100011                                          'Sende Slavadresse +1 für Schreiben
    I2crbyte Koordinate_teil1                                    'Lese Adresse vom EEprom
    I2crbyte Koordinate_teil2                                    'Lese Adresse vom EEprom
    I2crbyte Koordinate_teil3                                    'Lese Adresse vom EEprom
    I2crbyte Koordinate_teil4 , Nack                             'Lese Adresse vom EEprom
    I2cstop
    Bitte um Hilfe
    l.G. Roberto

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Versuch mal:

    Code:
    
    Dim Koordbytes(4) As Byte
    Dim Koordinate As Long At Koordbytes Overlay
    Dim Ix As Byte
    
    
    Dim Low_adresse As Byte
    Dim High_adresse As Byte
    Dim Eeram_adr As Word At Low_adresse Overlay
    
       Eeram_adr = &H0000
    
        Koordinate = 294
        Gosub Print_out
        Gosub Ee_out
    
       Eeram_adr = Eeram_adr + 4
    
        Koordinate = -313
        Gosub Print_out
        Gosub Ee_out
    
    
       Eeram_adr = &H0000
        Gosub Ee_inp
        Print Str(koordinate)
    
       Eeram_adr = Eeram_adr + 4
        Gosub Ee_inp
        Print Str(koordinate)
    
    
    
    End
    
    
    Print_out:
        Print Str(koordinate) ; "-> ";
        For Ix = 1 To 4
          Print Str(koordbytes(ix)) ; " ";
        Next
        Print
       Return
    
    Ee_out:
       I2cstart                                                 'Start
       I2cwbyte &B10100010                                      'Sende Slavadresse  (Adresse für A0=EIN)
       I2cwbyte High_adresse                                    'Sende Speicheradresse High
       I2cwbyte Low_adresse                                     'Sende Speicheradresse LOW
       I2cwbyte Koordbytes(1)
       I2cwbyte Koordbytes(2)
       I2cwbyte Koordbytes(3)
       I2cwbyte Koordbytes(4)
       I2cstop                                                  'stop
       Return
    Ee_inp:
       I2cstart                                                 'Start
       I2cwbyte &B10100010                                      'Sende Slavadresse  (Adresse für A0=EIN)
       I2cwbyte High_adresse                                    'Sende Speicheradresse High
       I2cwbyte Low_adresse                                     'Sende Speicheradresse LOW
    
       I2cstart                                                 'Start
       I2cwbyte &B10100011
       I2crbyte Koordbytes(1) , Ack
       I2crbyte Koordbytes(2) , Ack
       I2crbyte Koordbytes(3) , Ack
       I2crbyte Koordbytes(4) , Nack
       I2cstop                                                  'stop
       Return
    Eigentlich sollte das funzen (hoff ich )
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    Hallo Robert
    Danke für die schnelle Antwort.
    Werde mir das mal durchkauen

    l.G. Roberto

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    Hallo Robert

    Habe jetzt den ganzen Tag probiert...
    Komme auf keinen grünen Zweig.

    Habe mal die Long mit dem zerlegt:
    Code:
    Dim Koordinate As Long At $113
    Dim Koordinate_teil1 As Byte At $113 Overlay
    Dim Koordinate_teil2 As Byte At $114 Overlay
    Dim Koordinate_teil3 As Byte At $104 Overlay
    Dim Koordinate_teil4 As Byte At $105 Overlay
    und dann (ohne EEprom) wieder in so eine Struktur geschrieben:
    Code:
    Dim Koordinate1 As Long At $152
    Dim Koordinate1_teil1 As Byte At $152 Overlay
    Dim Koordinate1_teil2 As Byte At $153 Overlay
    Dim Koordinate1_teil3 As Byte At $154 Overlay
    Dim Koordinate1_teil4 As Byte At $155 Overlay
    Also in jeweils "koordinate1_teil1" u.s.w. und es kam an der "Koordinate1"
    auch wieder eine Long raus (auch mit negativen Werten)

    Aber irgendwie geht es nicht über das EEprom ?!

    Dann habe ich probiert mit Byte in das EEprom zu schreiben--> Geht!
    Wenn ich mit Word probiere und ich schreibe z.B. 1 rein
    (also 1 als Word und dann zerlegt in Byte als 1 und 0)
    bekomme ich raus 1 und 1 und in Summe schreibt er mir dann 257 hin (als Word)
    Bei 2 kommt 2 und 2 und zeigt 514 an
    Bei 3 kommt 3 und 3 und zeigt 771


    Jetzt wollt eich deinen Code mal probieren (umsetzen) aber komme damit nicht ganz zurecht

    Wie muss man das z.B. verstehen:

    Code:
    Dim Koordbytes(4) As Byte
    Dim Koordinate As Long At Koordbytes Overlay
    Dim Ix As Byte
    So wie ich das kenne, habe ich ja bei mir die Long-Variable und die reicht 4 Byte weit in den Speicher und mit Overlay greife ich die Byte's jeweils ein Stück weiter oben jeweils ab.

    Kann ich die Werte vom EEprom nur mit einem Array auslesen ?
    Ohne EEprom geht es ja so auch ?!
    (z.B. direkt in die Speicherstelle schreiben)

    l.G. Roberto

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Nein, array muß nicht sein. du kannst es auch mit "teil1-4" machen.
    Wenn's ohne EEPROM richtig zu übertragen geht, muß es mit EEPROM auch gehen.
    Schreib mal rein, lies es wieder, und berichte, was du genau zurückgekriegt hast.
    (ev. + aktueller Sourcecode)

    Wäre ja gelacht.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    Hallo

    Hier mal der Minimalcode:
    Code:
    $regfile = "m8def.dat"
    $crystal = 10000000
    
    $hwstack = 250
    $swstack = 250
    $framesize = 250
    
    '################## Config Port's ##############################################
    
    
    
    '-----config Port D
    Config Portd = 255
    
    
    
    
    '##################### Config für LCD ####################################################
    Config Lcd = 40 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5
    Config Lcdbus = 4
    Config Lcdmode = Port
    Cursor On
    Cls
    
    '############################ Config ADC #######################################
    Config Adc = Single , Prescaler = Auto
    Start Adc
    
    '############################ Config I2C Bus ###################################
    Config Scl = Portd.6                                        ' I2C-Port festlegen
    Config Sda = Portd.7                                        ' I2C-Port festlegen
    
    
    
    
    '################## Variablen ##################################################                                             '
    
    Dim I As Word                                               ' zum rechnen
    Dim X As Word
    
    Dim Koordinate As Long At $113
    Dim Koordinate_teil1 As Byte At $113 Overlay
    Dim Koordinate_teil2 As Byte At $114 Overlay
    Dim Koordinate_teil3 As Byte At $115 Overlay
    Dim Koordinate_teil4 As Byte At $116 Overlay
    
    Dim Adresse As Word At $100
    Dim Low_adresse As Byte At $100 Overlay
    Dim High_adresse As Byte At $101 Overlay
    '---------------------------------------------
    
    
    Do
    
    
        For I = 1 To 10
           Adresse = I
           Koordinate = Koordinate + 10
          Gosub Eeprom_schreiben
          Locate 1 , 1
          Lcd "I=" ; Adresse ; " "
          Locate 1 , 5
          Lcd "K=" ; Koordinate ; " "
          Locate 1 , 14
          Lcd "A=" ; Koordinate_teil1 ; " "
          Locate 1 , 21
          Lcd "B=" ; Koordinate_teil2 ; " "
          Locate 1 , 28
          Lcd "C=" ; Koordinate_teil3 ; " "
          Locate 1 , 35
          Lcd "D=" ; Koordinate_teil4 ; " "
          Waitms 500
         Next I
    
         For I = 1 To 10
          Adresse = I
          Gosub Eeprom_lesen
          Locate 2 , 1
          Lcd "I=" ; Adresse ; " "
          Locate 2 , 5
          Lcd "K=" ; Koordinate ; " "
          Locate 2 , 14
          Lcd "A=" ; Koordinate_teil1 ; " "
          Locate 2 , 21
          Lcd "B=" ; Koordinate_teil2 ; " "
          Locate 2 , 28
          Lcd "C=" ; Koordinate_teil3 ; " "
          Locate 2 , 35
          Lcd "D=" ; Koordinate_teil4 ; " "
    
        Waitms 500
         Do
         X = Getadc(3)
        Waitms 100
         Loop Until X > 600
        Next I
    
         Wait 2
    Loop
    
    End
    
    
    
    Eeprom_schreiben:
    '----schreiben----
    
    I2cstart                                                    'Start
    I2cwbyte &B10100010                                         'Sende Slavadresse
    I2cwbyte High_adresse                                       'Sende Speicheradresse High
    I2cwbyte Low_adresse                                        'Sende Speicheradresse LOW
    I2cwbyte Koordinate_teil1                                   'Sende Wert
    I2cwbyte Koordinate_teil2                                   'Sende Wert
    I2cwbyte Koordinate_teil3                                   'Sende Wert
    I2cwbyte Koordinate_teil4                                   'Sende Wert
    I2cstop                                                     'stop
    Waitms 10
    
    Return
    '--------------------------------
    
    Eeprom_lesen:
    '---lesen----
    I2cstart                                                    'Start
    I2cwbyte &B10100010                                         'Sende Slavadresse
    I2cwbyte High_adresse                                       'Sende Speicheradresse High
    I2cwbyte Low_adresse                                        'Sende Speicheradresse Low
    
    I2cstart                                                    'Start
    I2cwbyte &B10100011                                         'Sende Slavadresse +1 für Schreiben
    I2crbyte Koordinate_teil1 , Ack                             'Lese Adresse vom EEprom
    I2crbyte Koordinate_teil2 , Ack                             'Lese Adresse vom EEprom
    I2crbyte Koordinate_teil3 , Ack                             'Lese Adresse vom EEprom
    I2crbyte Koordinate_teil4 , Nack                            'Lese Adresse vom EEprom
    I2cstop                                                     'Stop
    
    Return
    '----------------------------------
    Beim Auslesen kommt dann:

    I=1 K=67305985.. A=10 B=20 C=30 D=40
    I=2 K=84148994.. A=20 B=30 C=40 D=50
    I=3 K=10099200... A=30 B=40 C=50 D=60
    .
    u.s.w.



    Ps.:
    Wenn ich bis 12 lese, kommen dann Bei B-D die Nullen nach.

    Es scheint so, als würde er da nur immer ein Byte reinschreiben?!
    (Statt 4 Byte hintereinader)


    l.G.

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Halt, Steirer, ein long brauch ja 4 Byte !

    For I = 1 To 40 STEP 4

    das mußt du nochmal probieren
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    Hallo Wiener

    Ups.. genau, dass hatte ich übersehen...

    Beim originalen Programm hatte ich eh +4 dabei nur da hab ich es jetzt vergessen..
    Oft sieht man den Baum vor lauter Wald nicht mehr

    Danke !!!!!!!!!!!!!!!!!!!!!!!!!!!

    So geht es jetzt erstmal.
    Jetzt muss ich es wieder in mein original Programm umstricken.
    Mal schauen, ob es dann auch noch geht

    Danke jedenfalls....!!

    Weist Du vielleicht auch noch, ob es da eine Routine gibt, die merkt wenn ein Fehler auf dem I2C-Bus ist ?

    Und deinen Code von vorher...
    Code:
    Dim Koordbytes(4) As Byte
    Dim Koordinate As Long At Koordbytes Overlay
    Dim Ix As Byte
    Kannst Du mir das bitte noch erklären ?!

    Bei:
    ----------
    DIM x as long
    Dim xx(4) as byte x overlay
    ---------------------
    (habe ich wo anders gesehen..)
    Kann ich mir noch vorstellen, dass ich mit dem Array die Stellen vom X anspringe... (long)

    Aber bei deinem weis ich nicht so recht ?!

    Schöne Grüsse nach Wien..

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Schau,
    ein Bytes(4) braucht vier byte
    ein LONG braucht auch vier Byte

    Wenn ich die addresse durch "OVERLAY" gleichsetze, liegen
    BYTES(1)
    BYTES(2)
    BYTES(3)
    BYTES(4)
    genau auf den (4) einzelnen Bytes von "LONG"

    dann kann ich die einzelnen Bytes von "LONG" mit "for 1 to 4" abarbeiten.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    Hallo Robert

    Das mit der LONG Länge und den Bytes ist mir schon klar aber:

    Wenn ich so schreibe:
    Dim X as long
    Dim XX(4) as byte X overlay

    ist XX der Zeiger auf einen Teil von X

    Bei deiner Schreibweise ist das aber schneinbar verdreht..

    Muss ich das dann bei dir so sehen, dass "Koordinate" der Zeiger ist
    auf das Array "Koordbytes(4)"
    von dem Beispiel
    Code:
    Dim Koordbytes(4) As Byte
    Dim Koordinate As Long At Koordbytes Overlay
    Dim Ix As Byte

    Ps.:
    Das EEprom funktioniert noch immer \/ \/

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

LiTime Speicher und Akkus