Also, das Konzept ist so:
Alle Teilnehmer definieren ihre Adresse und sind immer empfangsbereit.
Code:
Twi_slv_addr = Mn1_adr ' Der eine Controller
' Twi_slv_addr = Mn2_adr ' der andere Controlle
Twi_sr_data = Varptr(twi_slv_buff(1)) 'datenbuffer empfang
Twi_st_data = Varptr(twi_slv_buff(1)) 'datenbuffer senden
' wenn du eh' keine Broadcasts (GCA) verwendest, würde ich den "+1"-er auslassen, du brauchst dann auch nicht auf GCA abzufragen
Twar = Twi_slv_addr 'I2C Adress
'--------------etc, etc-
Do
'--------------etc, etc-
' das mit den Sensoren lass' ich da aus
'---------------------------------
If Twi_slv_flag = &H60 Then
'-----------------------------------------------------------------
' Ergebnis als Slave auswerten
'-----------------------------------------------------------------
Locate 1 , 1
Lcd ; "SLVrecv" ; 'es ist was empfangen worden
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
Next
Twi_slv_flag = 0 'löschen marker
Twi_slv_stat = 0 'löschen marker
Gosub Twi_sense 'alles wieder enablen
'und Bus freigeben
if twi_slv_buff(1) = 25 then ' ?
' ---------------------- Kommando ausführen ----------------------------
gosub antwort_daten_senden
End If
End If
'-----------------------------------------------------------------
' Unabhängig davon Jede Sekunde was senden & empfangen
'-----------------------------------------------------------------
If Timeout = 1 Then
Timeout = 0 'ja
Gosub frage_daten_senden 'Senden in einer SUB
End If
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"
'----------------------------------------
antwort_daten_senden:
For Temp = 1 To 8 ' 8 Byte
twi_mst_buff(temp) = temp ' 1,2,3,4,5,6,7,8
next
Twi_mst_addr = Mn2_adr 'jeweils der andere
Twi_mt_cntr = 8 '8 Byte
Twi_mr_cntr = 0 ' nix holen, nur senden
Twi_mt_data = Varptr(twi_mst_buff(1)) ' adresse Daten
Gosub Run_wait_master ' auf gehts
return
frage_daten_senden:
twi_mst_buff(1) = 25 'Kommando
Twi_mst_addr = Mn2_adr 'jeweils der andere
Twi_mt_cntr = 1 '1 Byte
Twi_mr_cntr = 0 ' nix holen, nur senden
Twi_mt_data = Varptr(twi_mst_buff(1)) ' adresse Daten
Gosub Run_wait_master ' auf gehts
return
' ----------------------------- sende kontrolle ------------------------
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
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
DIe Sache mit der Sende-WIederholung im Fehlerfall kannst du dir auch sparen, da ja nach einer Sekunde sowieso wieder ein Kommando kommt.
Auch die ganzen "slave transmitter" und "master receiver" Sachen brauchst du ja eigentlich nicht.
Theoretisch (ich konnte es jetzt nicht testen) schickt jeder der beiden
jede Sekunde eine Message mit "25", worauf der dann 8 bYte mit 1,2,..8 zurückschickt.
Lesezeichen