Also, das Konzept ist so:
Alle Teilnehmer definieren ihre Adresse und sind immer empfangsbereit.
DIe Sache mit der Sende-WIederholung im Fehlerfall kannst du dir auch sparen, da ja nach einer Sekunde sowieso wieder ein Kommando kommt.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
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.







Zitieren

Lesezeichen