-         

Ergebnis 1 bis 8 von 8

Thema: Wie zwei externe EEproms auslesen? Brauche Hilfe beim Code

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2006
    Beiträge
    11

    Wie zwei externe EEproms auslesen? Brauche Hilfe beim Code

    Anzeige

    Hi Leute,

    Ich habe ein kleines Problem, wo ich nicht wirklich weiter komme. Ich
    möchte gerne Daten aus zwei externen EEproms lesen. Die Daten
    werden vorher mittels Ponyprog auf die EEproms geschrieben und
    danach nicht mehr verändert. Ich muß zwei EEproms nehmen, da die
    größten, die ich kenne, nur 512KBit haben und da reicht leider einer
    nicht ;o))

    Mit einem EEprom bekomme ich es problemlos hin. Nur wie mache
    ich es (ohne den ganzen Code einfach nur zu duplizieren!) mit zwei
    EEproms?? Hier mal der Code, soweit ich ihn fertig habe:

    Code:
    $regfile = "m128def.DAT"
    $crystal = 16000000
    $baud = 19200
    $hwstack = 50
    $swstack = 50
    $framesize = 40
    
    $lib "I2C_TWI.LBX"                                                              'Setting up I2C hardware bus
    Config Twi = 400000                                                             'Hardware I2C bus speed
    Config Scl = Portd.0                                                            'TWI (i2c) ports on the Mega128
    Config Sda = Portd.1
    'EEproms are adressed as: &B 1010 A2(0) A1 A0 R/W
    Const Eeprom1w = &B10100000                                                     'slave write address eeprom
    Const EEprom1r = &B10100001                                                     'slave read address eeprom
    
    Const Eeprom2w = &B10100100                                                     'slave write address Eeprom #2
    Const Eeprom2r = &B10100101                                                     'slave read address Eeprom  #2
    
    
    
    '==== Declaration
    Declare Sub Read_eeprom_word(byval Adress As Word , Valueword As Word)
    Declare Sub Read_eeprom_index
    
    Dim Samples As Word , Start_byte(10) As Word , Lenght(10) As Word             
    Dim Bytetodo As Word , Outbyte As Byte
    Dim Temp As Byte , Tempw As Word , Lus As Byte
    Dim Bitcount As Byte , Tempadress2 As Byte
    
    '=== Main ===
    Read_eeprom_index                                                               'Read eeprom index
    Print Samples ; " Samples present in the eeprom"
    For Lus = 1 To Samples
    Print Lus ; "sample start at eeprom adress: &H" ; Hex(start_byte(lus)) ; " is &H" ; Hex(lenght(lus)) ; " bytes long."
    Next For
    Wait 3
    End
    
    
    
    '=== Sub routines ===
    Sub Read_eeprom_index                                                           'Find the start adresse 
          Read_eeprom_word 0 , Samples                                              '1e Byte in the eeprom contains the number of samples 
          Temp = Low(samples) : Temp = Temp -1                  '
          For Lus = 0 To Temp                                                       'Loop the number of Samples found
              Tempw = Lus * 2                                                       'Reading words, so steps 2
              Read_eeprom_word Tempw , Start_byte(lus + 1)                          'Read the start adres of the samples
              Tempw = Start_byte(lus + 1)
              Tempw = Tempw * 2                                                     'Reading words, so steps 2
              Read_eeprom_word Tempw , Lenght(lus + 1)                              'Read the lenght of the sample from the eeprom
              Rotate Lenght(lus + 1) , Left , 8                                     'Msb and Lsb are inverted so swap them
          Next Lus
    End Sub
    
    Sub Read_eeprom_word(byval Adress As Word , Valueword As Word)
       Local Tempadress As Byte , Valueh As Byte , Valuel As Byte,
       I2cstart                                                                     'generate start
       I2cwbyte EEprom1w                                                            'slave adsress
       Tempadress = High(adress)
       I2cwbyte Tempadress                                                          'highbyte adress of EEPROM
       Tempadress = Low(adress)
       I2cwbyte Tempadress                                                          'lowbyte adress of EEPROM
       I2cstart                                                                     'repeated start
       I2cwbyte EEprom1r                                                            'slave address (read)
       I2crbyte Valuel , Ack                                                        'read byte
       I2crbyte Valueh , Nack
       I2cstop                                                                      'generate stop
       Valueword = Makeint(valuel , Valueh)
    End Sub
    Problem: Ich weiß nicht unbedingt, ob die Daten EEProm übergreifend
    geschrieben wurden (Problem könnte man erledigen in dem man es
    beim schreiben der EEProm Daten verhindert) und ich weiß nicht, wieviele
    Samples insgesamt vorhanden sind.

    Wäre nett, wenn mir jemand zeigen könnte, wie ich die Daten aus EEprom
    #2 ( Also Eeprom2w & Eeprom2r) ebenfalls im gleichen Zuge auslesen
    könnte. Den Code aus den Subs Read_eeprom_index &
    Read_eeprom_word einfach nur zu duplizieren (mit den Adressen des
    Eeproms #2) kann ich wahrscheinlich nicht, da ich u.a. nicht genug Platz
    auf dem endgültigen Atmel (Mega habe.

    viele internette Grüße,
    Reinhard

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Nimm doch einfach ein größeres EEPROM!?
    24C256 - DIP8 . gibts bei Pollin.de für 2,20 EUR und hat 256KB...

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2006
    Beiträge
    11
    Hi stefan_Z,

    Zitat Zitat von stefan_Z
    Nimm doch einfach ein größeres EEPROM!?
    24C256 - DIP8 . gibts bei Pollin.de für 2,20 EUR und hat 256KB...
    Ich fürchte dab verstehe ich nicht ganz ;o)) Seit wann sind 256KBIT
    größer als 512KBIT? Ich nutze ja schon ein (zwei) 24C512. Nur leider
    reichen eben 64KBYTE (24C512) nicht für diese Anwendung. 1MBit
    Eeproms gibt es (zumindest so weit ich weiß) nicht. Außerdem müßte
    die Adressierung dann mit >16 Bit erfolgen. Dies ist (swiw) in Bascom
    auch nicht möglich.

    viele internette Grüße,
    Reinhard

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2006
    Beiträge
    11
    Hat keiner eine Idee?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.06.2005
    Alter
    28
    Beiträge
    364
    Mach doch einfach die EEprom Variable mit in die Subroutine rein. Als Übergabe, ist doch einfach. Im Moment hast du noch
    I2cwbyte EEprom1w
    Und da machst du einfach die Variable Veepromw hin
    und übergibst einfach beim Unterprogrammaufruf den Wert der Schreib-Adresse für EEpróm1w. Fertig.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Woops sorry - da habe ich kb für kB genommen....

  7. #7

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2006
    Beiträge
    11
    Moin Leute,

    Sorry, ich hatte leider keine Zeit früher zu antworten.

    @womb@t
    Du meinst also in etwa so:
    Code:
    Sub Read_eeprom_index(byval Eeprom As Byte)                 'Find the start addy 
     Select Case Eeprom
       Case 1:
            Addressw = &B10100000                               'slave write address eeprom
            Addressr = &B10100001                               'slave read address eeprom
       Case 2:
            Addressw = &B10100010                               'slave write address eeprom
            Addressr = &B10100011                               'slave read address eeprom
     End Select
     Read_eeprom_word 0 , Samples                               
     Temp = Low(samples) : Temp = Temp -1                       '
     For Lus = 0 To Temp                                        'Loop the number of Samples found
     Tempw = Lus * 2                                            'Reading words, so steps 2
     Read_eeprom_word Tempw , Start_byte(lus + 1)       
     Tempw = Start_byte(lus + 1)
     Tempw = Tempw * 2                                          'Reading words, so steps 2
     Read_eeprom_word Tempw , Lenght(lus + 1)                   'Read the lenght of the sample from the eeprom
     Rotate Lenght(lus + 1) , Left , 8                          'Msb and Lsb are inverted so swap them
     Next Lus
    End Sub
    Das müßte eigentlich gehen. Thanxs!

    @helimike0705:
    Danke für den Link. Das kann ich für etwas anderes benutzen. Hier in
    diesem Fall geht es nicht, da ich keine I/O (also nur die SCL SDA fürs
    EEprom) am Mega-8 mehr frei habe. Außerdem ist die SD Karte VIEL
    zu groß. Das ganze wird ein Delaytimer für Modellraketen. Da kommt
    es auf die Größe an ;o)). Außerdem weiß ich nicht wie gut die SD
    Karten und der Slot die hohen G-Kräfte beim Start verkraften.

    viele internette Grüße,
    Reinhard

Berechtigungen

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