Moin Moin!
folgendes habe ich vor über TWI zu realisieren:
1. Master schickt einem Slave z.Bsp. ein Byte (ne 25)
Master geht wieder offline und hört als Slave den Bus ab
Slave empfängt und führt eine Aktion aus
2. ist ein Befehl für den Slave (25) eingetroffen soll er zum Master werden
und dem vorherigen Master, der jetzt Slave ist, ein Byte zurück schicken
Nun habe ich mir mal den Multimaster TWI Code aus RN Wissen angeschaut
und herumprobiert. Ich bin soweit gekommen, dass ich mit beiden Controllern jeweils als Master senden und als Slave empfangen kann.
Jetzt ist nur noch das Problem das ich keine automatische Kommunikation hin bekomme. Also ich drücke zu 1. einen Taster => Slave (Controller2) zeigt mir an das er was empfangen hat.
Aber ich kann jetzt mit dem Befehl leider nicht automatisch antworten.
In dem Progbeispiel unten sendet der zweite Controller aller 1seck den Wert den er eigentlich erst nach dem Befehl vom anderen Controller bekommen sollte.
Dann versteh ich auch folgen Code noch nicht so richtig:
For Temp = 1 To 1
Twi_mst_buff(temp) = 25
Next
in Verbindung mit:
Twi_mt_data = Varptr(twi_mst_buff(1))
Ich weiss nicht wie ich die empfangenen Daten aus "Twi_sr_cntr" weiter verwenden kann, in eine Variable bekomme.Code:$regfile = "m8def.dat" $crystal = 14318181 $include "MyTWI.bas" $baud = 9600 $hwstack = 80 $swstack = 80 $framesize = 80 Const Tmr_c_prescale = 64 Const Tmr_c_preload = 131 Const Tmr_c_divis = 1000 '250 alt Declare Sub Twi_show_state(byref State As Byte) '-----------------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 Porta = Output Config Lcdbus = 4 Initlcd Cursor Off Locate 1 , 1 Lcd "1 mS Ticker" 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() '------------------------------------------------- ' lokale I2C Adresse (als Slave) '------------------------------------------------- Const Mn1_adr = &H6E '------------------------------------------------- ' fremde I2C Adresse (als Master) '------------------------------------------------- Const Mn2_adr = &H6A Dim Slv_byte As Byte 'sende Byte (irgendwas) Dim Twi_mst_buff(24) As Byte 'Buffer für Masterfunktionen Dim Twi_slv_buff(24) As Byte 'Buffer für Slavefunktionen '------------------------------------------------- Config Timer0 = Timer , Prescale = Tmr_c_prescale 'Timer 1mS On Timer0 Interrupt_ticker ' Timer for Timer Queue Dim Timeout As Byte Dim Timediv As Word '------------------------------------------------- Dim Temp As Byte , Temp3 As Byte , Temp4 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 Timer0 'Timer Enable Interrupts 'Generell '--------------------------------------------- ' '--------------------------------------------- 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 '******************************************************************************* I2C Betrieb 'Locate 1 , 1 ' Lcd "1 mS Ticker " ; Timediv 'Locate 4 , 10 'Lcd Twi_sr_data If Twi_slv_flag = &H60 Then Temp4 = 25 If Twi_slv_flag <> 0 Then '----------------------------------------------------------------- ' Ergebnis als SLave auswerten ' Vorsicht, der Bus ist solange blockiert '----------------------------------------------------------------- Select Case Twi_slv_flag Case &H60 : Locate 1 , 1 Lcd ; "SLVrecv" ; 'es ist was empfangen worden Spc(30) Locate 1 , 9 Lcd Hex(twi_slv_addr) ; " "; For Temp = 1 To Twi_sr_cntr Locate 1 , 11 Lcd Hex(twi_slv_buff(temp)); 'print der Daten 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 Case &H70 : Locate 3 , 1 Lcd ; "SLAVE GCA :" ; 'ein General Call ist gekommen Spc(30) Locate 3 , 10 Lcd Hex(twi_slv_addr) ; " "; For Temp3 = 1 To Twi_sr_cntr Print Hex(twi_slv_buff(temp)); 'print der Daten Next 'Case Else: 'Print Chr(7) ; 'Irgendein Fehler ' Call Twi_show_state(twi_slv_flag) 'Print status-text End Select 'Locate 4 , 1 'Lcd Twi_slv_buff(temp) ; Twi_sr_cntr ; Temp3 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 For Temp4 = 1 To Twi_sr_cntr Locate 4 , 15 Lcd Twi_slv_buff(temp4) '----------------------------------------------------------------- ' Jede Sekunde was senden & empfangen '----------------------------------------------------------------- If Timeout = 1 Then Gosub Master_transmit 'Senden in einer SUB If Twi_mst_flag = 0 Then 'Hats geklappt ? Timeout = 0 'ja ' else (sonst probieren wir's gleich nochmal) End If End If '----------------------------------------------------------------- Locate 4 , 1 Lcd Temp3 'Twi_slv_buff(temp) ; Twi_sr_cntr ; Next Loop End '---------------------------------------- ' 1 mS Ticker '---------------------------------------- Interrupt_ticker: ' Timer for Timer Queue Timer0 = Tmr_c_preload Incr Timediv If Timediv = Tmr_c_divis Then Timeout = 1 'eine Sekunde ist rum Timediv = 0 End If Return ' '---------------------------------------- $include "Twi_show_state.bas" '---------------------------------------- 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 '---------------------------------------- ' Beispiel 8 byte senden, ' dann mit Rep.Start von gleicher adresse 3 Byte empfangen '---------------------------------------- Master_transmit: ' sende buffer (mit testdaten) füllen For Temp = 1 To 1 Twi_mst_buff(temp) = Temp1 'Slv_byte 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
HILFE
Danke MAT







Zitieren

Lesezeichen