Using Amicus18 and I2C


Closed Thread
Results 1 to 4 of 4
  1. #1
    Join Date
    Feb 2012
    Location
    South Carolina, USA
    Posts
    18

    Default Using Amicus18 and I2C

    I am trying to get my Amicus18 board to talk to a Sparkfun MPR121 Capacitive Touch Keypad over I2C. Could someone verify the maximum usable OSC value.

    Right now I have it set to 64 but it looks like the PBP manual says the max usable is 20 with I2C.

    Can I run it at 64 and use DEFINE I2C_SLOW 1?

    Thanks John

  2. #2
    Join Date
    Feb 2012
    Location
    South Carolina, USA
    Posts
    18

    Default Re: Using Amicus18 and I2C

    Under Write_MPR121 - the D2 values never match the Register_val it writes just before. That is why I question if its working. I wanted to make sure this is working before moving forward.


    This is the main code I am using,

    Code:
    '******************************************************************************
    '*  Name    : MPR121.pbp                                                      *
    '*  Author  : John Kaiser                                                     *
    '*  Date    : 2013-10-11                                                      *
    '*  Version : 1.0                                                             *
    '*  Notes   : This file contains register definitions for the                 *
    '*            MPR121 Proximity Capacitive Touch Sensor Controller             *
    '******************************************************************************
    DEFINE OSC 64                       
    DEFINE LOADER_USED 1               
    
    DEFINE HSER_RCSTA 90h               
    DEFINE HSER_TXSTA 24h               
    DEFINE HSER_CLROERR 1               
    DEFINE HSER_SPBRG 138               
    
    SPBRGH = 0
    BAUDCON.3 = 1                       
    
    TRISC.7 = 1
    TRISB.6 = 0
    TRISB.7 = 0
             
    include "MPR121_defs.pbp"
    
    DEFINE I2C_SLOW 1
    
    Register_num var byte
    Register_val var byte
    Touch_0_7 var byte
    Touch_0_7 = 0
    d2 var byte
    d2 = 5
    
    symbol Cpin  = PORTB.6
    Symbol Dpin = PORTB.7
    Symbol Touch_IRQ = PORTC.7
    
    Gosub MPR121_Init                   ' Iniatialize MPR121 registers
    
    '******************************************************************************
    '        xx
    '------------------------------------------------------------------------------
    Mainloop:
        
        Pause 30
    HSEROUT["  Touch_0_7 = ", bin Touch_0_7 ,10]
    'if Touch_IRQ = 0 then  goto Read_MPR121    
    Goto  Mainloop
    
    '******************************************************************************
    '        xx
    '------------------------------------------------------------------------------
    Write_MPR121:
        I2CWRITE Dpin, Cpin, $5A, Register_num,[Register_val]
            Pause 10
        HSEROUT["Register_num = ", hex Register_num ,"   Register_val = ", hex Register_val ,10]
            Pause 50
        I2CREAD Dpin, Cpin, $5A, Register_num,[d2]
            Pause 200
        HSEROUT["Register_num-- = ", hex Register_num ,"   Register_val-- = ", hex d2 ,10]
            Pause 200
    return
    
    '******************************************************************************
    '        xx
    '------------------------------------------------------------------------------
    'Read_MPR121:
    '    HSEROUT[" It has been touched !!"]
    '    I2CREAD Dpin, Cpin, $5A, $00,[Touch_0_7]
    '    Pause 2000
    '    HSEROUT["  Touch_0_7 = ", dec Touch_0_7 ,10]
    '    Pause 2000
    'return
    
    '******************************************************************************
    '        xx
    '------------------------------------------------------------------------------
    MPR121_Init:
    
        Register_num = MPR121_ELE_CFG : Register_val = $00 : gosub Write_MPR121
      
    'Section A - Controls filtering when data is > baseline.
        Register_num = MPR121_MHD_R : Register_val = $01 : gosub Write_MPR121
        Register_num = MPR121_NHD_R : Register_val = $01 : gosub Write_MPR121
        Register_num = MPR121_NCL_R : Register_val = $00 : gosub Write_MPR121
        Register_num = MPR121_FDL_R : Register_val = $00 : gosub Write_MPR121
    
    'Section B - Controls filtering when data is < baseline.
        Register_num = MPR121_MHD_F : Register_val = $01 : gosub Write_MPR121
        Register_num = MPR121_NHD_F : Register_val = $01 : gosub Write_MPR121
        Register_num = MPR121_NCL_F : Register_val = $FF : gosub Write_MPR121
        Register_num = MPR121_FDL_F : Register_val = $02 : gosub Write_MPR121
      
    'Section C - Sets touch and release thresholds for each electrode
        Register_num = MPR121_ELE0_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE0_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE1_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE1_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE2_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE2_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE3_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE3_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE4_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE4_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE5_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE5_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE6_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE6_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE7_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE7_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE8_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE8_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE9_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE9_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE10_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE10_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE11_T : Register_val = MPR121_TOU_THRESH : gosub Write_MPR121
        Register_num = MPR121_ELE11_R : Register_val = MPR121_REL_THRESH : gosub Write_MPR121
      
    'Section D - Set the Filter Configuration - Set ESI2
        Register_num = MPR121_FIL_CFG1 : Register_val = $04 : gosub Write_MPR121
      
    'Section E - Electrode Configuration - Set ELE_CFG to 0x00 to return to standby mode
        Register_num = MPR121_ELE_CFG : Register_val = $0C : gosub Write_MPR121  'Enables all 12 Electrodes
      
    'Section F - Enable Auto Config and auto Reconfig
        Register_num = MPR121_ATO_CFG0 : Register_val = $0B : gosub Write_MPR121
        Register_num = MPR121_ATO_CFGU : Register_val = $C9 : gosub Write_MPR121 'USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V   
        Register_num = MPR121_ATO_CFGL : Register_val = $82 : gosub Write_MPR121 'LSL = 0.65*USL = 0x82 @3.3V
        Register_num = MPR121_ATO_CFGT : Register_val = $B5 : gosub Write_MPR121 'Target = 0.9*USL = 0xB5 @3.3V
      
        Register_num = MPR121_ELE_CFG : Register_val = $0C : gosub Write_MPR121
     
    return
    '******************************************************************************
    
    end

    And this is the Register defs,

    Code:
    '******************************************************************************
    '*  Name    : MPR121_defs.pbp                                                 *
    '*  Author  : John Kaiser                                                     *
    '*  Date    : 2013-10-11                                                      *
    '*  Version : 1.0                                                             *
    '*  Notes   : This file contains register definitions for the                 *
    '*            MPR121 Proximity Capacitive Touch Sensor Controller             *
    '******************************************************************************
    
    
    '******************************************************************************
    ' MPR121 Note: After completing power on reset (POR) or soft reset by command,
    '  MPR121 all registers are in default reset initial value (see Table 1).
    '  All the registers are cleared, except AFE Configuration Registers 0x5C
    '  (Default 0x10) and 0x5D (Default 0x24).
    '
    ' MPR121 reset default mode is Stop Mode without any capacitance measurement.
    '  Set MPR121 into Run Mode by configuring ECR register (0x5E) so that least
    '  one of the 13 measurement channels is enabled. Set MPR121 into Stop Mode
    '  by writing 2bXX000000 to ECR register at any time. For all the registers,
    '  the current value can be read at any time.
    '
    ' Note: Registers write operation can only be done after MPR121 is set into
    '  Stop Mode, except the ECR and GPIO/LED related registers, which means 
    '  changing the value of these registers while MPR121 is in Run Mode will not 
    '  be effective.
    '
    ' Registers from address 0x00 to 0x2A are the output registers which are 
    '  updated periodically when MPR121 is in Run Mode. While Baseline Value 
    '  Registers 0x1D to 0x2A are the internal output baseline registers, these
    '  registers are also writeable to user, this is useful if customer setting
    '  targets as the initial baseline tracking start points is desired.
    '  
    ' Registers from address 0x2B to 0x7F are control and configuration registers, 
    '  which need to be correctly configured and initialized to start the 
    '  capacitance measurement and touch detection.
    '******************************************************************************
    
    
    
    '******************************************************************************
    '        Global Constants 
    '------------------------------------------------------------------------------
    MPR121_TOU_THRESH       CON     $06
    MPR121_REL_THRESH       CON     $0A
    '------------------------------------------------------------------------------
    
    
     
    '******************************************************************************
    '        MPR121 Touch Status Registers (0x00~0x01)
    '                From Section #2 of data sheet
    '------------------------------------------------------------------------------
    MPR121_xxxx_2_1         CON     $00
    MPR121_xxxx_2_2         CON     $01
    
    '******************************************************************************
    '        MPR121 Out Of Range Status Registers ($02, $03)
    '                From Section #13 of data sheet
    '------------------------------------------------------------------------------
    MPR121_xxxx_13_1        CON     $02
    MPR121_xxxx_13_2        CON     $03
    
    '******************************************************************************
    '        MPR121 Electrode Data Register ($04~$1D)
    '                From Section #3 of data sheet
    '------------------------------------------------------------------------------
    MPR121_xxxx_3_1         CON     $04
    MPR121_xxxx_3_2         CON     $05
    MPR121_xxxx_3_3         CON     $06
    MPR121_xxxx_3_4         CON     $07
    MPR121_xxxx_3_5         CON     $08
    MPR121_xxxx_3_6         CON     $09
    MPR121_xxxx_3_7         CON     $0A
    MPR121_xxxx_3_8         CON     $0B
    MPR121_xxxx_3_9         CON     $0C
    MPR121_xxxx_3_10        CON     $0D
    MPR121_xxxx_3_11        CON     $0E
    MPR121_xxxx_3_12        CON     $0F
    MPR121_xxxx_3_13        CON     $10
    MPR121_xxxx_3_14        CON     $11
    MPR121_xxxx_3_15        CON     $12
    MPR121_xxxx_3_16        CON     $13
    MPR121_xxxx_3_17        CON     $14
    MPR121_xxxx_3_18        CON     $15
    MPR121_xxxx_3_19        CON     $16
    MPR121_xxxx_3_20        CON     $17
    MPR121_xxxx_3_21        CON     $18
    MPR121_xxxx_3_22        CON     $19
    MPR121_xxxx_3_23        CON     $1A
    MPR121_xxxx_3_24        CON     $1B
    MPR121_xxxx_3_25        CON     $1C
    MPR121_xxxx_3_26        CON     $1D
    
    '******************************************************************************
    '        MPR121 Electrode Data Register ($04~$1D)
    '                From Section #4 of data sheet
    '------------------------------------------------------------------------------
    MPR121_xxxx_4_1         CON     $1E
    MPR121_xxxx_4_2         CON     $1F
    MPR121_xxxx_4_3         CON     $20
    MPR121_xxxx_4_4         CON     $21
    MPR121_xxxx_4_5         CON     $22
    MPR121_xxxx_4_6         CON     $23
    MPR121_xxxx_4_7         CON     $24
    MPR121_xxxx_4_8         CON     $25
    MPR121_xxxx_4_9         CON     $26
    MPR121_xxxx_4_10        CON     $27
    MPR121_xxxx_4_11        CON     $28
    MPR121_xxxx_4_12        CON     $29
    MPR121_xxxx_4_13        CON     $2A
    
    '******************************************************************************
    '        MPR121 Baseline Filtering Control Register ($2B~$40)
    '                From Section #5 of data sheet 
    '------------------------------------------------------------------------------
    MPR121_MHD_R            CON     $2B
    MPR121_NHD_R            CON     $2C
    MPR121_NCL_R            CON     $2D
    MPR121_FDL_R            CON     $2E
    MPR121_MHD_F            CON     $2F
    MPR121_NHD_F            CON     $30
    MPR121_NCL_F            CON     $31
    MPR121_FDL_F            CON     $32
    MPR121_NHD_T            CON     $33
    MPR121_NCL_T            CON     $34
    MPR121_FDL_T            CON     $35
    MPR121_EPROX_MHD_R      CON     $36
    MPR121_EPROX_NHD_R      CON     $37
    MPR121_EPROX_NCL_R      CON     $38
    MPR121_EPROX_FDL_R      CON     $39
    MPR121_EPROX_MHD_F      CON     $3A
    MPR121_EPROX_NHD_F      CON     $3B
    MPR121_EPROX_NCL_F      CON     $3C
    MPR121_EPROX_FDL_F      CON     $3D
    MPR121_EPROX_NHD_T      CON     $3E
    MPR121_EPROX_NCL_T      CON     $3F
    MPR121_FEPROX_DL_T      CON     $40 
    
    '******************************************************************************
    '        MPR121 Touch and Release Threshold ($41~$5A)
    '                From Section #6 of data sheet
    '------------------------------------------------------------------------------
    MPR121_ELE0_T           CON     $41
    MPR121_ELE0_R           CON     $42
    MPR121_ELE1_T           CON     $43
    MPR121_ELE1_R           CON     $44
    MPR121_ELE2_T           CON     $45
    MPR121_ELE2_R           CON     $46
    MPR121_ELE3_T           CON     $47
    MPR121_ELE3_R           CON     $48
    MPR121_ELE4_T           CON     $49
    MPR121_ELE4_R           CON     $4A
    MPR121_ELE5_T           CON     $4B
    MPR121_ELE5_R           CON     $4C
    MPR121_ELE6_T           CON     $4D
    MPR121_ELE6_R           CON     $4E
    MPR121_ELE7_T           CON     $4F
    MPR121_ELE7_R           CON     $50
    MPR121_ELE8_T           CON     $51
    MPR121_ELE8_R           CON     $52
    MPR121_ELE9_T           CON     $53
    MPR121_ELE9_R           CON     $54
    MPR121_ELE10_T          CON     $55
    MPR121_ELE10_R          CON     $56
    MPR121_ELE11_T          CON     $57
    MPR121_ELE11_R          CON     $58
    MPR121_ELE12_T          CON     $59
    MPR121_ELE12_R          CON     $5A  
    
    '******************************************************************************
    '        Debounce Register ($5B)
    '                From Section #7 of data sheet
    '------------------------------------------------------------------------------
    MPR121_DEBOUNCE         CON     $5B   
    
    '******************************************************************************
    '        AFE Configuration Register ($5C, $5D)
    '                From Section #8 of data sheet
    '------------------------------------------------------------------------------
    MPR121_FIL_CFG1         CON     $5C
    MPR121_FIL_CFG2         CON     $5D  
    
    '******************************************************************************
    '        Electrode Configuration Register (ECR, $5E)
    '                From Section #11 of data sheet
    '------------------------------------------------------------------------------
    MPR121_ELE_CFG          CON     $5E
    
    '******************************************************************************
    '        Individual Charge Current Register ($5F~$6B)
    '                From Section #9 of data sheet
    '------------------------------------------------------------------------------
    MPR121_xxxx_9_1         CON     $5F
    MPR121_xxxx_9_2         CON     $60
    MPR121_xxxx_9_3         CON     $61
    MPR121_xxxx_9_4         CON     $62
    MPR121_xxxx_9_5         CON     $63
    MPR121_xxxx_9_6         CON     $64
    MPR121_xxxx_9_7         CON     $65
    MPR121_xxxx_9_8         CON     $66
    MPR121_xxxx_9_9         CON     $67
    MPR121_xxxx_9_10        CON     $68
    MPR121_xxxx_9_11        CON     $69
    MPR121_xxxx_9_12        CON     $6A
    MPR121_xxxx_9_13        CON     $6B
    
    '******************************************************************************
    '        Individual Charge Time Register ($6C~$72)
    '                From Section #10 of data sheet
    '------------------------------------------------------------------------------
    MPR121_xxxx_10_1        CON     $6C
    MPR121_xxxx_10_2        CON     $6D
    MPR121_xxxx_10_3        CON     $6E
    MPR121_xxxx_10_4        CON     $6F
    MPR121_xxxx_10_5        CON     $70
    MPR121_xxxx_10_6        CON     $71
    MPR121_xxxx_10_7        CON     $72
    
    '******************************************************************************
    '        GPIO Registers ($73~$7A)
    '                From Section #14 of data sheet
    '------------------------------------------------------------------------------
    MPR121_GPIO_CTRL0       CON     $73
    MPR121_GPIO_CTRL1       CON     $74
    MPR121_GPIO_DATA        CON     $75
    MPR121_GPIO_DIR         CON     $76
    MPR121_GPIO_EN          CON     $77
    MPR121_GPIO_SET         CON     $78
    MPR121_GPIO_CLEAR       CON     $79
    MPR121_GPIO_TOGGLE      CON     $7A
    
    
    '******************************************************************************
    '        Auto Configuration Registers ($7B~$7F)
    '                From Section #12 of data sheet
    '------------------------------------------------------------------------------
    MPR121_ATO_CFG0         CON     $7B
    MPR121_ATO_CFG1         CON     $7C
    MPR121_ATO_CFGU         CON     $7D
    MPR121_ATO_CFGL         CON     $7E
    MPR121_ATO_CFGT         CON     $7F
    
    '******************************************************************************
    '        Software Reset Register ($80)
    '                From Section #15 of data sheet
    '------------------------------------------------------------------------------
    MPR121_xxxx_15_1        CON     $80

  3. #3
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default Re: Using Amicus18 and I2C

    Typically, datasheets will specify the device's "Slave Address" as a 7-bit number.
    In the case of the MPR121, the datasheet says 5A (with the ADDR pin tied to ground).

    In order to use that address in the control byte of the I2C commands, you have to shift it left 1-bit to make room for the Read/Write bit.

    So the control byte should be ... $B4.
    DT

  4. #4
    Join Date
    Feb 2012
    Location
    South Carolina, USA
    Posts
    18

    Default Re: Using Amicus18 and I2C

    Thanks Darrel, I changed $5A to $B4 and it works great.

    John

Similar Threads

  1. Replies: 62
    Last Post: - 5th May 2014, 20:22
  2. Amicus18/Arduino/Whatever voltages
    By dhouston in forum PBP & Amicus18
    Replies: 3
    Last Post: - 6th June 2011, 14:14
  3. Another Amicus18-Ethernet approach
    By dhouston in forum PBP & Amicus18
    Replies: 10
    Last Post: - 27th May 2011, 13:36
  4. Amicus18 Companion Shield Manual code
    By mackrackit in forum PBP & Amicus18
    Replies: 0
    Last Post: - 14th May 2011, 07:39
  5. News - farnell Stock Amicus18
    By lester in forum General
    Replies: 1
    Last Post: - 7th July 2010, 13:37

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts