- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Adressierung i2c eeprom 24c65

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Anzeige

    Powerstation Test
    Du machst das mit dem Overlay und hast ja dann deine vier Bytes!
    Also den Empfangenen Wert in X speichern und dann hast du die Bytes A B C D, die du nacheinander ins EEP schreibst.
    Du kannst A B C D auch wieder nacheinander aus dem EEP lesen und dann X Printen - und SCHWUPPS ist der ganze Wert wieder da!

  2. #12
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    50
    Beiträge
    381
    Morgen!

    Gestern, kurz vor'm bowlen ist mir die Overlayfunktion aufgegangen und ich werd das mal ausprobieren. Was ich nur noch nicht versteh/weiß ist, was die $100 bedeuten. Ich denke mal, dass dies eine Zeiger für den Zwischenspeicher im AVR ist?!
    Kann mir das irgend wer mal erklären?

    MAT

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    $100 ist die Speicheradresse des 1. Bytes
    Und da $101 die 2. ist nehme ich mal an, dass die immer 1 Byte groß sind
    Und um deine Frage von hier https://www.roboternetz.de/phpBB2/vi...4fbee8aec5743d zu beantworten:
    Die vier Werte in Variablen ABCD einlesen und dann mit PRINT X an den Rechner schicken. Dann brauchts auch kein Excel mehr!
    Und wenns in Excel sein muss:
    (niedrigstes Byte) + (2. Byte * 256) + (3. Byte * 65536) + (4. Byte * 16777216) = ganzer Wert

  4. #14
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    50
    Beiträge
    381
    Heyho Stefan,

    im Prinzip hast Du recht mit dem Printbefehl, doch warum soll ich Kontrollerkapazität verschwenden wenn ich den eeprom singleweise auslese und mit z.Bsp. Exel auswerte.

    $100 kann es auch sein, dass es die Speicherzuweisung vom benutzten S-Ram ist?

    und dann hab ich noch einige Verständnisprobleme zu Deiner Exellösung!,
    steh irgendwie auf`m Schlauch. Muss aber sagen, dass ich auch nicht die Ahnung von Exel habe. Könntest Du das noch mal ein wenig beschreiben

    @all:

    hier nun mein fertiger Code für einmal Speicher nach Tasterdrücken und auslesen nach Tasterdrücken:

    Code:
    '**********************************************************
    
    'Programm            : 1xTemp-Messung mit EEpromspeicherung
    'By                  : mat-sche
    'Compiler            : BASCOM-AVR  1.11.8.8
    'Hardware            : DS1820 an Port A.0
    '                      with calculated for 0.1 C resolution
    '                      LCD-Display 4x20 an PortC
    '                      EEprom 24c65 (64kBit) an Hardware TWI
    'Chip type           : MEGA32
    'Date                : 27.12.2007
    '**********************************************************
    
    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 9600
    $hwstack = 228
    $swstack = 228
    $framesize = 128
    $lib "i2c_twi.lbx"                                                                                                      'TWI-Lib für Hardware I2C
    
    
    '----------------- LCD Display an Port c =>Conector SV9 ------------------------
    Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7        ' Pinbelegung "LCD-Port)"
    '                SV9          6                5               4              3              7              8           ' Pinbelegung SV9 Board
    Config Lcd = 20 * 4
    Cursor Off Noblink
    '------------------ DS1820 on pinA 0 (pull up)----------------------------------
    
    Config 1wire = Porta.0                                                                                                  '
    
    Declare Sub Read1820
    Declare Sub Crcit
    Declare Sub Temperature
    
    Dim Bd(9) As Byte
    Dim I As Byte , Tmp As Byte
    Dim Crc As Byte
    Dim T As Integer , Temp As Single
    Dim V As Byte , A As Word
    '
    
    '----------------- Config TWI --------------------------------------------
    Config Twi = 400000                                                                                                     ' Init TWBR und TWSR
    ' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
    Twcr = &B00000100                                                                                                       ' nur TWEN setzen
    '----------------- Eeprom Anschlüße --------------------------------------------
    Config Sda = Portc.1                                                                                                    'SDA und SCL als Hardware-TWI definieren
    Config Scl = Portc.0
    Portb.2 = 1                                                                                                             'Pullups für Taster ein
    Portb.3 = 1
    Const E_prom_w = &HA0                                                                                                   'Epromadresse 160 (A1/2/3 auf GND) schreiben
    Const E_prom_r = &HA1                                                                                                   'Epromadresse 160+1 für schreiben der Daten
    
    'EEprom 24C32,24C128, 24C256 haben im Gegensatz zu den 24C16'er einen Adressraum von zwei Byte.
    'Weil grösserer Speicherbereich im EEprom vorhanden ist Darum muss man den Adressbereich in High und Low Adressbereich
    'trennen. (Zuerst High-Adressbereich schreiben und dann Low-Adressbereich)
    Dim E_ah As Byte                                                                                                        'höherwertiges Byte der SpeicherAdresse (Adresse=Word)
    Dim E_al As Byte                                                                                                        'niederwertiges Byte der SpeicherAdresse (Adresse=Word)
    Dim E_addr As Word                                                                                                      'SpeicherAdresse EEprom
    Dim E_dat_r As Byte                                                                                                     'Daten der zu lesenen Daten aus EEprom
    Dim E_dat_w As Byte                                                                                                     'Daten der zu schreibenen Daten ins EEprom
    Dim Temperature As Single
    Dim Storetemp(4) As Byte At Temperature Overlay                                                                         'Maske: weise die 4Byte aus dem Single(Temperature) dem
                                                                                                                               'Storetemp(1-4) zu
    
    Declare Sub E_write(byval E_addr As Word , E_dat_w As Byte)                                                             'Sub zum schreiben in EEprom mit Übergabe einer Kopie der Variable (Eaddr/E_dat_w)
    Declare Sub E_read(byval E_addr As Word , E_dat_r As Byte)                                                              'Sub zum lesen aus EEprom
    Declare Sub 24lc256_test
    
    
    '------------------ Startbildschirm --------------------------------------------
    
    
    
    
    Cls                                                                                                                     'clear the LCD display
    Locate 1 , 1
    Lcd "Speicherung 1xTemp."                                                                                               'display this at the 1.line
    
    Locate 2 , 1                                                                                                            'display this at the 2. line
    Lcd " im EEprom 24c65  "
    
    Locate 3 , 1                                                                                                            'display this at the 3.line
    Lcd "Taster S7 speichern"
    
    Locate 2 , 1                                                                                                            'display this at the 4.line
    Lcd "Taster S8 auslesen"
    
    Wait 5
    Cls
    '------------------ Hauptprogramm ----------------------------------------------
    Do
     Temperature
    
     If Pinb.3 = 0 Then Call 24lc256_test
     If Pinb.2 = 0 Then
    
      Cls
      Locate 2 , 1
       Lcd Storetemp(1) ; " " ; Storetemp(2) ; " " ; Storetemp(3) ; " " ; Storetemp(4) ; "";                                'Anzeige der 4 einzelnen Bytes aus dem Overlay der Temperatur
      Locate 3 , 1
       Call E_read(&H10 , E_dat_r)                                                                                          'Aufruf der Subroutine zum lesen der einzelnen Bytes
       Call E_read(&H11 , E_dat_r)                                                                                          'E_read(&H10 , E_dat_r)
       Call E_read(&H12 , E_dat_r)                                                                                          '       &H10 - zu lesende Adresse aus EEprom
       Call E_read(&H13 , E_dat_r)                                                                                          '              E_dat_r - Daten aus dem Speicherort
       Lcd "Speicherwert= " ; Temperature ; ""                                                                              'Anzeige der Temperature zusammengesetzt aus dem Overlay: Storetemp(4)
      Locate 4 , 1 : Lcd "Read I2C error= " ; Err                                                                           'Err: Daten korrekt gesendet? 0=i.o.; 1=bad
     End If
    
    
    
    
    Loop
    
    End
    
    
    '////////////////// Subroutinen ////////////////////////////////////////////////
    Sub Temperature                                                                                                         ' actual measuring
    
       1wwrite &HCC : 1wwrite &H44                                                                                          ' start measure
       Waitms 300                                                                                                           ' wait for end of conversion
       Read1820
       Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32                                                                        ' replace ? with number (0-7)                                                                                                             ' read 9 bytes
       Locate 1 , 1 : Lcd "Temperatur= "
                                            ' sensor present, check CRC
       Locate 1 , 13 : Lcd Fusing(temp , "#.##") ; Chr(0) ; "C"                                                             ' CRC OK, print T*10 on LCD
    
    End Sub
    
    '//////////////////////////////////////////////////////////////////////////////
    Sub Read1820                                                                                                            ' reads sensor ans calculate
                                                       ' T for 0.1 C
       1wreset                                                                                                              ' reset the bus
       1wwrite &HCC                                                                                                         ' read internal RAM
       1wwrite &HBE                                                                                                         ' read 9 data bytest
       Bd(1) = 1wread(9)                                                                                                    ' read bytes in array
       1wreset                                                                                                              ' reset the bus
    
    
          T = Makeint(bd(1) , Bd(2))
          T = T / 2
          Temp = Bd(8) - Bd(7)
          Temp = Temp / Bd(8)
          Temp = T + Temp
          Temp = Temp - 0.25
    
    End Sub
    '///////////////////////////////////////////////////////////////////////////////'
    Sub 24lc256_test
    
    
          Temperature = Temp
          Call E_write(&H10 , Storetemp(1))
          Call E_write(&H11 , Storetemp(2))
          Call E_write(&H12 , Storetemp(3))
          Call E_write(&H13 , Storetemp(4))
    
    End Sub
    '///////////////////////////////////////////////////////////////////////////////
    ' Routine to write the 24C65
    
    Sub E_write(byval E_addr As Word , E_dat_w As Byte )
        E_ah = High(e_addr)                                                                                                 'E_ah = EEprom high Adressbyte der jeweiligen Word-Adresse (H&10)
        E_al = Low(e_addr)                                                                                                  'E_ah = EEprom low Adressbyte der jeweiligen Word-Adresse (H&10)
        I2cstart                                                                                                            'Start I2C
        I2cwbyte E_prom_w                                                                                                   'Sende Slave Adresse
        I2cwbyte E_ah                                                                                                       'Sende Speicheradresse High
        I2cwbyte E_al                                                                                                       'Sende Speicheradresse Low
        I2cwbyte E_dat_w                                                                                                    'Sende Daten Werte
        I2cstop                                                                                                             'Stop I2C
        Waitms 10
    End Sub
    
    '///////////////////////////////////////////////////////////////////////////////
    ' Routine to read the 24C65
    
    Sub E_read(byval E_addr As Word , E_dat_r As Byte)
        E_ah = High(e_addr)
        E_al = Low(e_addr)
        I2cstart
        I2cwbyte E_prom_w
        I2cwbyte E_ah
        I2cwbyte E_al
        I2cstart
        I2cwbyte E_prom_r
        I2crbyte E_dat_r , Nack
        I2cstop                                                                                                             '
    End Sub

    Dank & Gruß MAT

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Wieso verschwendest du irgendwas? Haste auf dem AVR noch deinen Webserver und eine Callcenter Datenbank laufen?
    Die $100 ist sicherlich die Speicheradresse im RAM, daarum gehts ja dabei. Und da die 4 anderen Variablen den selben Platz belegen verschwendest du nichts (vielleicht vier zusätzliche Stackpointer, aber das is nicht viel...)
    Das Rechenbeispiel für Excel ist die ganz normale Umwandlung von mehreren Bytes in einen Word-/Single-Wert.
    8 Bits können 256 Zustände annehmen. Wenn ich dann das 2. Byte (das ja den nächsten Teil vom Zahlenraum abbildet) zurechnen will, muss ich die Nullen um ein Byte verschieben - eben um die 256. Das 3. Byte dann um 256*256 usw... Was du nur wissen musst ist, welches Byte das niedrigste und welches das höchste ist - das steht aber im Datasheet vom Chip...

  6. #16
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    50
    Beiträge
    381
    Verschwenden will ja keiner etwas , und wenn ich einen Webserver darauf liefen lassen könnte würde ich an die Decke springen .
    Leider bin ich noch weit davon entfernt.

    Danke Dir erstmal noch für die Hilfen, ich habe bei dieser Geschichte schon einiges dazu gelernt. Werde mir als nächstes mal einige PCF-IC anschauen und mein Wissen vertiefen!

    Dank noch mal!

    MAT

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress