Hallo Robert,

nun sitze ich schon wieder den halben Tag... Inzwischen kann ich beide Slaves ansprechen und sie senden auch. Besser einer schickt seine Info an den Slave, der zweite schickt auch seine Info (lt. RS232 Ausgabe sagt er mir: Master sent: 6C 1F) aber leider kommt immer nur eine 0!?
Ich habe den identischen Code für die 2 Slaves, woran kann das liegen?

Slave Nr.2 bei dem es nicht funst:
Code:
$regfile = "m8def.dat"
$crystal = 16000000

$include "MyTWI.bas"                                        'dafür wird noch die MyTWI.lib benötigt

$baud = 19200

$hwstack = 80
$swstack = 80
$framesize = 80




'------------------------------------------------------------------------------- Configuration DS1820
Config 1wire = Portd.4

Dim Ar1(2) As Byte

Dim Temp1 As Byte





'------------------------------------------------------------------------------- Timer0 aktivieren



'------------------------------------------------------------------------------- lokale I2C Adresse   (als Slave)
Const Mn1_adr = &H6C
'------------------------------------------------------------------------------- fremde I2C Adresse   (als Master)
Const Mn2_adr = &H6A

Dim Twi_mst_buff(24) As Byte                                'Buffer für Masterfunktionen
Dim Twi_slv_buff(24) As Byte                                'Buffer für Slavefunktionen


'------------------------------------------------------------------------------- TWI Variablen


Dim Temp As Byte , Temp3 As Byte
Dim Temp2 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

      Gosub Twi_sense                                       'Aktivieren Slave-Funktion
       Enable Timer2                                         'Timer
      Enable Interrupts                                     'Generell

'******************************************************************************* Hauptprogramm
   Do


'******************************************************************************* Sensor 1

1wreset                                                     'reset
1wwrite &HCC                                                ' read internal RAM
1wwrite &HBE                                                ' read 9 data bytest                            '300                                                  'warten bis convert T fertig ist
Ar1(1) = 1wread(2)
1wreset



  Temp1 = Makeint(ar1(1) , Ar1(2))
      Temp1 = Temp1 / 2                                     'Ar(1)

  Temp2 = Temp1


'******************************************************************************* TWI Betrieb
'praktisches Beispiel zu Anzeige der Daten, werden im Prog nicht benötigt bis auf die Flagabfrage
'Twi_slv_flag =
 '   * 0 Keine Slave Aktion hat stattgefunden
 '   * &H60 Daten wurden empfangen. Sie stehen im Buffer mit der Länge Twi_sr_cntr
 '   * &HA8 Daten wurden gesendet. Sie stehen im Buffer mit der Länge Twi_st_cntr
 '   * &H70 Gca -daten Wurden Empfangen.
 If Twi_slv_flag <> 0 Then
 Select Case Twi_slv_flag
         Case &H60 : Print Spc(30) ; "als SLAVE receivd:" ; 'es ist was empfangen worden
                  Print Hex(twi_slv_addr) ; " ";
                  For Temp = 1 To Twi_sr_cntr
                     Print Twi_slv_buff(temp)
                     Temp3 = Twi_slv_buff(temp)             ' Hex(twi_slv_buff(temp));         'print der Daten
                      Print "temp1" ; Temp1
                  Next
         Case &HA8 : Print Spc(30) ; "als SLAVE transmit:" ;       'es ist was abgeholt worden
                  Print Hex(twi_slv_addr) ; " ";
                  For Temp = 1 To Twi_st_cntr
                     Print Twi_slv_buff(temp)               'Hex(twi_slv_buff(temp));         'print der Daten
                  Next
         Case &H70 : Print Spc(30) ; "SLAVE GCA :" ;        'ein General Call ist gekommen
                  Print Hex(twi_slv_addr) ; " ";
                  For Temp = 1 To Twi_sr_cntr
                     Print Hex(twi_slv_buff(temp));         'print der Daten
                  Next
         Case Else:
                  Print Chr(7) ;                            'Irgendein Fehler

         End Select
         Print
         Twi_slv_flag = 0                                   'löschen marker
         Twi_slv_stat = 0                                   'löschen marker
         Gosub Twi_sense                                    'alles wieder enablen
                                   'und Bus freigeben
      End If



                    ' Print "DatenM" ; Twi_slv_buff(temp)
                     'Print Spc(30) ; Temp3
'******************************************************************************* nach Datenempfang als Slave umschalten auf Master und Daten senden


  If Temp3 = 26 Then
  Print "empfange komando"                                  'ist Masteranforderung 25 dann schicke Temperatur1
        Gosub Master_transmit                               'Senden in einer SUB
             Temp3 = 0
             Twi_sr_cntr = 0                                'ja
'
      End If

   1wwrite &HCC : 1wwrite &H44                              ' start measure
   Loop
End


'############################################################################### 1 mS Ticker =>Timerroutine wird in der .Lib benötigt


'###############################################################################


