Hier der Code.



Ziel ist es:
1)
ein mc frägt sequenziell 12 geräte ab, sollte das 2.byte das er als antwort bekommt <>006 sein, soll er das datum,die zeit,dessen adresse und den status tabellarisch im 24c256 ablegen.
2)
ein zweiter mc liest nur die daten aus dem eeprom und gibt sie seriell an einen pc weiter.

Problem:
es scheint als würde es bei &H60 einen Adressenkonflikt gibt.
lasse ich die adresse weg kommt im terminal nur 1:0 nicht ein mal der text Print "PCF8583 ..." zeigt er mir an.



Komisch mit der clock.bas funzt es einwandfrei
Code:
'Mikrocontroller Setup
$lib "mcsbyteint.lbx"
$regfile = "m16def.dat"

$crystal = 19999998
$baud = 19200

'Display Setup
Config Lcdpin = Pin , Db4 = Porta.6 , Db5 = Porta.5 , Db6 = Porta.4 , Db7 = Porta.3 , E = Porta.7 , Rs = Porta.2       ' Natürlich so wie es wirklich angeschlossen ist (4-Bit-Modus)
Config Lcd = 20 * 4


Config Pind.2 = Input
Config Pind.4 = Input


'Variablen

'Checksum Variablen
Dim Crc_l As Integer
Dim Crc_h As Integer
Dim New As Byte
Dim Tmp As Byte
Dim Bcclo As Byte
Dim Bcchi As Byte
Dim X As String * 10
Dim Crce As Word
Dim Crcs As Word

'Sende & Empfangs Variablen
Dim Packets(10) As Byte
Dim Packete(8) As Byte

'WR Variablen
Dim Wradr As Byte

'Display & Line Variablen
Dim Line1 As String * 20
Dim Line2 As String * 20
Dim Line3 As String * 20
Dim Line4 As String * 20

'Sendepaket Variablen
Dim Adr As Byte
Dim Command As Byte
Dim Par1 As Byte
Dim Par2 As Byte
Dim Par3 As Byte
Dim Par4 As Byte
Dim Par5 As Byte
Dim Par6 As Byte

'Empfangspaket Variablen
Dim State As Byte

'Speicher Constanten
Const Ff = &H0C                                             'Steuerzeichen Formfeed
Const Lf = &H0A                                             'Steuerzeichen Linefeed
Const Pu = &H2E                                             'Punkt
Const Dp = &H3A                                             'Doppelpunkt
Const Le = &H20                                             'Leerzeichen
Const Ko = &H2C                                             'Komma
Const Adre = &HA2                                           'Adresse EEPROM
Dim Adrcount As Word                                        'Zähler Speicherplatz EEPROM



'Paket Variablen
Declare Sub Paketinit

'Subroutines
Declare Sub Sendewr
Declare Sub Empfangewr
Declare Sub Crc
Declare Sub Lcdout
Declare Sub Status
Declare Sub Abfrageroutine

'WR Statusabfragen
Declare Sub Adr2
Declare Sub Adr3
Declare Sub Adr4
Declare Sub Adr5
Declare Sub Adr6
Declare Sub Adr7
Declare Sub Adr8
Declare Sub Adr9
Declare Sub Adr10
Declare Sub Adr11
Declare Sub Adr12
Declare Sub Adr13

'Speicher
Declare Sub Speichern
Declare Sub Auslesen

'Clock
Declare Sub Settime(byval S1 As Byte , Byval M1 As Byte , Byval H1 As Byte , Byval D1 As Byte , Byval Month1 As Byte)
Declare Sub Gettime()

'Declare variables
Dim Tm1(5) As Byte At &H60
Dim I As Byte , Temp As Byte

'These are pointers to tm() for simple handling.
Dim S As Byte At &H60 Overlay
Dim M As Byte At &H61 Overlay
Dim H As Byte At &H62 Overlay
Dim D As Byte At &H63 Overlay
Dim Month As Byte At &H64 Overlay


'configure the used port pin for I2C
Config I2cdelay = 5                                         ' default slow mode
Config Sda = Portc.1
Config Scl = Portc.0
'power LED
Portd.5 = 1

'Setup Comports
'Serial 1  Configuration
Config Serialin = Buffered , Size = 8
Config Serialout = Buffered , Size = 10
Config Pinb.7 = Output




'LCD init
Initlcd
   Line1 = "control rel.1.0"
   Line2 = "      boot"
   Line3 = " "
   Line4 = ""
   Gosub Lcdout


   Locate 2 , 1

'Hauptprogramm
 Call Settime(56 , 1 , 1 , 29 , 11)                         'set time

Print Chr(27) ; "[2J";                                      'clear screen
Print "PCF8583 Clock Sample"

Do

  Call Gettime
  Print Chr(27) ; "[2;2f";
  Print Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s) ; " Err:" ; Err
   Wait 1
If Pind.2 = 1 Then
End If

  If Pind.4 = 1 Then
   Gosub Abfrageroutine


  End If

Loop



 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

'SUBs

