Hallo Forum Mitglieder und Gäste
Guten Tag Searcher,

nun können wir das Thema beenden. Habe alles im Griff.
In mein aktuellem Projekt werden nun alle Variablen automatisch in Eeprom geschrieben und nach bedarf an Excel übergeben, für Auswertungen und grafische Abbildungen. Bild nur mal so im Anhang gelegt. Sehr aufwendige VBA da auch SD-Karten-Daten eingelesen werden können.
Natürlich bin ich auch, im nachhinein interessiert, für Optimierung oder Anregungen.
Somit erlaube ich mich, meine Test-Demo für I²C- Eeprom, mit zu senden.

Code:
'******************  Test-Demo  **************************
'* ist ein Testmodul für Data extern EEprom als Speicher *
'*   am I²C Bus ein 24c64 angeschlossen zum speichern    *
'*          und lesen der Variablen                      *
'*  alle Variablen werden als Strings konvertiert.       *
'*  somit unabhänig von Daten-Typ. Auch lange Texte sind *
'*              kein Problem mehr.                       *
'*  Die Variablen können mit Hyperterminal_Log als CSV   *
'*    für Auswertungen an EXCEL übergeben werden        *
'*    oder nur auf LCD usw.                              *
'*********************************************************
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 auf Hyperterminal 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
'nur nötig wenn eine Var den Typ Single hat.
Config Single = Scientific , Digits = 2                     '2 Nachkommastellen oder wie auch immer
Config Base = 0
'#### Eeprom Konstanten festlegen ###########
Const Dev_addr_write = &B10100000                           'EEPROM Schreibadresse  (ST24C64)
Const Dev_addr_read = &B10100001                            'EEPROM Leseadresse
Const Stringanz = 6                                         'String Var Anzahl
Const Stringmax = 8                                         'für jedes String 8 Byte reserviert.
Const Speichervol = 16000                                   'maximale Speichergröße in Byte
'############################################

'!!!!!!! Übergabe von Konstanden NICHT ändern !!!!!!!!!!
Const Byteschleife = Stringanz + 1                          'bedingt durch String
Const Stringab = Stringmax + 1
Dim Aktschleife As Word
Aktschleife = Stringanz * Stringmax
Aktschleife = Aktschleife + 9                               'ist Summe aller Byte + String Endzeichen
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Dim Mem_addr As Word                                        'Adress Zähler
Dim J As Byte                                               'Laufvariable für Byte Schleife
Dim Mem_addr_low_byte As Byte At Mem_addr Overlay           'da Eeprom > 8kByte aufteilen
Dim Mem_addr_high_byte As Byte At Mem_addr + 1 Overlay
Dim Aktionen As Word                                        'Schreib-Zähler
Dim Aktionenl As Word                                       'Lese-Zähler

Dim S As Byte                                               'Laufvariable für for-next Schleife schreiben
Dim Number_from_rs(byteschleife) As String * Stringab       'Array der Schreib-Variablen
Dim Four_byte_var_write As String * Stringmax
Dim Byte_var_write(stringmax) As Byte At Four_byte_var_write Overlay       ' Elemente Arrayindex
Dim L As Word                                               'Zyklus fortschreiben lesen                                            'alle Single_Variablen auslesen
Dim Four_byte_var_read As String * Stringmax
Dim Byte_var_read(stringmax) As Byte At Four_byte_var_read Overlay       ' Elemente, Arrayindex
Dim Spst As Word
'!!!!! 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
Config Portc.4 = Output
Eepvoll Alias Portc.4                                       'LED-Warnung für EEprom voll
'+++ zu Test ob I²C Hardware OK ist +++
Gosub I2c_test
'++++++++++++++++++++++++++++++++++++++
'Gosub Lesen                                                'nach Reset erstmal lesen

'### hier werden die Variablen für EEprom-Test festgelegt ##########
     Dim Datum As String * Stringmax
     Dim Zeit As String * Stringmax
     Dim Var2 As String * Stringmax
     Dim Var3 As String * Stringmax
     Dim Var4 As String * Stringmax
     Dim Var5 As String * Stringmax
     Dim Var6 As String * Stringmax
'+++ Beispiel für Single ++++++
     Dim Temperatur1 As Single
        Temperatur1 = 19.66
     Var2 = Str(temperatur1)                                'Single als String übergeben
'+++++++++++++++++++++++++++++++
Mem_addr = 0                                                ' Sicher ist Sicher
'**** Hauptschleife ****
Do
'für Test einfach mal so
     Datum = "07.11.13"
     Zeit = "15:10:00"
     'Var2 = "100.10"                                        'ist ausgeblendet da Beispiel aktiv
     Var3 = "200.20"
     Var4 = "300.30"
     Var5 = "fredred"
     Var6 = "Test-OK"

