PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega2560 cc2net Ram-Device lesen und schreiben



A.Schilling
14.06.2007, 14:32
Harware ist Atmega2560, RN-KeyLCD (über RS232), CC2net-Ram Interface (SAA1064) und CC2net-Ram Device mit 4MBit (und Batterie), Software Bascom 1.1.8.5. Ich bin Neueinsteiger bei Amtel (vorher CControll, da hatte ich den Speicher im Griff). Meine Versuche bringen leider kein Ergebnis beim Auslesen des EEProm (selbst wenn nichts geschrieben wird, es liegen 255000 Integerwerte im Speicher von der CControl her). Der Code ist der letzte Stand nach verschiedenen Versuchen. Das Programm läuft ohne Pause durch. Das Auslesen von ERR nach jedem Schritt beim Lesen / Schreiben bringt ein Ergebnis <> 1 (für die bessere Übersicht aus diesem Quelltext entfernt). Problem ist, das beim Auslesen des Speicher mit I2crbyte "Value" immer 0 ist. Nach 2 Tagen Code-basteln also die Frage, was mache ich falsch, bzw. was fehlt noch.


$prog , 255 , &B11011001 ,

$regfile = "m2560def.dat"
$hwstack = 82
$framesize = 68
$swstack = 68

$crystal = 16000000
$baud = 9600

$lib "i2c_twi.lbx"

Config Sda = Portd.1 'SDA und SCL definiere
Config Scl = Portd.0 'für TWI-Bus-Konfiguration
I2cinit
Config Twi = 100000 ' wanted clock frequency

Declare Sub Write_eeprom(byval Adres As Word , Byval Wert As Byte)
Declare Sub Read_eeprom(byval Adres As Word )

Dim Temp As Word
Dim Adres As Word
Dim Value As Byte

Const Addressw = &H70
Const Addressr = &H71

'Sonstiges
Dim X As Word
Dim Wert As Byte

Print Chr(12);

Do

Wert = 0
Print Chr(12);
For X = 76 To 255

Wert = Wert + 1
Print Chr(27) ; Chr(79) ; Chr(1) ; Chr(1);
Print "Adresse " ; X ; " " ; Wert ;

Call Write_eeprom(x , Wert)

Call Read_eeprom(x , Value )

Next X

Loop

End

Sub Write_eeprom(byval Adres As Word , Byval Wert As Byte)

Disable Interrupts
I2cstart 'start condition

I2cwbyte Addressw 'slave address
I2cwbyte Adres 'asdress of EEPROM
I2cwbyte Wert 'value to write
I2cstop 'stop condition

Enable Interrupts
Waitms 10

End Sub


Sub Read_eeprom(byval Adres Word , Value As Byte)
Disable Interrupts

I2cstart 'generate start
I2cwbyte Addressw
I2cwbyte Adres 'address of EEPROM

I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , Nack 'read byte

I2cstop

Enable Interrupts
Waitms 10 'generate stop
Print Chr(27) ; Chr(79) ; Chr(1) ; Chr(2);
Print "Wert " ; Value ; 'das Problem Value immer 0
End Sub

A.Schilling
02.07.2007, 09:55
Nach Rücksprache mit dem Hersteller nun der geänderte Code um auf das RAM-Device zuzugreifen


$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?

A.Schilling
06.07.2007, 11:52
CC2net Ram-Device zum Dritten. Hier die Lösung unseres Problems. Bei der Adressierung des saa1064 fehlten noch das Instruktionsbyte und das Controlbyte. Jetzt können wir alle 524.287 Adressen des RAM ansprechen.


I2cstart
I2cwbyte Saa1064w
Waitms 10
I2cwbyte &B00000000 ' Das Instruktionsbyte
I2cwbyte &B0010000 'Das Control-Byte, für Einstellungen am IC
Adres16 = Not Adres
Templ = Low(adres16)
I2cwbyte Templ
Temp = High(adres16)
I2cwbyte Temp
I2cstop

Datenblätter sind etwas sehr hilfreiches, man muss nur verstehen was darin steht.