Run_wait_master:
Print "versuche zu senden"
      Gosub Mst_start                                       'aufruf
      Select Case Twi_mst_flag                              'ergebnis ?
      Case Twi_m_sent:                                      'gesendet
               Print "<<<<<<MASTER sent:" ;
               Print Hex(twi_mst_addr) ; " ";
               For Temp = 1 To Twi_mt_cntr
                     Print Hex(twi_mst_buff(temp1));
               Next
               Print
               Twi_mst_flag = 0
      Case Twi_m_recv:                                      'geholt
                Print ">>>>>>MASTER read:" ;
               Print Hex(twi_mst_addr) ; " ";
               For Temp = 1 To Twi_mr_cntr
                     Print Twi_mst_buff(temp1);             'Hex(twi_mst_buff(temp));
               Next
               Print
               Twi_mst_flag = 0
      Case Else:                                            'irgendein Problem
                Print Chr(7) ; Hex(twi_mst_addr) ; " ";

      End Select
   Return

'############################################################################### Sendesub
'   Beispiel 8 byte senden,
'     dann mit Rep.Start von gleicher adresse 3 Byte empfangen
'Nur senden

   'Twi_mst_addr = Mn2_adr                                   'I2C adresse ZIEL
   'Twi_mt_cntr = 8                                          '  8 Byte senden
   'Twi_mt_data = Varptr(twi_mst_buff(1))                    ' Daten
   'Twi_mr_cntr = 0
'Nur abholen

   'Twi_mst_addr = Mn2_adr + 1                               'I2C adresse ZIEL (+R)
   'Twi_mr_cntr = nn                                         ' wieviele Byte
   'Twi_mr_data = Varptr(twi_mst_buff(1))                    ' empfangsbuffer



