B4R Code Snippet Interfacing PCF8574 (8 BIT) & PCF8575 (16 bit )IO port expander module...

Discussion in 'B4R Code Snippets' started by rbghongade, Jun 6, 2017.

  1. rbghongade

    rbghongade Active Member Licensed User

    Dear friends,
    The code snippet interfaces Arduino Uno/ Wemos mini with PCF8574 , 8 bit IO port expander via I2C bus:
    Code:
    Sub Process_Globals
        
    Public Serial1 As Serial
        
    Private master As WireMaster
       
        
    Dim timer1 As Timer
        
    Dim state As Boolean
    End Sub

    Private Sub AppStart
        Serial1.Initialize(
    115200)
        
    Log("AppStart")
        master.Initialize
        timer1.Initialize(
    "timer1_Tick",2000)
        timer1.Enabled=
    True
       
       
    End Sub

    Sub timer1_Tick

        state=DigitalRead(
    7)
       
        
    If state Then
           
            DigitalWrite(
    7,False)
        
    Else
           
            DigitalWrite(
    7,True)
        
    End If
       
    End Sub

    Private Sub DigitalRead(pin As UInt)  As Boolean
        
    Dim pinstatus As Int
        master.WriteTo(
    0x71Array As Byte(0x00))
        
    Dim result() As Byte = master.RequestFrom(0x381)
        
    If result.Length = 0 Then
            
    Return False
        
    Else
            pinstatus= 
    Bit.Get(result(0),pin)
            
    Log(pinstatus)
                
    If pinstatus=0 Then
                    
    Return False
                
    Else
                    
    Return True
                
    End If
                   
        
    End If
    End Sub

    Private Sub DigitalWrite(pin As UInt,pinstate As Boolean)
       
        master.WriteTo(
    0x71Array As Byte(0x00))
        
    Dim result() As Byte = master.RequestFrom(0x381)
        
    If pinstate =False Then
            
    Bit.Clear(result(0),pin)
            master.WriteTo(
    0x38Array As Byte(0x00,result(0)))
        
    Else
            
    Bit.Set(result(0),pin)
            master.WriteTo(
    0x38Array As Byte(0x00,result(0)))
        
    End If
       
    End Sub
    Note:
    The address for PCF8574 is: 0x20 whereas for PCF8574A it is :0x38 (which I have) with A0,A1,A2 all grounded.
    The functions written for DigitalRead and DigitalWrite are not perfect hence you may suggest modifications/changes...
    The code works with Arduino Uno as well as Wemos mini boards.
    Hope somebody finds this useful. BTW it was my first attempt of interfacing any I2C device right from scratch!
     

    Attached Files:

    embedded, inakigarm and Erel like this.
  2. rbghongade

    rbghongade Active Member Licensed User

    Here is the code for interfacing PCF8575 (16 bit) IO expander:
    Code:
    Sub Process_Globals
        
    Public Serial1 As Serial
        
    Private master As WireMaster
      
        
    Dim timer1,timer2 As Timer
        
    Dim state As Boolean
    End Sub

    Private Sub AppStart
        Serial1.Initialize(
    115200)
        
    Log("AppStart")
        master.Initialize
        timer1.Initialize(
    "timer1_Tick",50)
        timer1.Enabled=
    True
        Clear_All
      
    End Sub

    Sub timer1_Tick
    Dim state As Boolean
        state=DigitalRead(
    13)
        state=
    Not(state)
        DigitalWrite(
    13,state)
        
    Log("Pin13:",state)
    End Sub


    Private Sub DigitalRead(pin As UInt)  As Boolean
        
    Dim pinstatus As Int
        master.WriteTo(
    0x20Array As Byte(0x01))
        
    Dim result() As Byte = master.RequestFrom(0x202)
        
    If result.Length = 0 Then
            
    Return False
        
    Else
            
    If pin>=0 And pin<=7 Then
            pinstatus= 
    Bit.Get(result(0),pin)
          
            
    If pinstatus=0 Then
                
    Return False
            
    Else
                
    Return True
            
    End If
            
    End If
            
    If pin>=10 And pin<=17 Then
                pinstatus= 
    Bit.Get(result(1),pin-10)
              
                
    If pinstatus=0 Then
                    
    Return False
                
    Else
                    
    Return True
                
    End If
            
    End If
        
    End If
    End Sub

    Private Sub DigitalWrite(pin As UInt,pinstate As Boolean)
      
        master.WriteTo(
    0x20Array As Byte(0x01))
      
        
    Dim result() As Byte = master.RequestFrom(0x202)
        
    If pinstate =False Then
            
    If pin >=0 And pin <=7 Then
                
    Bit.Clear(result(0),pin)
                master.WriteTo(
    0x20Array As Byte(result(0),result(1)))
            
    End If
            
    If pin >=10 And pin <=17 Then
                
    Bit.Clear(result(1),pin-10)
                master.WriteTo(
    0x20Array As Byte(result(0),result(1)))
            
    End If
        
    Else
            
    If pin >=0 And pin <=7 Then
                
    Bit.set(result(0),pin)
                master.WriteTo(
    0x20Array As Byte(result(0),result(1)))
            
    End If
                
    If pin >=10 And pin <=17 Then
                
    Bit.set(result(1),pin-10)
            master.WriteTo(
    0x20Array As Byte(result(0),result(1)))
            
    End If
        
    End If
      
    End Sub

    Private Sub Clear_All
        master.WriteTo(
    0x20Array As Byte(0x00,0x00))
    End Sub
    NOTE: The pin numbers are 0 through 7 and 10 through 17
     

    Attached Files:

    embedded and Erel like this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice