Hallo
Ich möchte einfach nur Daten von Mikrokontroller 1 (Slave) zu yC 2 (Master) senden dieser soll dies erkennen und dann neue Daten zu yC 3 (slave) senden.
Leider Funktioniert dies bei meinem angehängten Programm nicht die Daten kommen von yC 1 zwar bei yC 2 an aber danach geht nichts mehr warum?
yC 1:
yC 2:Code:'-----------------------------Registrierung------------------------------------- $regfile = "m32def.dat" 'Konfiguration auf ATmega 32 $include "MyTWI.bas" $crystal = 16000000 'Quarztakt 16MHz $baud = 9600 Config Twi = 400000 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 $eeprom I2cinit Declare Sub Twi_slave_sendet_byte(byval Variable As Byte) '-----------------------------Configuration------------------------------------- Config Porta = Input Config Portb = Input Config Portd = Output '-----------------------------Dimensionierung----------------------------------- Dim Slaveadress As Byte Dim Neuesbyte As Bit Dim Status As Bit Dim Twi_control As Byte Dim Twi_status As Byte Dim Var As Byte Dim Varsend As Byte Dim Twi_slv_data(1) As Byte Dim Slave_mode As Byte Dim Tmp As Byte Dim Flanke1 As Bit Dim Impuls1 As Bit Dim Senden1 As Byte '-----------------------------Vorkonfiguration---------------------------------- Slaveadress = &H42 Twi_slv_data(1) = Slaveadress Twi_slv_addr = Slaveadress Twi_sr_data = Varptr(slave_mode) 'datenbuffer empfang Twi_st_data = Varptr(twi_slv_data(1)) 'datenbuffer senden Twar = Twi_slv_addr 'I2C Adress Mega32 + GCA Config Twi = 400000 'I2C Speed On Twi Twi_mst_slv_isr , Nosave Gosub Twi_sense 'Aktivieren Slave-Funktion Enable Interrupts Led1 Alias Portd.2 Tast1 Alias Pinb.0 Led1 = 1 Senden1 = &H11 '-----------------------------Hauptprogramm-------------------------------------- Do If Tast1 = 1 And Flanke1 = 0 And Impuls1 = 0 Then Led1 = 0 Flanke1 = 1 Do Call Twi_slave_sendet_byte(senden1) Loop Until Status = 1 Waitms 200 End If If Tast1 = 1 And Flanke1 = 1 And Impuls1 = 0 Then Led1 = 1 Flanke1 = 0 Do Call Twi_slave_sendet_byte(senden1) Loop Until Status = 1 Waitms 200 End If If Tast1 = 0 Then Impuls1 = 0 Loop End 'unterprogramme Slave_empfaengt_byte: If Twi_slv_flag <> 0 Then Select Case Twi_slv_flag Case &H60 : Var = Slave_mode 'es ist was empfangen worden Case &HA8 : 'daten sind abgeholt worden For Tmp = 1 To 1 Twi_slv_data(tmp) = 0 ' also löschen ? Next End Select Twi_slv_flag = 0 'löschen marker Twi_slv_stat = 0 'löschen marker Gosub Twi_sense 'alles wieder enablen 'und Bus freigeben Sub Twi_slave_sendet_byte(variable As Byte) Status = 0 ' schauen ob TWINT gesetzt ist Twi_control = Twcr And &H80 ' Bit7 von Controlregister If Twi_control = &H80 Then Twi_status = Twsr And &HF8 ' Status ' will der Master ein Byte haben If Twi_status = &HA8 Or Twi_status = &HB8 Then Twdr = Variable Status = 1 ' neue Daten ausgeben End If ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht Twcr = &B11000100 ' TWINT löschen, mit ACK End If End Sub End If
yC 3:Code:'-----------------------------Registrierung------------------------------------- $regfile = "m32def.dat" 'Konfiguration auf ATmega 32 $lib "i2c_twi.lbx" $crystal = 16000000 'Quarztakt 16MHz $baud = 9600 Config Twi = 400000 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 $eeprom I2cinit Declare Function Twi_read_byte(byval Slave As Byte) As Byte ' default use 40 for the frame space '-----------------------------Configuration------------------------------------- Config Porta = Output Config Portb = Output Config Portc = Input '-----------------------------Dimensionierung----------------------------------- Dim Slave As Byte Dim Twi_status As Byte Dim Twi_read_byte As Byte Dim Twi_control As Byte Dim Error As Bit Dim Flanke1 As Bit Dim Impuls1 As Bit Dim Progmodus As Bit Dim Emfaengt As Byte Led1 Alias Portb.0 Led2 Alias Porta.0 Led3 Alias Porta.1 Tast1 Alias Pinc.3 '-----------------------------Vorkonfiguration---------------------------------- Led1 = 1 Led2 = 1 Led3 = 1 '-----------------------------Hauptprogramm-------------------------------------- Do Emfaengt = Twi_read_byte(&H42) If Emfaengt = &H11 Then Led2 = 0 I2cstart I2cwbyte &H40 I2cwbyte &H20 I2cstop Waitms 1 End If Loop End 'Unterprogramme ' TWI read_byte ' holt ein Byte und schliesst die Übertragung ab Function Twi_read_byte(slave As Byte) As Byte Error = 0 ' Fehler zurücksetzen Twi_read_byte = 0 ' Wert vorbelegen ' Startbedingung Twcr = &B10100100 ' TWINT ' warten bis TWINT gesetzt ist Gosub Twi_wait_int ' wenn Zugriff auf den Bus erlaubt, Slaveadresse ausgeben If Twi_status = &H08 Or Twi_status = &H10 Then Twdr = Slave Or &H01 ' slave adresse + Read Twcr = &B10000100 ' TWINT löschen, Byte senden ' warten bis TWINT gesetzt ist Gosub Twi_wait_int ' Slave hat sich gemeldet If Twi_status = &H40 Then Twcr = &B10000100 ' TWINT löschen, Byte senden ' kein ACK (TWEA = 0) senden, weil wir nur ein Byte lesen wollen ' warten bis TWINT gesetzt ist Gosub Twi_wait_int ' ein Byte wurde empfangen If Twi_status = &H58 Or Twi_status = &H50 Then Twi_read_byte = Twdr ' Daten lesen Error = 0 ' kein Fehler Else Error = Twi_status ' Fehler End If Else ' kein slave Error = Twi_status ' Fehler End If ' STOPbedingung kommt hier immer im Ablauf, egal welcher Status Twcr = &B10010100 ' TWINT löschen, STOP senden ' nach einem STOP wird TWINT nicht mehr gesetzt, ' man darf/kann also nicht darauf warten ! Else ' Bus belegt, wird er wieder freigegeben Twcr = &B10000100 ' TWINT löschen, Bus freigeben Error = Twi_status ' Fehler End If End Function ' warten bis TWINT gesetzt ist, status auslesen Twi_wait_int: Do Twi_control = Twcr And &H80 Loop Until Twi_control = &H80 Twi_status = Twsr And &HF8 ' status ' status nur zu Debugzwecken ausgeben, weil Bus sehr langsam wird ! ' Print "Err " ; Hex(twi_status) Return
Danke für HilfeCode:'-----------------------------Registrierung------------------------------------- $regfile = "m32def.dat" 'Konfiguration auf ATmega 32 $include "MyTWI.bas" $crystal = 16000000 'Quarztakt 16MHz '$baud = 9600 Config Twi = 400000 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 $eeprom I2cinit Declare Sub Twi_slave_sendet_byte(byval Variable As Byte) '-----------------------------Configuration------------------------------------- Config Portb = Input Config Portd = Output Config Porta = Input '-----------------------------Dimensionierung----------------------------------- Dim Slaveadress As Byte Dim Neuesbyte As Bit Dim Status As Bit Dim Twi_control As Byte Dim Twi_status As Byte Dim Var As Byte Dim Varsend As Byte Dim Twi_slv_data(1) As Byte Dim Slave_mode As Byte Dim Tmp As Byte '-----------------------------Vorkonfiguration---------------------------------- Slaveadress = &H40 Twi_slv_addr = Slaveadress Twi_sr_data = Varptr(slave_mode) 'datenbuffer empfang Twi_st_data = Varptr(twi_slv_data(1)) 'datenbuffer senden Twar = Twi_slv_addr '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 Interrupts Twi_slv_data(1) = Slaveadress Led1 Alias Portd.0 Led1 = 1 '----------------------------Hauptprogramm-------------------------------------- Do Gosub Slave_empfaengt_byte If Var = &H20 Then Led1 = 0 Loop End 'unterprogramme Slave_empfaengt_byte: If Twi_slv_flag <> 0 Then Select Case Twi_slv_flag Case &H60 : Var = Slave_mode 'es ist was empfangen worden Case &HA8 : 'daten sind abgeholt worden For Tmp = 1 To 1 Twi_slv_data(tmp) = 0 ' also löschen ? Next End Select Twi_slv_flag = 0 'löschen marker Twi_slv_stat = 0 'löschen marker Gosub Twi_sense 'alles wieder enablen 'und Bus freigeben Sub Twi_slave_sendet_byte(variable As Byte) Status = 0 ' schauen ob TWINT gesetzt ist Twi_control = Twcr And &H80 ' Bit7 von Controlregister If Twi_control = &H80 Then Twi_status = Twsr And &HF8 ' Status ' will der Master ein Byte haben If Twi_status = &HA8 Or Twi_status = &HB8 Then Twdr = Variable Status = 1 ' neue Daten ausgeben End If ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht Twcr = &B11000100 ' TWINT löschen, mit ACK End If End Sub End If
mfg dämmi







Zitieren

Lesezeichen