-         

Ergebnis 1 bis 3 von 3

Thema: I²C EEProm und WORD?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    I²C EEProm und WORD?

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,
    ich möchte Werte aus einer WordVariable im extenen I²C EEProm speichern. (Habe ein 24C512N)

    Als Byte funktioniert es wunderbar. Nun habe ich versucht das Word in 2 Bytes zu trennen:

    Wert1 = High(wert)
    Wert2 = Low(wert)

    und hinterher beim lesen zusammenzufügen:
    Lesen = Makeint(lesenhigh , Lesenlow)

    aber irgendetwas mache ich da falsch, weil nicht die gespeicherten Werte herauskommen.......

    könnt ihr mir weiterhelfen?

    Code:
    $regfile = "m8def.dat"                                      'MEGA8-Deklarationen
    
    $hwstack = 32
    $swstack = 8
    $framesize = 24
    
    
    $crystal = 8000000                                          'intern 8MHz
    $baud = 9600                                                'Baudrate definieren
    '-------------------------------------------------------------------------------
    'Ein / Ausgänge definieren:
    'Ddrb = &B00111100                                           '0=Eingang
    'Ddrc = &B1111111
    Ddrd = &B01100011                                           '0=Eingang
    
    
    'PullUps setzen:
    'Portb = &B00000000                                          '1 = PullUp AKTIV
    'Portc = &B0000000                                           '1 = PullUp AKTIV
    'Portd = &B00000000                                          '1 = PullUp AKTIV
    
    '-------------------------------------------------------------------------------
    'Alias
    Taster1 Alias Pind.2
    Taster2 Alias Pind.3
    Taster3 Alias Pind.4
    Led1 Alias Portd.5
    Led2 Alias Portd.6
    
    
    
    
    '-------------------------------------------------------------------------------
    'Variablen
    
    
    '-------------------------------------------------------------------------------
    'Timer
    'Timer1 = 2x / sec bei 8MHz
    'Config Timer1 = Timer , Prescale = 256                      'Teiler
    'Const Timervorgabe = 49910
    'Enable Timer1
    'Enable Interrupts
    
    '-------------------------------------------------------------------------------
    Dim Wert As Word
    Dim Wert1 As Byte
    Dim Wert2 As Byte
    
    
    Dim Lesen As Word
    Dim Lesenlow As Byte
    Dim Lesenhigh As Byte
    
    Dim Adresse As Word At $160                                 'Die Adresse als Word-Variable
    Dim Low_adresse As Byte At $160 Overlay                     'Zeiger auf das erste Byte
    Dim High_adresse As Byte At $161 Overlay                    'Zeiger auf das zweite Byte
    
    
    
    'SDA und SCL definieren
    Config Sda = Portc.4                                        ' I2C-Port festlegen
    Config Scl = Portc.5                                        ' I2C-Port festlegen
    
    
    Const Ext_eeprom = 162                                      'I2C Geräteadresse ggf. anpassen
    Wert = 12345
    
    
    '-------------------------------------------------------------------------------
    'Für RS232:
    'On Urxc Onrxd                                               'Interrupt-Routine setzen
    'Enable Urxc                                                 'Interrupt URXC einschalten
    Enable Interrupts                                           'Interrupts global zulassen
    
    
    '---------------------------------------------------------------------------------------------------------------
    '---------------------------------------------------------------------------------------------------------------
    Do
    
    If Taster1 = 1 Then
    '----schreiben----
    For Adresse = 250 To 260                                    'Adresse geht über die Byte-Grenze
    Incr Wert                                                   '1 bis Überlauf
    
    
    Gosub Eeprom_schreiben
    
    Print "schreiben ->Adres.=" ; Adresse ; "Wert=" ; Wert ; "  "       'Anzeige vom schreiben
    Waitms 500
    Next Adresse
    End If
    
    
    If Taster2 = 1 Then
    '---lesen----
    For Adresse = 250 To 260
    
    Gosub Eeprom_lesen
    
    
    Lesen = Makeint(lesenhigh , Lesenlow)
    
    
    Print "lesen <-Adres.=" ; Adresse ; "Wert=" ; Lesen ; "  "  'Anzeige vom lesen
    Waitms 500
    Next Adresse
    End If
    
    
    
    
    
    Loop
    
    
    
    
    
    '------------------------------------------------------
    '- Byte (wert) auf EEprom Adresse (address) speichern -
    '------------------------------------------------------
    Eeprom_schreiben:
    Wert1 = High(wert)
    Wert2 = Low(wert)
    I2cstart                                                    'Start
    I2cwbyte &HA0                                               'Sende Slavadresse
    I2cwbyte High_adresse                                       'Sende Speicheradresse High
    I2cwbyte Low_adresse                                        'Sende Speicheradresse  LOW
    I2cwbyte Wert1                                              'Sende Wert
    I2cwbyte Wert2                                              'Sende Wert
    I2cstop                                                     'stop
    Waitms 10
    Return
    
    
    
    '-----------------------------------------------------------------
    '---  Byte (wert) von EEprom Adresse (address) lesen           ---
    '-----------------------------------------------------------------
    Eeprom_lesen:
    I2cstart                                                    'Start
    I2cwbyte &HA0                                               'Sende Slavadresse +1 für Schreiben
    I2cwbyte High_adresse                                       'Sende Speicheradresse High
    I2cwbyte Low_adresse                                        'Sende Speicheradresse Low
    
    I2cstart                                                    'Start
    I2cwbyte &HA1                                               'Sende Slavadresse +1 für Lesen
    I2crbyte Lesenhigh , Lesenlow                               'Lese Adresse vom EEprom
    I2cstop                                                     'Stop
    Return
    Danke, Tobias
    ...

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Schau dir mal OVERLAY Variablen an.
    Gibts einige Infos hier im Forum zu.
    Damit definierst du quasi an der selben Stelle wie dein WORD zusätzlich zwei BYTE.
    WORD = &B1111111100000000
    BYTE1 = &B11111111
    BYTE2 = &B00000000

    Welche der drei Variablen du auch änderst, das Ergebnis steht dann immer an der selben Stelle.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hi,
    das verstehe ich nicht so ganz - weil ich doch schon hier das high und das lowByte zusammen bringe:
    Lesen = Makeint(lesenhigh , Lesenlow)

    Mein Fehler lag wo anders:
    Ich habe das auslesen falsch gemacht - wenn mehrmals in einer Schleife abgefragt wird, muss mit "ACK" angezeigt werden, das es weitergeht und nach der letzten Abfrage mit "NACK" das keine weitere Bytes mehr kommen.

    Mein Code funktioniert nun!! \/

    für alle die sich da auch so schwer tun wie ich:
    Code:
    $regfile = "m8def.dat"                                      'MEGA8-Deklarationen
    
    $hwstack = 32
    $swstack = 8
    $framesize = 24
    
    
    $crystal = 8000000                                          'intern 8MHz
    $baud = 9600                                                'Baudrate definieren
    '-------------------------------------------------------------------------------
    'Ein / Ausgänge definieren:
    'Ddrb = &B00111100                                           '0=Eingang
    'Ddrc = &B1111111
    Ddrd = &B01100011                                           '0=Eingang
    
    
    'PullUps setzen:
    'Portb = &B00000000                                          '1 = PullUp AKTIV
    'Portc = &B0000000                                           '1 = PullUp AKTIV
    'Portd = &B00000000                                          '1 = PullUp AKTIV
    
    '-------------------------------------------------------------------------------
    'Alias
    Taster1 Alias Pind.2
    Taster2 Alias Pind.3
    Taster3 Alias Pind.4
    Led1 Alias Portd.5
    Led2 Alias Portd.6
    
    
    
    
    '-------------------------------------------------------------------------------
    'Variablen
    
    
    '-------------------------------------------------------------------------------
    'Timer
    'Timer1 = 2x / sec bei 8MHz
    'Config Timer1 = Timer , Prescale = 256                      'Teiler
    'Const Timervorgabe = 49910
    'Enable Timer1
    'Enable Interrupts
    
    '-------------------------------------------------------------------------------
    Dim Wert As Word                                            'eigendlicher Wert
    Dim Wert1 As Byte                                           'Hilfswert1
    Dim Wert2 As Byte                                           'Hilfswert2
    
    
    Dim Lesen As Word                                           'Auslesen
    Dim Lesenlow As Byte                                        'Hilfswert1
    Dim Lesenhigh As Byte                                       'Hilfswert2
    
    Dim Adresse As Word At $160                                 'Die Adresse als Word-Variable
    Dim Low_adresse As Byte At $160 Overlay                     'Zeiger auf das erste Byte
    Dim High_adresse As Byte At $161 Overlay                    'Zeiger auf das zweite Byte
    
    
    
    'SDA und SCL definieren
    Config Sda = Portc.4                                        ' I2C-Port festlegen
    Config Scl = Portc.5                                        ' I2C-Port festlegen
    
    
    Const Ext_eeprom = 162                                      'I2C Geräteadresse ggf. anpassen
    Wert = 64998
    
    
    '-------------------------------------------------------------------------------
    'Für RS232:
    'On Urxc Onrxd                                               'Interrupt-Routine setzen
    'Enable Urxc                                                 'Interrupt URXC einschalten
    Enable Interrupts                                           'Interrupts global zulassen
    
    
    '---------------------------------------------------------------------------------------------------------------
    '---------------------------------------------------------------------------------------------------------------
    Do
    
    If Taster1 = 1 Then
    '----schreiben----
    For Adresse = 250 To 260                                    'Adresse geht über die Byte-Grenze
    Incr Wert                                                   '1 bis Überlauf
    Gosub Eeprom_schreiben
    Print "schreiben ->Adres.=" ; Adresse ; "Wert=" ; Wert ; "  "       'Anzeige vom schreiben
    Waitms 500
    Adresse = Adresse + 1                                       'weil ja immer 2 Bytes abgefragt werden
    Next Adresse
    End If
    
    
    If Taster2 = 1 Then
    '---lesen----
    For Adresse = 250 To 260
    Gosub Eeprom_lesen
    Lesen = Makeint(lesenhigh , Lesenlow)
    Print "lesen <-Adres.=" ; Adresse ; "Wert= " ; Lesen        'Anzeige vom lesen
    Waitms 500
    Adresse = Adresse + 1                                       'weil ja immer 2 Bytes abgefragt werden
    Next Adresse
    End If
    
    
    
    
    
    Loop
    
    
    
    
    
    '------------------------------------------------------
    '- Byte (wert) auf EEprom Adresse (address) speichern -
    '------------------------------------------------------
    Eeprom_schreiben:
    Wert1 = High(wert)
    Print Wert1 ; " W1 "
    Wert2 = Low(wert)
    Print Wert2 ; " W2 "
    
    I2cstart                                                    'Start
    I2cwbyte &HA0                                               'Sende Slavadresse
    I2cwbyte High_adresse                                       'Sende Speicheradresse High
    I2cwbyte Low_adresse                                        'Sende Speicheradresse  LOW
    I2cwbyte Wert2                                              'Sende Wert
    I2cwbyte Wert1                                              'Sende Wert
    I2cstop                                                     'stop
    Waitms 10
    Return
    
    
    
    '-----------------------------------------------------------------
    '---  Byte (wert) von EEprom Adresse (address) lesen           ---
    '-----------------------------------------------------------------
    Eeprom_lesen:
    
    I2cstart                                                    'Start
    I2cwbyte &HA0                                               'Sende Slavadresse +1 für Schreiben
    I2cwbyte High_adresse                                       'Sende Speicheradresse High
    I2cwbyte Low_adresse                                        'Sende Speicheradresse Low
    
    I2cstart                                                    'Start
    I2cwbyte &HA1                                               'Sende Slavadresse +1 für Lesen
    I2crbyte Lesenhigh , Ack                                    'Lese Adresse vom EEprom
    I2crbyte Lesenlow , Nack                                    'Lese Adresse vom EEprom
    I2cstop                                                     'Stop
    Return
    ...

Berechtigungen

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