- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 10

Thema: EEPROM 24LC16 schneller Schreiben mit ACKNOWLEDGE POLLING

  1. #1
    Gast

    EEPROM 24LC16 schneller Schreiben mit ACKNOWLEDGE POLLING

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    meine Routine verwendet eine Wartezeit von 10ms nach dem Schreiben, um sicherzustellen, dass das EEPROM das Byte geschrieben hat.
    Dies funktioniert gut, nur dauert es mir zu lange (2048 Byte * 10ms).
    Ich möchte nun diese Zeit durch das im Datenblatt beschriebene ACKNOWLEDGE POLLING verkürzen.

    Hat jemand eine Idee, wie das mit Bascom geht ?
    (z.B. ACKNOWLEDGE vom 24LC16 lesen).

    - AVR Mega8, 8MHz int. RC Oszi
    - Bascom Compiler Vollversion

    Gruss

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    21.09.2004
    Ort
    Augsburg
    Beiträge
    49
    poste doch mal deinen programmcode

  3. #3
    Gast
    Code:
    '----------[ I2C EEPROM Schreib Routine ]---------------------------------------
    Sub Write_eeprom(byval Adresse As Byte , Byval Block As Byte , Byval Wert As Byte)
        I2cstart                                      'start condition
        Waitms 1
        24c16_w = Block * 2                           ' Blockstart im EEPROM
        24c16_w = 24c16_w + &B1010_0000               ' + Bausteinadresse
        I2cwbyte 24c16_w                              ' Bausteinadresse
        Waitms 1
        I2cwbyte Adresse                              ' Adresse im IC
        Waitms 1
        I2cwbyte Wert                                 ' Byte schreiben
        Waitms 1
        I2cstop                                       ' Stopbedingung
        Waitms 10                                     ' int. Schreibzeit abwarten
    End Sub

  4. #4
    Gast
    probiers doch mal so, weiß zwar nicht ob das so richtig ist, sollte aber gehen. vielleicht weiß jemand anderes noch wie man das besser machen kann. wenn der schreibvorgang noch nicht fertig ist reagiert der baustein nicht auf seine adresse...

    kannst ja auch mal die sache mit page write probieren das sollte das ganze nochmal ein bischen beschleunigen - und gib mir dann bescheid wie das funktioniert mit page write ich habs nämlich noch nicht hinbekommen.


    nochmal:
    Err =0
    I2cstart
    I2cwbyte 24c16_w
    If Err = 1 Then
    goto nochmal
    end if
    I2cwbyte 24c16_w
    I2cwbyte Adresse
    I2cwbyte Wert
    I2cstop

    ps. wie kann man eigentlich das als programmcode posten??

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    21.09.2004
    Ort
    Augsburg
    Beiträge
    49
    also das mit dem automatisch ins forum einloggen funktioniert wohl auch nicht so richtig ich schreib immer als gast
    gruß Werner...

  6. #6
    Gast
    danke für den Tipp.
    Leider bleibt die Routine damit am Anfang hängen,
    das ACk wird nicht erkannt.
    Ich werde mir Messequipment besorgen, mit dem
    ich (hoffentlich) das ACK vom EEPROM messen kann.

    Pagewrite bringt sicherlich auch nochmal was,
    allerdings muss ich da meine anderen Routinen anpassen.

    PS : den Programmcode habe ich mit der Formatierung
    "CODE" eingefügt.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    21.09.2004
    Ort
    Augsburg
    Beiträge
    49
    Zitat Zitat von Anonymous
    danke für den Tipp.
    Leider bleibt die Routine damit am Anfang hängen,
    ich glaub ich hab was vergessen klar bleibts hängen..
    probiers mal so:

    Code:
    nochmal: 
    Err =0 
    I2cstart 
    I2cwbyte 24c16_w 
    If Err = 1 Then 
       waitus 10
       i2cstop
       waitus 10
    goto nochmal 
    end if 
    I2cwbyte 24c16_w 
    I2cwbyte Adresse 
    I2cwbyte Wert 
    I2cstop
    eventuell kannst auch das erste wait weglassen beim 2ten kommts auf dein eprom an bzw. die länge des wait ist auch unterschiedlich bei den eproms.
    gruß werner...

  8. #8
    Gast
    Es klappt !

    Der Test dauert jetzt 6 Sek statt 25 Sek.

    Ich hatte noch ein Hardware-Problem, zwei in SCL und SDA eingefügte
    ESD-Schutzbauelemente haben mit ihrer Kapazität die Flanken zu stark
    verschliffen.

    Nachfolgend der Code:
    Code:
    Sub Write_eeprom_ack(byval Adresse As Byte , Byval Block As Byte , Byval Wert As Byte)
       24c16_w = Block * 2                            ' Blockstart im EEPROM
       24c16_w = 24c16_w + &B1010_0000                ' + Bausteinadresse
       Nochmal:
       Err = 0                                        ' allg. Fehlervar. auf Null
       I2cstart                                       ' I2C Start
       I2cwbyte 24c16_w                               ' "Device Adres Word"
       If Err = 1 Then
          Waitus 1                                    ' Bus free time
          Goto Nochmal
       End If
       I2cwbyte Adresse                               ' Adresse im Block
       I2cwbyte Wert
       I2cstop                                        ' I2C Stopp
    End Sub

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    21.09.2004
    Ort
    Augsburg
    Beiträge
    49
    um einen wert zu schreiben 6 sek? das is lang.

    würde mich jetzt nur noch interessieren wie das mit block write geht hat das schon jemand Erfahrungen?
    gruß Werner...

  10. #10
    Gast
    Verfasst am: 01.12.2004, 19:23 Titel:

    --------------------------------------------------------------------------------

    um einen wert zu schreiben 6 sek? das is lang.

    würde mich jetzt nur noch interessieren wie das mit block write geht hat das schon jemand Erfahrungen?
    gruß Werner...
    Der ganze Test, also 2048 Byte schreiben, lesen und vergleichen, dauert jetzt 6 Sek mit ACK Polling statt 25 Sek mit fester Wartezeit von 10ms nach dem Schreiben.

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad