Hi
Also erst ma Danke für das Programm.
Aber ich bin so langsam am verzweifeln bin ich zu doof für so was hier?!
Habe das Prog genommen und einmal denn empfangenem Buffer in eine Variable schreiben lassen. Dann nach dieser Variablen gefragt und wenn dies gleich is soll eine LED eingeschaltet werden.
Hier der Code
µC 1
µC 2Code:$crystal = 16000000 $include "MyTWI.bas" $baud = 9600 $hwstack = 64 $swstack = 64 $framesize = 64 Const Tmr_c_prescale = 64 Const Tmr_c_preload = 131 Const Tmr_c_divis = 250 Declare Sub Twi_show_state(byref State As Byte) Config Porta = Input Config Portb = Input Config Portd = Output Waitms 30 '------------------------------------------------- ' lokale I2C Adresse (als Slave) '------------------------------------------------- Const Mn1_adr = &H40 '------------------------------------------------- ' fremde I2C Adresse (als Master) '------------------------------------------------- Const Mn2_adr = &H50 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 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 '--------------------------------------------- ' initialiesierung '--------------------------------------------- Dim Speicher(24) As Byte Led1 Alias Portd.2 '------------------Konfigurierung------------- Portd = &HFF Led1 = 1 Slv_byte = &H02 Do If Twi_slv_flag <> 0 Then '----------------------------------------------------------------- ' Ergebnis als SLave auswerten ' Vorsicht, der Bus ist solange blockiert '----------------------------------------------------------------- Select Case Twi_slv_flag Case &H60 : 'Print Spc(30) ; "SLAVE recv:" ; 'es ist was empfangen worden 'Print Hex(twi_slv_addr) ; " "; For Temp = 1 To Twi_sr_cntr 'Print Hex(twi_slv_buff(temp)); 'print der Daten Next Case &HA8 : 'Print Spc(30) ; "SLAVE tran:" ; 'es ist was abgeholt worden 'Print Hex(twi_slv_addr) ; " "; For Temp = 1 To Twi_st_cntr ' Print 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 Call Twi_show_state(twi_slv_flag) 'Print status-text 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 '----------------------------------------------------------------- ' Jede Sekunde was senden & empfangen '----------------------------------------------------------------- If Timeout = 1 Then Gosub Master_transmit If Twi_mst_flag = 0 Then 'Hats geklappt ? Timeout = 0 'ja ' else (sonst probieren wir's gleich nochmal) End If End If '----------------------------------------------------------------- If Speicher(1) = &H03 Then Led1 = 0 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: 'gesendet 'Print "<<<<<<MASTER sent:" ; 'Print Hex(twi_mst_addr) ; " "; For Temp = 1 To Twi_mt_cntr 'Print Hex(twi_mst_buff(temp)); 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 Hex(twi_mst_buff(temp)); Speicher(temp) = 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 24 Twi_mst_buff(temp) = Slv_byte Next Twi_mst_addr = Mn2_adr 'I2C adresse Twi_mt_cntr = 3 ' erstmal 8 Byte senden Twi_mt_data = Varptr(twi_mst_buff(1)) ' adresse Daten Twi_mr_cntr = 3 ' dann 3 Byte empfangen Twi_mr_data = Varptr(twi_mst_buff(1)) ' empfangsbuffer Gosub Run_wait_master ' auf gehts Return
Mein Problem ist wenn ich beim µC1Code:'------------------------interface------------------- $regfile = "m32def.dat" $crystal = 16000000 $include "MyTWI.bas" $baud = 9600 $hwstack = 64 $swstack = 64 $framesize = 64 Const Tmr_c_prescale = 64 Const Tmr_c_preload = 131 Const Tmr_c_divis = 250 Declare Sub Twi_show_state(byref State As Byte) Config Porta = Output Config Portb = Output Config Portc = Input '------------------------------------------------- ' lokale I2C Adresse (als Slave) '------------------------------------------------- Const Mn1_adr = &H50 '------------------------------------------------- ' fremde I2C Adresse (als Master) '------------------------------------------------- Const Mn2_adr = &H40 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 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 '--------------------------------------------- ' initialiesierung '--------------------------------------------- Dim Speicher(24) As Byte Led1 Alias Portb.0 '------------------Konfigurierung------------- Porta = &HFF Portb = &HFF Slv_byte = &H03 Led1 = 1 Do If Twi_slv_flag <> 0 Then '----------------------------------------------------------------- ' Ergebnis als SLave auswerten ' Vorsicht, der Bus ist solange blockiert '----------------------------------------------------------------- Select Case Twi_slv_flag Case &H60 : 'Print Spc(30) ; "SLAVE recv:" ; 'es ist was empfangen worden 'Print Hex(twi_slv_addr) ; " "; For Temp = 1 To Twi_sr_cntr 'Print Hex(twi_slv_buff(temp)); 'print der Daten Next Case &HA8 : 'Print Spc(30) ; "SLAVE tran:" ; 'es ist was abgeholt worden 'Print Hex(twi_slv_addr) ; " "; For Temp = 1 To Twi_st_cntr 'Print 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 Call Twi_show_state(twi_slv_flag) 'Print status-text 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 '----------------------------------------------------------------- ' Jede Sekunde was senden & empfangen '----------------------------------------------------------------- If Timeout = 1 Then Gosub Master_transmit If Twi_mst_flag = 0 Then 'Hats geklappt ? Timeout = 0 'ja ' else (sonst probieren wir's gleich nochmal) End If End If '----------------------------------------------------------------- If Speicher(1) = &H03 Then Led1 = 0 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: 'gesendet 'Print "<<<<<<MASTER sent:" ; 'Print Hex(twi_mst_addr) ; " "; For Temp = 1 To Twi_mt_cntr 'Print Hex(twi_mst_buff(temp)); 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 Hex(twi_mst_buff(temp)); Speicher(temp) = 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 24 Twi_mst_buff(temp) = Slv_byte Next Twi_mst_addr = Mn2_adr 'I2C adresse Twi_mt_cntr = 3 ' erstmal 8 Byte senden Twi_mt_data = Varptr(twi_mst_buff(1)) ' adresse Daten Twi_mr_cntr = 3 ' dann 3 Byte empfangen Twi_mr_data = Varptr(twi_mst_buff(1)) ' empfangsbuffer Gosub Run_wait_master ' auf gehts Return
Mn1_adr = &H40
Mn2_adr = &H50
und bei µC2
Mn1_adr = &H50
Mn2_adr = &H40
nehme dann geht nichts....
wenn ich aber beim µC1
Mn1_adr = &H50
Mn2_adr = &H40
und bei µC2
Mn1_adr = &H40
Mn2_adr = &H50
nehme dann leuchtet nur bei µC2 die LED?!
Wieso...........
Danke für jede Unterstützung.
mfg dämmi







Zitieren

Lesezeichen