Nach Rücksprache mit dem Hersteller nun der geänderte Code um auf das RAM-Device zuzugreifen
Code:
$regfile = "m2560def.dat"
$hwstack = 128
$framesize = 128
$swstack = 128
$crystal = 16000000
$baud = 9600
Config Sda = Portd.1 'SDA und SCL definiere
Config Scl = Portd.0 'für TWI-Bus-Konfiguration
Config Twi = 100000 ' wanted clock frequency
I2cinit ' nur bei SoftwareTWI ??
Declare Sub Write_ccramdevice(byval Adres As Word , Byval W1 As Byte)
Declare Sub Read_ccramdevice(byval Adres As Word )
Dim Temp As Byte
Dim Templ As Byte
Const Saa1064w = &H70
Const Saa1064r = &H71
Const Datenpcfw = &H4E
Const Datenpcfr = &H4F
Const Controlpcfw = &H4C
'Sonstiges
Dim X As Word
Dim Y As Word
Dim Wert As Byte
Dim Adres16 As Word
Print Chr(12);
Do
For X = 1 To 10
Wert = Low(x)
Print Chr(12);
Print Chr(27) ; Chr(79) ; Chr(1) ; Chr(1);
Print "AdresseW " ; X ; " " ; Wert ;
Call Write_ccramdevice(x , Wert)
Next X
For Y = 1 To 10
Print Chr(12);
Print Chr(27) ; Chr(79) ; Chr(1) ; Chr(1);
Print "AdresseR " ; Y ;
Call Read_ccramdevice(y )
Next Y
Loop
End
Sub Write_ccramdevice(byval Adres As Word , Byval W1 As Byte)
Dim A As Byte
Disable Interrupts
'das Byte an DatenPCF senden
I2cstart 'start condition
A = W1 * 2
I2cwbyte Datenpcfw 'slave address
I2cwbyte A
I2cstop
// ersten 16 BIT der Adresse invertiert an SA1064 senden
I2cstart
I2cwbyte Saa1064w
Adres16 = Not Adres
Templ = Low(adres16)
I2cwbyte Templ
Waitms 100
Temp = High(adres16)
I2cwbyte Temp
Waitms 100
I2cstop
'an ControlPCF das 17.BIt der Adresse, der selektierte RAM-Baustein und das WE-high senden
'anschließend pulsen
I2cstart
I2cwbyte Controlpcfw
I2cwbyte &B11111010
Waitms 100
I2cwbyte &B11011010
Waitms 100
I2cwbyte &B11111010
Waitms 100
I2cstop
Enable Interrupts
Waitms 100
End Sub
Sub Read_ccramdevice(byval Adres Word)
Dim Value As Byte
Disable Interrupts
'die 255 and DatenPCF senden
I2cstart
I2cwbyte Datenpcfw
I2cwbyte &B11111111
Waitms 100
I2cstop
'die ersten 16 BIT der Adresse invertiert an SA1064 senden
I2cstart
I2cwbyte Saa1064w
Adres16 = Not Adres
Templ = Low(adres16)
I2cwbyte Templ
Waitms 100
Temp = High(adres16)
I2cwbyte Temp
Waitms 100
I2cstop
'an ControlPCF das 17.BIt der Adresse, der selektierte RAM-Baustein und das WE-high senden
I2cstart
I2cwbyte Controlpcfw
I2cwbyte &B11111010
I2cstop
'Wert am DatenPCF auslesen
I2cstart
I2cwbyte Datenpcfr
I2crbyte Value , Nack 'read byte
I2cstop
' es wird immer der zuletzt geschriebene Wert (die 20) ausgelesen/angezeigt
Print Chr(27) ; Chr(79) ; Chr(1) ; Chr(2);
Print "Wert " ; Value ;
Waitms 500
Enable Interrupts
End Sub
Das Problem nun: es wird scheinbar immer nur auf eine Adressen geschrieben. Inder ersten Schleife werden an Adresse 1 bis 10 die Werte 2 bis 20 geschrieben. Beim Auslesen in der zweiten Schleife von 1 bis 10 wird aber immer nur der Wert 20 (der zuletzt geschriebene) zurückgegeben. Kann das Adressieren "fehlschlagen" (ERR ist immer 0, wird im Test nach jeder Aktion abgefragt und ausgegebn, ist wegen der Übersichtlichkeit hier weg gelassen), weil die entsprechende Hardware nur mit 4,5 V versorgt wird?
Lesezeichen