hi,

ich versuche es dir zu erklären:

Code:
Declare Sub Master_transmit(byref Slave_adress As Byte , Byref Send_byte As Byte , Byref Speicherpointer As Byte)       'Declarierung der Sub =>mit byref wird immer nur ein Zeiger auf die Speicherstelle
Declare Sub Twi_show_state(byref State As Byte)                                 ' Fehleranzeige für TWI übertragung                                                                                          ' verwiesen und nicht ein Wert übergeben
Const Mn1_adr = &H6A                                                            'lokale I2C Adresse   (als Slave), alle geraden Zahlen von &H02 - &HFE
                                                                                 'Const Mn2_adr = &H6A  'fremde I2C Adresse (als Master) wir in der Sub mit übergeben

Dim Twi_mst_buff(24) As Byte                                                    'Buffer für Masterfunktionen
Dim Twi_slv_buff(24) As Byte                                                    'Buffer für Slavefunktionen
Dim Tempo As Byte , Twi_daten As Byte
      Twi_slv_addr = Mn1_adr                                                    'lokale I2C-Adresse
      Twi_sr_data = Varptr(twi_slv_buff(1))                                     'datenbuffer empfang
      Twi_st_data = Varptr(twi_slv_buff(1))                                     'datenbuffer senden

      Twar = Twi_slv_addr + 1                                                   'I2C Adress Mega32 + GCA
      Config Twi = 100000                                                       'I2C Speed
      On Twi Twi_mst_slv_isr , Nosave                                           'ISR f. TWI aktivieren

      Gosub Twi_sense                                                           'Aktivieren Slave-Funktion
      'Enable Timer2                                                             'Timer
                                                                                 'Generell Enable Interrupts
hier werden die "globalen" Funktionen festgelegt. Das ein TWI Teilnehmer eine Master/Slavefunktion erfüllen kann, muss er einmal eine Adresse als Master haben und eine als Slave.

Dim Twi_mst_buff(24) As Byte => ist ein Array wo dann die Daten reingeschrieben werden.

Twi_st_data = Varptr(twi_slv_buff(1)) & Twi_sr_data = Varptr(twi_slv_buff(1)) => Daten für Slave sende und empfangsdaten, hier wird nur die Adresse mit varptr übergeben.

On Twi Twi_mst_slv_isr , Nosave das ist eine Interruptroutine die benötigt wird für das senden und empfangen als slave oder master. nicht weiter zu beachten.

Hier ist der Abschnitt für das Senden als Master:
Code:
If Twi_slv_flag <> 0 Then                                                       'ständige Abfrage ob als Slave Daten anliegen  =>Vorsicht, der Bus ist solange blockiert

         Select Case Twi_slv_flag
         Case &H60 :
                     Print ; "Slave empfängt" ;                                 'es ist was empfangen worden
                     Print Hex(twi_slv_addr) ; " ";                             'von Adresse in Hex
                     For Tempo = 1 To Twi_sr_cntr                               'Daten aus Twi_sr_cntr in den puffer schreiben
                     Print Hex(twi_slv_buff(temp));                             'print der Daten
                     Twi_daten = Twi_slv_buff(temp)
                       Next
Nach dem etwas über TWI reinkommt (Twi_slv_flag = &H60 bedeutet das was empfangen wird ) und für die Adresse bestimmt ist, werden die Daten in den Twi_slv_buff(24) geschrieben. Dann stehen die Daten die empfangen werden hintereinander in dem Array und können ausgelesen werden.
=> diese Funktion ist wichtig wenn der Kontroller als Slave angesprochen wird!




Code:
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TWI
Run_wait_master:
        Gosub Mst_start                                                         'aufruf
      Select Case Twi_mst_flag                                                  'ergebnis ?
      Case Twi_m_sent:                                                          'gesendet
               Print "<<<<<<MASTER sendet:"
               Print Hex(twi_mst_addr ) ; " " ; Spc(30);
               For Temp = 1 To Twi_mt_cntr
               Print "twi_mst_buff(temp):" ; Hex(twi_mst_buff(temp)) ; Spc(30);
               Next
               Print
               'Reset Twi_error
               Twi_mst_flag = 0
      Case Twi_m_recv:                                                          'geholt
               Print ">>>>>>MASTER read:" ;
               Print Twi_mst_addr ; " ";
               For Temp = 1 To Twi_mr_cntr
               Print Twi_mst_buff(temp);                                        'Hex(twi_mst_buff(temp));
               Next
               Print
               'Reset Twi_error
               Twi_mst_flag = 0
      Case Else:                                                                'irgendein Problem
                'Set Twi_error
                'Print "Twi_error" ; Twi_error
                Print "fehler" ; Chr(7) ; Hex(twi_mst_addr) ; " ";
                Call Twi_show_state(twi_mst_flag)
      End Select
   Return

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TWI Sendesub
Sub Master_transmit(byref Slave_adress As Byte , Byref Send_byte As Byte , Byref Speicherpointer As Byte)       'Sub in der die Adresse des Empfängers steht und der Zeiger aus der Callprozedur

   Twi_mst_addr = Slave_adress                                                  'I2C adresse
   Twi_mt_cntr = Send_byte                                                      '8                                          ' erstmal 8 Byte senden
   Twi_mt_data = Varptr(speicherpointer(1))                                     ' adresse Daten
   Twi_mr_cntr = 0

   'Twi_mr_cntr = 1                                          ' dann 3 Byte empfangen
   'Twi_mr_data = Varptr(twi_mst_buff(1))                    ' empfangsbuffer

   Gosub Run_wait_master                                                        ' auf gehts
   End Sub
   Return
Hier ist der Abschnitt für das Senden als Master:
Sub Master_transmit(byref Slave_adress As Byte , Byref Send_byte As Byte , Byref Speicherpointer As Byte)

In der Sub werden folgende Daten festgelegt:
*Twi_mst_addr = &H61 => ist die TWI-Adresse des Slavs an die Daten gehen sollen
*Twi_mt_cntr = => wieviel Byte sollen gesendet werden
*Twi_mt_data = Varptr(speicherpointer(1)) => die zu übertragenden Daten, aber nur die Adresse der Daten wo sie im Ram liegen, nicht die Daten an sich.
*Gosub Run_wait_master und jetzt wird mit den Infos in die Senderoutine gesprungen => siehe im Code.

Du kannst nicht direkt die Informationen zwischen zwei Platinen über eine dritte auslesen. Du musst diese an den Bus hängen und diese abhorchen:
1. den Startpunkt einer Sendung von Daten detektieren
2. die Adresse in dem Sendeframe herausfiltern und
3. die Daten auswerten

Dabei musst du alle Start/Stop/daten... zeitrichtig auswerten, nicht so einfach!
Als Erklärung auch noch hier einiges:
https://www.roboternetz.de/phpBB2/vi...=409315#409315
https://www.roboternetz.de/phpBB2/ze...096&highlight=

Wenn Du dann die Übertragung verstanden hast, solltest Du dir ein protokoll oder Ähnliches ausdenken, um die Daten ordentlich zu senden/empfangen und diese dann weiter zu verarbeiten. Schau mal nach SNAP-Protokoll.

Gruß MAT