Hallo fredred,
Zitat Zitat von fredred Beitrag anzeigen
Nehme nach wie vor an der IC ST24C64 will mich narren.
Nein, leider nicht. In dem "Schreiben" Unterprogramm war noch ein Bug - habe ich rot markiert (Da läßt sich noch einiges optimieren, habe es aber erstmal so stehen lassen.)

Den Rest habe ich nochmal versucht gerade zu biegen und sollte für Dich kompilierbar und ablauffähig sein. Ich kann leider nur mit Tiny44 und einem 24C08 testen. Viel Glück (auch für mich ) (Debounce habe ich auch mal reingebracht - meine Taster prellen fürchterlich)

Gruß
Searcher

Code:
$regfile "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 40
$baud = 19200                                               '19200


'gibt den Erstellungszeitpunkt im europäischen Format DD-MM-YY hh:nn:ss
'und die Code-Version aus.
Print
Print "erstallt am       : " ; Version(1)
Print "Version Code : " ; Version(3)
Print
Waitms 100
$lib "i2c_TWI.lib"                                          'hardware I²C einbinden
Config Twi = 100000                                         ' Takt 100kHz

'Format für Single zwei Nachkommastellen
Config Single = Scientific , Digits = 2
Config Base = 0                                             'Array Indexe beginnen mit 0

Const Dev_addr_write = &B10100000                           'EEPROM Schreibadresse
Const Dev_addr_read = &B10100001                            'EEPROM Leseadresse
Dim J As Byte                                               'Laufvariable für for-next Schleife Single
Dim Mem_addr_first_store_loc As Word
Dim Mem_addr As Word
Dim Mem_addr_low_byte As Byte At Mem_addr Overlay
Dim Mem_addr_high_byte As Byte At Mem_addr + 1 Overlay
Dim Z As Byte                                               'Anzahl der Single_Variablen schreiben
Dim Number_from_rs232(6) As Single                          'Array der 6 Schreib-Variablen
Dim Four_byte_var_write As Single
Dim Byte_var_write(3) As Byte At Four_byte_var_write Overlay       '4 Elemente, Arrayindex von 0 bis 3
Dim L As Byte                                               'alle Single_Variablen auslesen
Dim Number_from_rl232(6) As Single
Dim Four_byte_var_read As Single
Dim Byte_var_read(3) As Byte At Four_byte_var_read Overlay  '4 Elemente, Arrayindex von 0 bis 3
Dim Aktionen As Byte                                        'nächsten Schreibzyklus vortschreiben

'!!!!! ist nur für Test mit Taster also anpassen !!!!
Config Pinc.3 = Input                                       'Taster für EEprom schreiben
Portc.3 = 1                                                 'Port auf H schalten
Taster_s Alias Pinc.3                                       'Taster ein Namen geben
Config Pinc.2 = Input                                       'Taster für EEprom lesen
Portc.2 = 1                                                 'Port auf H schalten
Taster_l Alias Pinc.2                                       'Taster ein Namen geben
Gosub Lesen                                                 'nach Reset erstmal lesen

Do

Debounce Taster_s , 0 , Schreiben , Sub
Debounce Taster_l , 0 , Lesen , Sub

'(
 '--- hier zum Daten schrieben --------
  If Taster_s = 0 Then                                      'wenn Taste gedrückt schreiben
       Waitms 100                                           'nur für Test
    Gosub Schreiben
  End If
'--- hier zum Daten lesen ------------
  If Taster_l = 0 Then                                      'wenn Taste gedrückt lesen
       Waitms 100                                           'nur für Test
    Gosub Lesen
  End If
')

Loop

'### BEGINN ext. EEPROM schreiben (byte write method) ###
Schreiben:
  Print "Byte der 6 Single-Variablen schreiben"
  Print
  Mem_addr_first_store_loc = Aktionen * 24                  '24 = 6 Singles * 4 Byte (ein Single belegt 4 Byte)
  Mem_addr = Mem_addr_first_store_loc                       'Speicheradresse für ext. EEPROM initialisieren
  For Z = 0 To 5                                            'for-next mit 0 beginnen lassen
    If Z = 0 Then Number_from_rs232(0) = 100.10
    If Z = 1 Then Number_from_rs232(1) = 200.20
    If Z = 2 Then Number_from_rs232(2) = 300.30
    If Z = 3 Then Number_from_rs232(3) = 400.40
    If Z = 4 Then Number_from_rs232(4) = 500.60
    If Z = 5 Then Number_from_rs232(5) = 600.60
    Four_byte_var_write = Number_from_rs232(z)              'Single Variable Z schreiben
'    Mem_addr = Mem_addr_first_store_loc                     'HIER WAR DER BUG !!! steht jetzt vor Laufschleife
    For J = 0 To 3                                          'Laufschleife um 4 Bytes zu schreiben
      I2cstart
      I2cwbyte Dev_addr_write                               'Sendet ext. EEPROM Adresse zum Schreiben
      I2cwbyte Mem_addr_high_byte                           'Sendet Speicher-Schreibadresse
      I2cwbyte Mem_addr_low_byte                            'Sendet Speicher-Schreibadresse
      I2cwbyte Byte_var_write(j)                            'Sendet Datenbyte
      I2cstop
      Mem_addr = Mem_addr + 1                               'Schreibadresse mit jedem Schleifendurchlauf erhöhen
      Waitms 10                                             'Warten auf ext. EEPROM
      Print "Single-Variable   " ; Z ; " =  Adresse " ; J ; "  Bytewert  " ; Byte_var_write(j)
    Next J
    Print "!!  Ausgabe  !!  " ; Four_byte_var_write
    Print
  Next Z
  Incr Aktionen                                             'nächsten Schreibzyklus anstoßen
'### ENDE ext. EEPROM schreiben (byte write method) ###
Return


'### BEGINN ext. EEPROM lesen (random address read method) ###
Lesen:
  Print "Byte der 6 Single-Variablen lesen"
  Print
  For L = 0 To 5                                            ' Step 4         'hier mein Versuch 10 Aktionen lesen
    Mem_addr = L * 4                                        'statt step 4: L * 4 Leseadresse für ext. EEPROM initialisieren
    For J = 0 To 3                                          'Laufschleife um 4 Bytes zu schreiben
      I2cstart
      I2cwbyte Dev_addr_write                               'Sendet ext. EEPROM Adresse zum Schreiben
      I2cwbyte Mem_addr_high_byte                             'Sendet Speicher-Leseadresse
      I2cwbyte Mem_addr_low_byte                            'Sendet Speicher-Leseadresse
      I2cstart                                              'zweites Start ohne vorheriges Stop (siehe Datenblatt "random address read")
      I2cwbyte Dev_addr_read                                'Sendet ext. EEPROM Adresse zum Lesen
      I2crbyte Byte_var_read(j) , Nack                      'Liest Datenbyte
      I2cstop
      Mem_addr = Mem_addr + 1                               'Leseadresse mit jedem Schleifendurchlauf erhöhen
      Waitms 10
      Print "Single_Variable  " ; L ; "  = Adresse " ; J ; "  Bytewert  " ; Byte_var_read(j)
    Next J

 '### BEGINN SW UART Ausgabe ###
    Print "!!  Ausgabe  !!  " ; Four_byte_var_read          'Single paßt nicht zu vorher geprinteten Mem_addr
    Print
  Next L
 'zurück setzen
  Aktionen = 0                                              'alle Aktionen wurden ausgelesen.
Return
'########ENDE ext. EEPROM lesen (random address read method)