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:
und Slave1: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
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







Zitieren
Lesezeichen