-
        

Ergebnis 1 bis 3 von 3

Thema: Atmega2560 cc2net Ram-Device lesen und schreiben

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2007
    Beiträge
    7

    Atmega2560 cc2net Ram-Device lesen und schreiben

    Anzeige

    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.
    Code:
    $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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2007
    Beiträge
    7
    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?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2007
    Beiträge
    7
    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.
    Code:
      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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •