Hallo Leute,
Theorie OK und Praxis zeigt, nicht alles ist OK
Erfahrung:
Nach Einsockeln eines „jungfräulichen“ Eeprom, war eine kleine Optimierung nötig.
Eeprom lesen immer bis zum Ende des Speichers, sollt doch nicht sein.
Die [var_read] ist ja werkseitig immer 255, somit noch dies eingefügt und Abfragen höher gelegt.
If Four_byte_var_read = "" Or Byte_var_read(j) = 255 Then
Nun wird lesen beendet, wenn Speicherplatz „leer „
Auch nach Auslesung des Eeprom wieder von Adr 0 zu beschreiben, war Dumm, nun wird [Mem_Addr] schreiben erst auf 0 gesetzt, wenn [Speichervoll]. Gleiches gilt auch beim Schreiben. Somit erhalten alle Speicherplätze die gleiche „Lebensdauer“
Nun der aktuelle Code.
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 'Hinweis: Diese Einstellung reserviert ein paar ROM-Speicher mehr.. 'nur nötig wenn eine Var den Typ Single hat. Die letzte Stelle wird gerundet. 'Format für Single zwei Nachkommastellen Config Single = Scientific , Digits = 2 '2 Nachkommastellen oder wie auch immer Config Base = 0 'alle Zähler mit 0 beginnen 'mehrer unterschiedliche I²C IC am Bus "anzuhängen" ist mit Dev_addr Select kein Problem. '#### Eeprom Konstanten festlegen ########### Const Dev_addr_write = &B10100000 'EEPROM Schreibadresse (ST24C64) Const Dev_addr_read = &B10100001 'EEPROM Leseadresse (ST24C64) Const Stringanz = 6 'String Var Anzahl Const Stringmax = 8 'für jedes String 8 Byte reserviert. Const Speichervoll = 16000 'maximale Speichergröße in Byte (zB.ST24C64) '############################################ '!!!!!!! Ü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 '!!!!! 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 '+++ Beispiel1 für Single ++++++ Dim Temperatur1 As Single Temperatur1 = 19.55 'sind 4Byte Var2 = Str(temperatur1) 'Single als String übergeben '+++++++++++++++++++++++++++++++ '+++ Beispiel2 für Single ++++++ Dim Temperatur2 As Single Temperatur2 = -3.55 'sind 4Byte Var3 = Str(temperatur2) 'Single als String übergeben '+++++++++++++++++++++++++++++++ Mem_addr = 0 ' Sicher ist Sicher '**** Hauptschleife **** Do 'für Test einfach mal so Datum = "01.02.14" Zeit = "15:10:00" 'Var2 = "100.10" 'ist ausgeblendet da Beispiel aktiv 'Var3 = "123456" 'ist ausgeblendet da Beispiel aktiv 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 >= 626 Then Eepvoll = 1 '626 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 S 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 'ist Speicher am Ende dann wieder von vorn If Mem_addr = Speichervoll Then 'schreiben beginnt wieder ab Adr 0. Rest bleib erhalten. Aktionen = 0 End If 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 'starte Lesung bei Adr 0 For Mem_addr = Aktionenl To Speichervoll '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) '-------------------- 'wenn -NAN dann Auslesung beenden(soll nicht unbeschriebenen Speicher lesen) If Four_byte_var_read = "" Or Byte_var_read(j) = 255 Then Return End If Next J '### BEGINN Terminal_log Ausgabe für Auswertungen in Excel ### '### CSV Trenzeichen ist [;] ### Print Four_byte_var_read ; ";" ; 'Daten wurden gelesen Eepvoll = 0 'LED aus 'Nach Zwischenauslesung Speicherbereich fortsschreiben soll ja nicht 'immer die gleichen Zellen besschreiben("Lebensdauer") If Mem_addr = Speichervoll Then 'schreiben beginnt wieder ab Adr 0. Rest bleib erhalten. Aktionen = 0 End If Next L Print Chr(3) 'wird benötigt für CSV(End Off Text 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) Print "ist ein ICxxx Adr xxx" End If ') End If Next Return
Wird wohl nicht der letzte sein
PS. Bin gerate dabei 2 * ST24C512 am Bus als Massenspeicher zu „hängen“.
Mit freundlichen Grüßen
fredred







Zitieren

Lesezeichen