Nach Rücksprache mit dem Hersteller nun der geänderte Code um auf das RAM-Device zuzugreifen
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?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







Zitieren

Lesezeichen