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:
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
slave-send-empfang:
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