'Anfrage an WR stellen
Sub Sendewr
   Gosub Crc
   Line2 = " Status  "
   Line3 = " sende Anfrage"
   Gosub Lcdout
   Printbin Packets(1) ; 10



Return
End Sub Sendewr

 ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

'Status vom WR empfangen
Sub Empfangewr
   Inputbin Packete(1) , 8
   State = Packete(2)
   Gosub Status

Return
End Sub Empfangewr

 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 'Werte tabellarisch im EEPROM speichern
Sub Speichern
Gosub Gettime

 I2cstart
 I2cwbyte 10100000
 I2cwbyte &HA3                                              'Speicherstelle im EEPROM
 I2cwbyte &HA2
 I2cwbyte D                                                 'Tag
 I2cwbyte Pu
 I2cwbyte Month                                             'Monat
 I2cwbyte Le
 I2cwbyte H                                                 'Stunde
 I2cwbyte Dp
 I2cwbyte M                                                 'Minute
 I2cwbyte Dp
 I2cwbyte Adr                                               'Wechselrichteradresse
 I2cwbyte Ko
 I2cwbyte State                                             'Wechselrichter Status (2.Paketbyte)
 I2cwbyte Ff                                                'Cursor zurück auf Anfang
 I2cwbyte Lf                                                'und Zeilenvorschub
 I2cstop

 If Adrcount < &H7FEB Then Adrcount = Adrcount + 13 Else Adrcount = 0

End Sub Speichern






 'Checksumme berechnen
Sub Crc
Bcclo = &HFF
Bcchi = &HFF

 New = Packets(1)
 New = New Xor Bcclo
 Tmp = New
 Shift Tmp , Left , 4
 New = Tmp Xor New
 Tmp = New
 Shift Tmp , Right , 5
 Bcclo = Bcchi
 Bcchi = New Xor Tmp
 Tmp = New
 Shift Tmp , Left , 3
 Bcclo = Bcclo Xor Tmp
 Shift Tmp , Right , 4
 Bcclo = Bcclo Xor Tmp



  New = Packets(2)
 New = New Xor Bcclo
 Tmp = New
 Shift Tmp , Left , 4
 New = Tmp Xor New
 Tmp = New
 Shift Tmp , Right , 5
 Bcclo = Bcchi
 Bcchi = New Xor Tmp
 Tmp = New
 Shift Tmp , Left , 3
 Bcclo = Bcclo Xor Tmp
 Shift Tmp , Right , 4
 Bcclo = Bcclo Xor Tmp


  New = Packets(3)
 New = New Xor Bcclo
 Tmp = New
 Shift Tmp , Left , 4
 New = Tmp Xor New
 Tmp = New
 Shift Tmp , Right , 5
 Bcclo = Bcchi
 Bcchi = New Xor Tmp
 Tmp = New
 Shift Tmp , Left , 3
 Bcclo = Bcclo Xor Tmp
 Shift Tmp , Right , 4
 Bcclo = Bcclo Xor Tmp


  New = Packets(4)
 New = New Xor Bcclo
 Tmp = New
 Shift Tmp , Left , 4
 New = Tmp Xor New
 Tmp = New
 Shift Tmp , Right , 5
 Bcclo = Bcchi
 Bcchi = New Xor Tmp
 Tmp = New
 Shift Tmp , Left , 3
 Bcclo = Bcclo Xor Tmp
 Shift Tmp , Right , 4
 Bcclo = Bcclo Xor Tmp


  New = Packets(5)
 New = New Xor Bcclo
 Tmp = New
 Shift Tmp , Left , 4
 New = Tmp Xor New
 Tmp = New
 Shift Tmp , Right , 5
 Bcclo = Bcchi
 Bcchi = New Xor Tmp
 Tmp = New
 Shift Tmp , Left , 3
 Bcclo = Bcclo Xor Tmp
 Shift Tmp , Right , 4
 Bcclo = Bcclo Xor Tmp


  New = Packets(6)
 New = New Xor Bcclo
 Tmp = New
 Shift Tmp , Left , 4
 New = Tmp Xor New
 Tmp = New
 Shift Tmp , Right , 5
 Bcclo = Bcchi
 Bcchi = New Xor Tmp
 Tmp = New
 Shift Tmp , Left , 3
 Bcclo = Bcclo Xor Tmp
 Shift Tmp , Right , 4
 Bcclo = Bcclo Xor Tmp


  New = Packets(7)
 New = New Xor Bcclo
 Tmp = New
 Shift Tmp , Left , 4
 New = Tmp Xor New
 Tmp = New
 Shift Tmp , Right , 5
 Bcclo = Bcchi
 Bcchi = New Xor Tmp
 Tmp = New
 Shift Tmp , Left , 3
 Bcclo = Bcclo Xor Tmp
 Shift Tmp , Right , 4
 Bcclo = Bcclo Xor Tmp


  New = Packets(8)
 New = New Xor Bcclo
 Tmp = New
 Shift Tmp , Left , 4
 New = Tmp Xor New
 Tmp = New
 Shift Tmp , Right , 5
 Bcclo = Bcchi
 Bcchi = New Xor Tmp
 Tmp = New
 Shift Tmp , Left , 3
 Bcclo = Bcclo Xor Tmp
 Shift Tmp , Right , 4
 Bcclo = Bcclo Xor Tmp


Crc_l = Bcclo Xor &HFF
Crc_h = Bcchi Xor &HFF



   Return
End Sub Clc

 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 'LCD Ausgabe
Sub Lcdout
   Cls
   Locate 1 , 1                                             '1. Zeile
   Lcd Line1
   Locate 2 , 1                                             '2. Zeile
   Lcd Line2
   Locate 3 , 1                                             '3. Zeile
   Lcd Line3
   Locate 4 , 1                                             '4. Zeile
   Lcd Line4

   Return
End Sub Lcdout

 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 'Status Auswertung
Sub Status
    If State = 006 Then
         Line3 = Str(adr) + " ok"

       Else
         Line3 = Str(adr) + " Fehler"
          Gosub Speichern
      End If

Gosub Lcdout
Return
End Sub Status

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

'Abfrageroutine sequenziell

Sub Abfrageroutine

Command = 050

   Gosub Adr2
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr3
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr4
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr5
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr6
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr7
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr8
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr9
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr10
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr11
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr12
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Gosub Adr13
   Gosub Sendewr
   Gosub Empfangewr
   Wait 2
   Return
End Sub Abfrageroutine


'Paketinitialisierung
Sub Paketinit
'Init Packets
Packets(1) = Adr                                            'Adr
Packets(2) = Command                                        'command
Packets(3) = Par1                                           'Par1
Packets(4) = Par2                                           'Par2
Packets(5) = Par3                                           'Par3
Packets(6) = Par4                                           'Par4
Packets(7) = Par5                                           'Par5
Packets(8) = Par6                                           'Par6
Packets(9) = Crc_l
Packets(10) = Crc_h
Return
End Sub Paketinit


'WR Subs Status
Sub Adr2

Adr = 002
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 037
Crc_h = 135
Gosub Paketinit
Return
End Sub Adr2

Sub Adr3
Adr = 003
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 154
Crc_h = 006
Gosub Paketinit
Return
End Sub Adr3

Sub Adr4
Adr = 004
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 148
Crc_h = 154
Gosub Paketinit
Return
End Sub Adr4

Sub Adr5
Adr = 005
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 043
Crc_h = 027
Gosub Paketinit
Return
End Sub Adr5

Sub Adr6
Adr = 006
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 251
Crc_h = 145
Gosub Paketinit
Return
End Sub Adr6

Sub Adr7
Adr = 007
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 068
Crc_h = 016
Gosub Paketinit
Return
End Sub Adr7

Sub Adr8
Adr = 008
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 246
Crc_h = 161
Gosub Paketinit
Return
End Sub Adr8

Sub Adr9
Adr = 009
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 073
Crc_h = 032
Gosub Paketinit
Return
End Sub Adr9

Sub Adr10
Adr = 010
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 153
Crc_h = 170
Gosub Paketinit
Return
End Sub Adr10

Sub Adr11
Adr = 011
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 038
Crc_h = 043
Gosub Paketinit
Return
End Sub Adr11

Sub Adr12
Adr = 012
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 040
Crc_h = 183
Gosub Paketinit
Return
End Sub Adr12

Sub Adr13
Adr = 013
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 151
Crc_h = 054
Gosub Paketinit
Return
End Sub Adr13

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Sub Gettime()

   'there are 2 ways to get the time. With low level I2C calls or with a high level call
   'first the high level call
    Tm1(1) = 2                                              ' point to second register

    I2creceive &HA0 , Tm1(1) , 1 , 5                        ' write the second address and get 5 bytes back
    'i2creceive will first write 1 byte from tm(1) which is 2, and then will read 5 bytes and store it onto tm(1)-tm(5)


    'and optional with low level calls
    'For I = 1 To 5
     '  Temp = I + 1
     '  I2cstart
     '  I2cwbyte &HA0                                        'write addres of PCF8583
     '  I2cwbyte Temp                                        'select register
     '  I2cstart                                             'repeated start
     '  I2cwbyte &HA1                                        'write address for reading info
     '  I2crbyte Tm(i) , Nack                                'read data
  '  Next
 '  I2cstop
End Sub


Sub Settime(s1 As Byte , M1 As Byte , H1 As Byte , D1 As Byte , Month1 As Byte)
    'values are stored as BCD values so convert the values first

                                     'seconds
    Tm1(2) = Makebcd(m1)                                    'minutes
    Tm1(3) = Makebcd(h1)                                    'hours
    Tm1(4) = Makebcd(d1)                                    'days
    Tm1(5) = Makebcd(month1)                                'months


    I2cstart                                                'generate start
    I2cwbyte &HA0                                           'write address
    I2cwbyte &H00                                           'select control register
    I2cwbyte &H08                                           'set year and day bit for masking
    I2cstart                                                'repeated start
    I2cwbyte &HA0                                           'write mode
    I2cwbyte 2                                              'select seconds Register
    For I = 1 To 5
      I2cwbyte Tm1(i)
    Next                                                    'write seconds
    I2cstop
End Sub

End

                                                    'end program