-         

Ergebnis 1 bis 7 von 7

Thema: I2C EEPROM bringt programm zum absturz

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.01.2004
    Beiträge
    135

    I2C EEPROM bringt programm zum absturz

    Anzeige

    Ich versuche mit dem Code aus diesem Artikel: http://www.roboternetz.de/phpBB2/viewtopic.php?t=12086
    ein 256kb eeprom anzusteuern. Angeschlossen ist es richtig und die SCL und SDA ports sind auch richtig konfiguriert. Hab den fehler schon soweit eingegrenzt das ich sagen kann das es daran liegt das sich das programm komplett aufhängt sobald mit Call Write_eeprom(1 , A , Value) die Sub aufgerufen wird.
    Woran liegt das ? Ist der code falsch ? Hab auch schon andere sachen probiert und in die sub n return eingebaut usw. aber das bringt nix. Hängt sich einfach auf das ding...
    Hat jemand ne ahnung und kann mir helfen ?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    sieht auf den ersten Blick so aus, als würde das EEPROM nicht auf deinen Befehl reagieren, und weil die Routine anscheinend ne Rückmeldung erwartet und kein Timeout eingebaut hat, wartet sie nun ewig und drei Tage...

    sicher, dass aucgh die Adress am EEPROM richtig eingestellt ist?

    gibt es in Bascom einen Befehl, mit dem man feststellen kann, ob unter einer bestimmten Adresse überhaupt ein Slave vorhanden ist und antwortet?

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.01.2004
    Beiträge
    135
    Also die 2 Adress Pins sind jetzt unbeschaltet also 0
    Hab auch schon beide auf Masse gelegt aber das hilft auch nichts. Hab auch das EEPROM schon ausgetauscht weil ich schon dachte es wär kaputt. Hab zum glück 2 bestellt...
    Pullup Widerstände hab ich auch (10k) an SDA und SCL aber funzt weder mit noch ohne...
    Benutzt der I2C befehl von Bascom vielleicht nen Timer und das liegt daran das ich beide Timer schon benutze ?

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    hi, dein eeprom ist auch das 24c256 oder 24c128 ?

    ne, n timer wird da nicht benutzt, ich hab die auch fast alle
    in betrieb bei der Routine die ich da eingestellt habe.

    ich tippe darauf, das du nicht high und lowbyte der
    speicherzelle sendest und der eeprom dann einfach nix macht.

    oops, ich hatte ja die generierung der adresse im codebeispiel nicht drinne,
    hab ich nachgebessert, nun müssts funktionieren

    PS: der Speicherbeich der Adressdaten ist dem jeweiligen Baustein anzupassen, aber Bascom meckert schon wenn der bereich schon belegt ist. Dann einfach weiter probieren bis ein freier gefunden ist. wichtig: die overlay-variablen sind auch anzupassen.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.01.2004
    Beiträge
    135
    Mein eeprom ist das 24c256. Aber nu versteh ich gar nix mehr: Was sind overlay variablen ?
    Das mit den high und lowbytes der Adresse hab ich glaub ich wohl verstanden. Kannste vielleicht n code posten der für den 24c256 funzt ? Und mir erklären was overlay variablen sind ?

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.01.2004
    Beiträge
    135
    Hm hab mehrere fehler bei mir gefunden: Im datenblatt hab ich übersehen das da "Bottom View" drunterstand und ich hab gedacht das wär von oben gesehen. War also total falsch angeschlossen.
    Da ich beide von meinen eeproms aber schon mit falschem anschluss ausprobiert hab, hab ich gedacht das die nu schrott sind.
    Bis ich auf die geniale idee gekommen bin und die eeproms in der c-control ausprobiert hab. Da gehen die beide aber noch.
    Also muss das an der software liegen.
    Werd nu mal das 8kb-eeprom aus der c-control in meinen robby einbauen und mit dem Bascom sample testen. Wenns dann geht is gut dann lass ich das erst so.
    8kb sollten eigentlich erst mal ausreichen...

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    hab den code in dem von dir angeführten Artikel geändert:

    Code:
    
    
    Declare Sub Write_eeprom(byval Adresh As Byte , Byval Adresl As Byte , Byval Value As Byte)
    Declare Sub Read_eeprom(byval Adresh As Byte , Byval Adresl As Byte , Value As Byte)
    
    ' Adresse erzeugen:
    ' Pin A0 und A1 sind intern mit Pulldowns versehen, sind also
    ' wenn extern nicht beschaltet 0
    ' Die Der Baustein halt serienmäßig die Adresse Binär:
    ' 1 0 1 0 0 A1 A0 R/W
    ' also, angenommen man möcht bei A0 = 0 und A1=0 schreiben:
    ' Adresse: 10100000 = 160
    ' Lesen Adresse: 10100001 = 161
    '
    ' der 24c128 und 24c256 brauchen für die Adressierung 2 Byte
    ' Den High-Byte der Adresse und den Lowbyte der Adresse.
    ' Einfach, da die soviel Speicher habn :o)
    
    Const Addressw = 160                                        'slave write address
    Const Addressr = 161                                        'slave read address
    
    Dim B1 As Byte
    Dim Value As Byte                                           'dim byte
    dim Adresse as word at &HA0 ' Der Speicherbereich ist dem jeweiligen Baustein anzupassen, muß aber den overlayvariablen gleich sein
    Dim Adresh As Byte at &HA1 overlay                                          'Highbyte der Adresse
    
    Dim Adresl As Byte at &HA0 overlay                                         'Lowbyte der Adresse
    Dim A As Byte                                               'allgemeine Variable für Berechnungen
    
    For Adresse = 1 To 5    ' die ersten 5 Byte schreiben
       Value = Adresse + 100     'Beginnend mit Zahlenwert 105 um Verwechslungen zu vermeiden
       Call Write_eeprom(1 , Adresse , Value)  'Daten schreiben
    Next Adresse
    
    For Adresse = 1 To 5    'die geschriebenen 5 Byte auslesen
       Call Read_eeprom(1 , Adresse , Value)    'auslesen
       Print Value     'Ausgabe an UART
    Next Adresse
    
    Sub Write_eeprom(byval Adresh As Byte , Adresl As Byte , Value As Byte)
        I2cstart        'start condition
        I2cwbyte Addressw   'slave address
        I2cwbyte Adresh    'asdress H of EEPROM
        I2cwbyte Adresl     'asdress L of EEPROM
        I2cwbyte Value      'value to write
        I2cstop         'stop condition
        Waitms 10       'wait for 10 milliseconds
    End Sub
    
    Sub Read_eeprom(byval Adresh As Byte , Adresl As Byte , Value As Byte)
       I2cstart       'generate start
       I2cwbyte Addressw   'slave adsress
       I2cwbyte Adresh     'asdress H of EEPROM
       I2cwbyte Adresl    'asdress L of EEPROM
       I2cstart              'repeated start
       I2cwbyte Addressr        'slave address (read)
       I2crbyte Value , Nack    'read byte
       I2cstop        'generate stop
    End Sub
    overlayvariablen sind einfach variablen, die sich den speicherbereich teilen, sie greifen auf die gleichen sram-adressen zu
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Berechtigungen

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