Master_transmit:
' sende buffer (mit testdaten) füllen
 'For Temp = 1 To 1
   Twi_mst_buff(temp1) = Temp1                              'Temperatur Sensor1
 ' Next

   Twi_mst_addr = Mn2_adr                                   'I2C adresse
   Twi_mt_cntr = 1                                          '8                                          ' erstmal 8 Byte senden
   Twi_mt_data = Varptr(twi_mst_buff(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

   Return
und Slave1:
Code:
$regfile = "m8def.dat"
$crystal = 14318181

$include "MyTWI.bas"                                        'dafür wird noch die MyTWI.lib benötigt

$baud = 9600

$hwstack = 80
$swstack = 80
$framesize = 80




'-----------------2x20 LCD Display an Port c =>Conector -------------------------------------------------------------------------------------------------
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portb.2 , Rs = Portb.0       ' Pinbelegung "LCD-Port)"
'                SV2          1                2               3              4              6              8           ' Pinbelegung SV9 Board


Config Lcd = 20 * 4
Config Lcdbus = 4
Initlcd
Cursor Off
Cls
'------------------------------------------------------------------------------- Configuration DS1820
Config 1wire = Portb.1
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(2) As Byte
Dim Ar2(2) As Byte
Dim Temp1 As Byte
Dim Temp2 As Byte


Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()
'------------------------------------------------------------------------------- Timer0 aktivieren



'------------------------------------------------------------------------------- lokale I2C Adresse   (als Slave)
Const Mn1_adr = &H6E
'------------------------------------------------------------------------------- fremde I2C Adresse   (als Master)
Const Mn2_adr = &H6A

Dim Twi_mst_buff(24) As Byte                                'Buffer für Masterfunktionen
Dim Twi_slv_buff(24) As Byte                                'Buffer für Slavefunktionen


'------------------------------------------------------------------------------- TWI Variablen


Dim Temp As Byte , Temp3 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 = 400000                                   'I2C Speed
      On Twi Twi_mst_slv_isr , Nosave                       'ISR f. TWI

      Gosub Twi_sense                                       'Aktivieren Slave-Funktion
       Enable Timer2                                         'Timer
      Enable Interrupts                                     'Generell

'******************************************************************************* Hauptprogramm
   Do


'******************************************************************************* Sensor 1

1wreset                                                     'reset
1wwrite &H55                                                'Match Rom command
1wwrite Id1(1) , 8                                          'Id von Sensor 1
1wwrite &H44                                                'Convert T
                                                  '300                                                  'warten bis convert T fertig ist
1wreset                                                     'reset
1wwrite &H55                                                'match rom command
1wwrite Id1(1) , 8                                          'id von sensor 1
1wwrite &HBE

Locate 1 , 14
 Ar1(1) = 1wread(2)
  Temp1 = Makeint(ar1(1) , Ar1(2))
      Temp1 = Temp1 / 2                                     'Ar(1)
  Lcd "Out1:" ; Temp1


'******************************************************************************* Sensor2

1wreset                                                     'reset
1wwrite &H55                                                'Match Rom command
1wwrite Id2(1) , 8                                          'Id von Sensor 2
1wwrite &H44                                                'Convert T
                                                  ' 300                                                  'warten bis convert T fertig ist
1wreset                                                     'reset
1wwrite &H55                                                'match rom command
1wwrite Id2(1) , 8                                          'id von sensor 2
1wwrite &HBE                                                'scratchpad lesen


Locate 2 , 14
 Ar2(1) = 1wread(2)
  Temp2 = Makeint(ar2(1) , Ar2(2))
      Temp2 = Temp2 / 2
  Lcd "Out2:" ; Temp2
'******************************************************************************* TWI Betrieb
'praktisches Beispiel zu Anzeige der Daten, werden im Prog nicht benötigt bis auf die Flagabfrage
'Twi_slv_flag =
 '   * 0 Keine Slave Aktion hat stattgefunden
 '   * &H60 Daten wurden empfangen. Sie stehen im Buffer mit der Länge Twi_sr_cntr
 '   * &HA8 Daten wurden gesendet. Sie stehen im Buffer mit der Länge Twi_st_cntr
 '   * &H70 Gca -daten Wurden Empfangen.

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 :
                  Locate 1 , 1
                  Lcd ; "SLVrecv" ;                         'es ist was empfangen worden
                  Locate 1 , 9
                  Lcd Hex(twi_slv_addr) ; " ";              'von Adresse in Hex
                  For Temp = 1 To Twi_sr_cntr               'Daten aus Twi_sr_cntr in den puffer schreiben
                     Locate 1 , 11
                     Lcd Hex(twi_slv_buff(temp));           'print der Daten
                     Temp3 = Twi_slv_buff(temp)
                  Next
         Case &HA8 :
                  Locate 2 , 1
                  Lcd ; "SLVtran" ;                         'es ist was abgeholt worden  Spc(30)
                  Locate 2 , 9
                  Lcd Hex(twi_slv_addr) ; " ";
                  For Temp = 1 To Twi_st_cntr
                  Locate 2 , 11
                     Lcd Twi_slv_buff(temp);                'print der Daten Hex(twi_slv_buff(temp));
                  Next



         End Select
         Locate 4 , 1
         Lcd Twi_mst_flag
         Print
         Twi_slv_flag = 0                                   'löschen marker
         Twi_slv_stat = 0                                   'löschen marker
         Gosub Twi_sense                                    'alles wieder enablen
                                   'und Bus freigeben
      End If


            Locate 4 , 6
                     Lcd "DatenM" ; Twi_slv_buff(temp)

'******************************************************************************* nach Datenempfang als Slave umschalten auf Master und Daten senden
 Locate 4 , 19
 Lcd Temp3
  If Temp3 = 25 Then                                        'ist Masteranforderung 25 dann schicke Temperatur1
        Gosub Master_transmit                               'Senden in einer SUB
             Temp3 = 0
             Twi_sr_cntr = 0                                'ja
'
      End If
   Loop
End


'############################################################################### 1 mS Ticker =>Timerroutine wird in der .Lib benötigt


'###############################################################################


Run_wait_master:
      Gosub Mst_start                                       'aufruf
'( Select Case Twi_mst_flag                              'ergebnis ?
      Case Twi_m_sent:
               Locate 3 , 1                                 'gesendet
               Lcd "<<MASTsent:" ; Hex(twi_mst_addr) ; " ";
               Print
               For Temp = 1 To Twi_mt_cntr
               Locate 3 , 14
                     Lcd Twi_mst_buff(temp);
               Next
               Print
               Twi_mst_flag = 0

     Case Twi_m_recv:
               Locate 4 , 1                                 'geholt
                Lcd ">>MASTread:" ; Hex(twi_mst_addr) ; " ";
               Print
               For Temp = 1 To Twi_mr_cntr
               Locate 4 , 14
                Lcd Twi_mst_buff(temp);                     'Hex(twi_mst_buff(temp))
               Next
               Print
               Twi_mst_flag = 0
      'Case Else:                                            'irgendein Problem
                'Print Chr(7) ; Hex(twi_mst_addr) ; " ";
                'Call Twi_show_state(twi_mst_flag)
      End Select
')
   Return

'############################################################################### Sendesub
'   Beispiel 8 byte senden,
'     dann mit Rep.Start von gleicher adresse 3 Byte empfangen
'Nur senden

   'Twi_mst_addr = Mn2_adr                                   'I2C adresse ZIEL
   'Twi_mt_cntr = 8                                          '  8 Byte senden
   'Twi_mt_data = Varptr(twi_mst_buff(1))                    ' Daten
   'Twi_mr_cntr = 0
'Nur abholen

   'Twi_mst_addr = Mn2_adr + 1                               'I2C adresse ZIEL (+R)
   'Twi_mr_cntr = nn                                         ' wieviele Byte
   'Twi_mr_data = Varptr(twi_mst_buff(1))                    ' empfangsbuffer



Master_transmit:
' sende buffer (mit testdaten) füllen
   For Temp = 1 To 1
   Twi_mst_buff(temp1) = Temp1                              'Temperatur Sensor1
  Next

   Twi_mst_addr = Mn2_adr                                   'I2C adresse
   Twi_mt_cntr = 1                                          '8                                          ' erstmal 8 Byte senden
   Twi_mt_data = Varptr(twi_mst_buff(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

   Return