-         

Ergebnis 1 bis 6 von 6

Thema: 24C512 read / write geht nicht - brauche Hilfe, bitte!

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2004
    Ort
    Thüringen
    Beiträge
    133

    24C512 read / write geht nicht - brauche Hilfe, bitte!

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo Leute,

    Habe aus dem RN-Wissen ein paar Codeschnipsel entnommen zum Lesen und schreiben von I2c-EEPROMs. Habe den EEPROM auch richtig angeschlossen, auch die Pull-Ups sind dran.

    Aber es geht nicht. Als gelesenen Wert erhalte ich immer "255".
    Hier mein Code:

    Was mache ich falsch??
    Bitte helft mir auf die Sprünge

    Danke, Andreas
    Code:
    $regfile = "m8def.dat"                                      ' Chip auswählen
    $crystal = 3686400                                          'hier Taktfrequenz eintragen
    $baud = 9600                                                'Baudrate RS232
    '
    Config Lcd = 16 * 2                                         'LCD-Display configurieren
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portb.1 , Rs = Portb.2
    '
    Config Scl = Portc.5                                        'PINs für I2C Bus
    Config Sda = Portc.4
    I2cinit
    '
    Dim X As Byte
    Dim A As Word                                               'der wert, welcher ins EEPROM geschrieben werden soll
    Dim B As Word
    Dim Schreiben As Byte
    Dim Lesen As Byte
    
    'Die Adresse muß als Word-Variable definiert werden (Word=16Bit=0...65535)
    'Damit kann ein EEPROM mit 256KBit (24C256) angesprochen werden (Adressen von 0...32768)
    'und auch einer mit 512KBit (24C512). Adressbereich hier 0...65535
    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
    '
    Config Adc = Single , Prescaler = Auto                      'AD-Wandler starten
    Start Adc
    '
    Ddrb = &B00000000                                           'Ein-Ausgänge definieren
    'Ddrc = &B00000000
    Ddrd = &B00010000
    '
    Initlcd                                                     'LCD initialiesieren
    Cursor Off
    Cls
    '
    '
    Upperline
    Lcd " Hallo AVR"
    Wait 2
    Cls
    
    
    
    '===================Hauptprogramm===============================================
    'Do
    
    '----schreiben----
    For Adresse = 1 To 10                                       'Adresse geht über die Byte-Grenze
    Incr X                                                      '1 bis Überlauf
    '
    'Disable Interrupts
    I2cstart                                                    'Start
    I2cwbyte &HA0                                               'Sende Slavadresse
    I2cwbyte High_adresse                                       'Sende Speicheradresse High
    I2cwbyte Low_adresse                                        'Sende Speicheradresse  LOW
    I2cwbyte X                                                  'Sende Wert
    I2cstop                                                     'stop
    Waitms 10
    'Enable Interrupts
    '
    Locate 1 , 1
    Lcd "->Adr." ; Adresse ; "Wert=" ; X ; "  "                 'Anzeige vom schreiben
    Waitms 500
    Next Adresse
    
    '---lesen----
    'Disable Interrupts
    For Adresse = 1 To 10
    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 Lesen , Nack                                       'Lese Adresse vom EEprom
    I2cstop                                                     'Stop
    'Enable Interrupts
    '
    Locate 2 , 1
    Lcd "<-Adr." ; Adresse ; "Wert=" ; Lesen ; "  "             'Anzeige vom lesen
    Waitms 500
    Next Adresse
    
    'loop
    End

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    37
    Beiträge
    687
    Hallo dl1akp,

    hast Du das Pollin Evo Board??

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2004
    Ort
    Thüringen
    Beiträge
    133
    Hallo, Rofo88,

    nein, ich habe ein selbst gebautes Board. Den 24C512 habe ich über Drähte angeschlossen. Es ist alles richtig konfiguriert und angeschlossen.

    MfG

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    28.08.2006
    Beiträge
    48
    Hello,
    I think you forgot an I2C Stop
    See the code below.
    Greetings,
    Drifter2006

    Code:
    $regfile = "m8def.dat"                                      ' Chip auswählen 
    $crystal = 3686400                                          'hier Taktfrequenz eintragen 
    $baud = 9600                                                'Baudrate RS232 
    ' 
    Config Lcd = 16 * 2                                         'LCD-Display configurieren 
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portb.1 , Rs = Portb.2 
    ' 
    Config Scl = Portc.5                                        'PINs für I2C Bus 
    Config Sda = Portc.4 
    I2cinit 
    ' 
    Dim X As Byte 
    Dim A As Word                                               'der wert, welcher ins EEPROM geschrieben werden soll 
    Dim B As Word 
    Dim Schreiben As Byte 
    Dim Lesen As Byte 
    
    'Die Adresse muß als Word-Variable definiert werden (Word=16Bit=0...65535) 
    'Damit kann ein EEPROM mit 256KBit (24C256) angesprochen werden (Adressen von 0...32768) 
    'und auch einer mit 512KBit (24C512). Adressbereich hier 0...65535 
    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 
    ' 
    Config Adc = Single , Prescaler = Auto                      'AD-Wandler starten 
    Start Adc 
    ' 
    Ddrb = &B00000000                                           'Ein-Ausgänge definieren 
    'Ddrc = &B00000000 
    Ddrd = &B00010000 
    ' 
    Initlcd                                                     'LCD initialiesieren 
    Cursor Off 
    Cls 
    ' 
    ' 
    Upperline 
    Lcd " Hallo AVR" 
    Wait 2 
    Cls 
    
    
    
    '===================Hauptprogramm=============================================== 
    'Do 
    
    '----schreiben---- 
    For Adresse = 1 To 10                                       'Adresse geht über die Byte-Grenze 
    Incr X                                                      '1 bis Überlauf 
    ' 
    'Disable Interrupts 
    I2cstart                                                    'Start 
    I2cwbyte &HA0                                               'Sende Slavadresse 
    I2cwbyte High_adresse                                       'Sende Speicheradresse High 
    I2cwbyte Low_adresse                                        'Sende Speicheradresse  LOW 
    I2cwbyte X                                                  'Sende Wert 
    I2cstop                                                     'stop 
    Waitms 10 
    'Enable Interrupts 
    ' 
    Locate 1 , 1 
    Lcd "->Adr." ; Adresse ; "Wert=" ; X ; "  "                 'Anzeige vom schreiben 
    Waitms 500 
    Next Adresse 
    
    '---lesen---- 
    'Disable Interrupts 
    For Adresse = 1 To 10 
    I2cstart                                                    'Start 
    I2cwbyte &HA0                                               'Sende Slavadresse +1 für Schreiben 
    I2cwbyte High_adresse                                       'Sende Speicheradresse High 
    I2cwbyte Low_adresse                                        'Sende Speicheradresse Low 
    
    I2cstop '<<<<<<<<<<<<<<<<<<<---------------------------------HERE'
    
    I2cstart                                                    'Start 
    I2cwbyte &HA1                                               'Sende Slavadresse +1 für Lesen 
    I2crbyte Lesen , Nack                                       'Lese Adresse vom EEprom 
    I2cstop                                                     'Stop 
    'Enable Interrupts 
    ' 
    Locate 2 , 1 
    Lcd "<-Adr." ; Adresse ; "Wert=" ; Lesen ; "  "             'Anzeige vom lesen 
    Waitms 500 
    Next Adresse 
    
    'loop

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2004
    Ort
    Thüringen
    Beiträge
    133
    Hello Drifter2006,

    thanks for the hint. I really forgot the i2cstop.
    But it still isn't working!

    Geht trotzdem nicht, auch mit i2cstop drin, wo es fehlte.

    Hat denn keiner eine Idee??
    Bitte Hilfe!

    MfG, Andreas

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2004
    Ort
    Thüringen
    Beiträge
    133
    Hi Leute,

    jetzt ist mir endlich ein Lichtausfgegangen!!!
    Konnte nicht gehen.
    Ich hatte im Code noch die Adresse vom 24C16 drin, anstatt umzuändern auf den 24C512!!!

    Sorry, kann ja mal passieren! Jetzt gehts.

    MfG, Andreas

Berechtigungen

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