'Aktionen mit Taster in Echt durch Ereignis ersetzen zB. Timer
Debounce Taster_s , 0 , Schreiben , Sub                     'entprellen
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
'**** END Hauptsschleife ****

'### BEGINN in ext EEPROM schreiben (byte write method) ###
Schreiben:
 '--- für Test ---
  Print "Byte der Var-Variablen schreiben  " ; "Aktionen  " ; Aktionen
  Print
 '----------------
  Mem_addr = Aktionen * Aktschleife                         'step Aktionen
'LED Anzeige wenn Eeprom gelesen werden sollte
    If Mem_addr >= 226 Then Eepvoll = 1                     '226 ist nur ein Beispiel kann auch [Speichervol- xxx] sein
 For S = 0 To Stringanz                                     'for-next mit 0 beginnen da Base = 0
    If S = 0 Then Number_from_rs(0) = Datum
    If S = 1 Then Number_from_rs(1) = Zeit
    If S = 2 Then Number_from_rs(2) = Var2
    If S = 3 Then Number_from_rs(3) = Var3
    If S = 4 Then Number_from_rs(4) = Var4
    If S = 5 Then Number_from_rs(5) = Var5
    If S = 6 Then Number_from_rs(6) = Var6
    Four_byte_var_write = Number_from_rs(s)                 'String Variable L schreiben
    For J = 0 To Byteschleife                               'Laufschleife 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
'--- nur für Test ---
       Print "Var-Variable   " ; S ; " =  Adresse " ; Mem_addr ; "  Bytewert  " ; Byte_var_write(j)
'--------------------
    Next J
'--- nur für Test ---
       Print "!!  Ausgabe  !!  " ; Four_byte_var_write
       Print
'---------------------
 Next S
  Incr Aktionen                                             'nächsten Schreibzyklus anstoßen
Return
'### ENDE ext EEPROM schreiben ###

'-----------------------------------------------------------
'### BEGINN aus ext.EEPROM lesen  ###
Lesen:
   Mem_addr = 0                                             'da Variable auch für schreiben gesetz ist zum lesen zurück setzen.
   Aktionenl = 0
For Mem_addr = Aktionenl To Speichervol                     'ist max Byte für Eeprom
'--- nur für Test ---
 ' Print "Byte der 6 Var-Variablen lesen " ; "Zyklus  " ; Aktionenl
 ' Print
'--------------------
  For L = 0 To Stringanz
    For J = 0 To Byteschleife                               'Laufschleife lesen
      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
        Waitms 10
      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
'--- nur für Test ---
  ' Print "Var_Variable  " ; L ; "  = Byte " ; Mem_addr ; "  Bytewert  " ; Byte_var_read(j)
'--------------------
   Next J
'### BEGINN Terminal_log Ausgabe für Auswertungen in Excel ###
'### CSV Trenzeichen ist [;] ###
        Print Four_byte_var_read ; ";" ;
  'Daten wurden gesichert
    Eepvoll = 0                                             'LED aus
'schreiben beginnt wieder ab Adr 0. Rest bleib erhalten.
    Aktionen = 0
'wenn -NAN dann Auslesung beenden(soll nicht unbeschriebenen Speicher lesen)
    If Four_byte_var_read = "" Then
        Return
    End If
  Next L
     Print Chr(10)                                          'wird benötigt für CSV(Zeilenumbruch nach Zyklus)
        Incr Aktionenl                                      'Lesezyklus hochzählen bis -Nan
  Next Mem_addr
Return
'#### ENDE ext.EEPROM lesen ####

'-----------------------------------------------------
I2c_test:
Dim Busaddress As Byte
Dim Busaddress_read As Byte
Dim Chipaddress As Byte
Print "I2C Scan start"
'I²C Porterweiterung testen
'Alle Adresen Suche und Anzeigen
'Step 2 soll nur IC Adresse aufrufen für lesen
For Chipaddress = 0 To 254 Step 2                           ' IC's am I²C-Bus erkennen
   I2cstart                                                 'send start
   I2cwbyte Chipaddress                                     'sende Addresse auf Bus
 If Err = 0 Then                                            'Chip gefunden
  If Chipaddress = Dev_addr_write Then
    Print "gefunden  " ; "h  " ; Hex(chipaddress) ; "   b " ; Bin(chipaddress)
    Print "ist ein ST24C64 Adr 000"
    End If
  'hier können noch weitere I²C IC Teilnehmer abgefragt werden.
'(
 If Chipaddress = xxx Then
    Print "gefunden  " ; "h  " ; Hex(chipaddress) ; "   b " ; Bin(chipaddress)
  End If
')
  End If
 Next
    Return



Danke an alle für Hilfe und verbleibe bis zum nächstem Problem
Mit freundlichen Grüßen