Hallo fredred,

Zitat von
fredred
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)
Lesezeichen