hallo habe hier mal send-empfang-slave und send-empfang-master.
master gibt über die serielle schnittstelle die daten aus und slave gibt die daten über das lcd-display aus. muste noch anpassen an dein lcd/rs232/mega
master-send-empfang:
slave-send-empfang:Code:' TWI-slave test ' zum simulieren eines PCF8574 $regfile = "m32def.dat" $crystal = 8000000 $hwstack = 32 $swstack = 32 $framesize = 64 $baud = 19200 Declare Sub Twi_send_byte(byval Slave As Byte , Zeichen As Byte) Declare Function Twi_read_byte(byval Slave As Byte) As Byte Dim Twi_control As Byte Dim Twi_status As Byte Dim Twi_data As Byte Dim B As Byte Dim Error As Byte Dim X As Byte Enable Interrupts ' TWI init Twcr = &B00000100 ' erstmal nur TWI aktivieren Twsr = 0 ' Status und Prescaler Register Twbr = 72 ' Bit Rate Register, 100kHz Print "TWI Master senden/empfangen" Do Input B Call Twi_send_byte(&H40 , B) Waitms 100 X = Twi_read_byte(&H40) Print X ; Waitms 100 Loop End 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 Else ' Bus belegt, wird er wieder freigegeben Twcr = &B10000100 ' TWINT löschen, Bus freigeben Error = Twi_status ' Fehler End If End Function Sub Twi_send_byte(byval Slave As Byte , Zeichen As Byte) Error = 0 ' 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 And &HFE ' slave adresse + Write Twcr = &B10000100 ' TWINT löschen, Byte senden ' warten bis TWINT gesetzt ist Gosub Twi_wait_int ' Slave hat sich gemeldet If Twi_status = &H18 Or Twi_status = &H20 Then Twdr = Zeichen ' Daten Twcr = &B10000100 ' TWINT löschen, Byte senden ' warten bis TWINT gesetzt ist Gosub Twi_wait_int ' Zeichen wurden gesendet If Twi_status = &H28 Or Twi_status = &H30 Then 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 Sub Twi_wait_int: Do Twi_control = Twcr And &H80 Loop Until Twi_control = &H80 Twi_status = Twsr And &HF8 ' status Return
Code:' TWI-slave test ' zum simulieren eines PCF8574 $regfile = "m32def.dat" $crystal = 8000000 $hwstack = 32 $swstack = 32 $framesize = 64 $baud = 19200 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.6 , Rs = Portc.7 Config Lcd = 20 * 2 Dim Twi_control As Byte Dim Twi_status As Byte Dim Twi_data As Byte Dim Neuesbyte As Byte Dim Count As Byte Declare Sub Twi_init_slave Enable Interrupts Count = 77 Twi_data = 0 Call Twi_init_slave Do Neuesbyte = 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 ' wurde ein Byte geschickt If Twi_status = &H80 Or Twi_status = &H88 Then Twi_data = Twdr ' neue Daten merken Neuesbyte = 1 ' merken das ein neues Byte da ist End If Waitms 100 ' will der Master ein Byte haben If Twi_status = &HA8 Or Twi_status = &HB8 Then Twdr = Count ' neue Daten ausgeben Incr Count ' testwert +1 End If ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht Twcr = &B11000100 ' TWINT löschen, erzeugt ACK End If ' wenn ein neues Byte gekommen ist, dieses auf LCD ausgeben If Neuesbyte <> 0 Then Cls Lcd Twi_data End If Loop End Sub Twi_init_slave Twsr = 0 ' status und Prescaler auf 0 Twdr = &HFF ' default Twar = &H40 ' Slaveadresse setzen Twcr = &B01000100 ' TWI aktivieren, ACK einschalten End Sub







Zitieren

Lesezeichen