16F726 Capacitive sensing module


Closed Thread
Results 1 to 40 of 40

Hybrid View

  1. #1
    Join Date
    Jan 2009
    Location
    California, USA
    Posts
    323

    Default 16F726 Capacitive sensing module

    Well here I am... stuck again.

    I'm trying to learn how to use the capacitive sensing module on the 16F726.

    My first problem seems to be getting the sensing oscillator running.

    I've been through the CSM section (14.0) of the data sheet and I've read AN1171 (Using the Capacitive Sensing Module on the PIC16F72X)

    According to AN1171, once I've set the appropriate registers the oscillator should start up. At this point I would expect to see the oscillator running on my chosen sensor pin... right?

    I've got my 'scope on pin 21 (RB0/AN12/CPS0/INT) of the PIC but I don't see anything except a few millivolts of 60 cycle hum. It just looks like a high impedance input with no oscillator running.

    Shouldn't this be all it takes to get the CSM oscillator running on CPS0 (pin21) ?

    Code:
     '****************************************************************
    
    Include "MODEDEFS.BAS"   ' Include Shiftin/out modes
    
    @  __config _CONFIG1, _DEBUG_OFF & _PLL_EN & _BORV_2_5 & _BOR_ON & _CP_OFF & _MCLRE_OFF & _PWRT_EN & _WDT_OFF & _INTOSCIO
    @  __config _CONFIG2, _VCAP_RA0
    
    OSCCON = $10         'set oscillator to 4 Mhz
    
    TRISA= %11111111     'Set 'em all to inputs
    ANSELA= %11111111	 ' Set all pins to analog...
    
    TRISB= %11111111   	 'all input
    ANSELB= %11111111    'all analog
    
    TRISC= %00000000     'Set portC all outputs   
    
    CPSCON0 = %10001101  'Cap sense on, high range oscillator
    CPSCON1 = %00000001  'Cap sense channel input 0 is selected
    Could someone please point me in the right direction?

    Thanks!

    Steve

  2. #2
    Join Date
    Jan 2009
    Location
    California, USA
    Posts
    323


    Did you find this post helpful? Yes | No

    Default Well, I'm still trying with this CSM...

    I'm trying to learn to use the Capacitive Sensing Module (CSM) on the PIC16F727. I've had some minor success getting the CSM set up and running, and with reading the count from TMR1 to an LCD module.

    I'm using (trying) Darrel's Instant Interrupts to run an ISR when TMR2 matches PR2, but I clearly don't understand what I'm doing yet...

    Here's the part that works so far:
    I've got the CSM oscillator running and I can see the triangle wave on pin B0. I've got a wire and "touchpad" connected to it, and when I touch the pad the oscillator slows way down, so that part is working great.


    Here's what I'm *trying* to do at this point :

    Timer1 is used to count pulses on the cap sensing oscillator. It is set up so that Timer2 controls the gate of Timer1 and starts/stops the Timer1 counter.

    Timer2 counts until it matches the value in the PR2 register, then stops Timer1 and triggers an interrupt.

    The ISR reads the count in the Timer1 register and stores it in a variable called "timercount", then it resets the registers to 0, resets Timer2 to 0, clears the Timer2 interrupt flag, and restarts the timers.

    The main loop is supposed to read the contents of "timercount" and display it on an LCD so I can read the change in timercount when a finger touches the sensing pad.


    Here's the problems I'm having (so far):

    First, the Interrupt seems to "steal the show" and the program never enters the main loop and displays the data on LCD, UNLESS I put a "goto Main" inside the ISR routine. Then it will display my value on the LCD.

    Second, the count in TMR1 seems to be entirely dependent on the length of the "pause" in the main loop. With 100mS pause the timer reads about 15,000 counts, with a 200mS pause it reads about 29,000 counts. What's up with that? The ISR zeros the timers each time through.

    I've read sections 11-14 (using the timers and CSM) of the 16F727 datasheet (41341B.pdf) *repeatedly*, as well as AN1103 and AN1171 which explain using the CSM in the 16F727. Hey, I even managed to make Darrels "Blinky light" interrupt example work for me, but alas, I seem unable to pull it all together and make the touch sensor routine work. I figured I'd start by reading the count in TMR1 to an LCD so I can see what's happening..

    I've been hammering away at this for quite a while and starting to feel rather lost.

    Here's the code I've got so far if someone would *please* be so kind as to take a look and offer advice..

    Code:
    '-------------------------------------------------------------------------------
    'Trying to learn to use the Capacitive Sensing Module on a 16F727 --------------
    '-------------------------------------------------------------------------------
    
    @  __config _CONFIG1, _DEBUG_OFF & _PLL_EN & _BORV_2_5 & _BOR_ON & _CP_OFF & _MCLRE_OFF & _PWRT_EN & _WDT_OFF & _INTOSCIO
    @  __config _CONFIG2, _VCAP_RA0
    
    Include "MODEDEFS.BAS"    ' Include Shiftin/out modes
    INCLUDE "DT_INTS-14.bas"  ' Base Interrupt System
    INCLUDE "ReEnterPBP.bas"  ' Include if using PBP interrupts
    
    DEFINE LCD_DREG PORTA    ' Set LCD Data port
    DEFINE LCD_DBIT 4        ' Set starting Data bit (0 or 4) if 4-bit bus
    DEFINE LCD_RSREG PORTA   ' Set LCD Register Select port
    DEFINE LCD_RSBIT 2       ' Set LCD Register Select bit
    DEFINE LCD_EREG PORTC    ' Set LCD Enable port                                                   
    DEFINE LCD_EBIT 0        ' Set LCD Enable bit
    DEFINE LCD_BITS 4        ' Set LCD bus size (4 or 8 bits)
    DEFINE ADC_BITS 8        ' Set number of bits in ADC result
    DEFINE ADC_CLOCK 3       ' Set clock source for ADC (rc = 3)
    DEFINE ADC_SAMPLEUS 100  ' Set ADC sampling time in microseconds 
    DEFINE OSC 4
    
    OSCCON = $10         'set oscillator to 4 Mhz
    
    TRISA= %00000000     'Set 'em all to outputs
    ANSELA= %00000000	 'Set 'em all to digital
    TRISB= %11111111   	 'all input
    ANSELB= %11111111    'all analog
    TRISC= %00000000     'Set portC all outputs   
    
    CPSCON0 = %10001101  'Cap sense on, high range oscillator
    CPSCON1 = %00000000  'Cap sense channel input 0 is selected
    
    '-----Alias Pins
    RW           var    PORTC.3   'Read/Write line for the LCD
    
    '-----Allocate Variables
    timercount   var    word   ' A place to store the count from TMR1
    
    '-----Set up Interrrupts
    ASM
    INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
            INT_Handler   TMR2_INT,  _CheckCount,   PBP,  yes
         endm    
        INT_CREATE               ; Creates the interrupt processor
    ENDASM
    
    @ INT_ENABLE  TMR2_INT     ; enable Timer 2 interrupts
    
    
    
    low rw          'LCD Read/Write line low (write)
    Pause 200       'Let the LCd wake up
    lcdout $fe, 1   'Clear LCD
    
    '----- Timer Setup
    T2CON.2 = 1     'TMR2 on
    T2CON.0 =1      'adjust prescaler
    PR2 = $B4       ' w/prescale=1:1, $B4 sets 125us scan rate.  '= 10110100
    PIR1.1 = 0      'Clear the TMR2 interupt flag
    PIE1.1 = 1      'Turn TMR2 interrupt enable on
    T1CON = %11010101 'clock=CAPOSC, prescale=1:2, dedicated OSC disabled, no external clock synchronize, timer on
    T1GCON = %11100010 'Timer1 gate init/ Toggle Mode
    PIR1.7 = 0   'Clear Gate Interrupt Flag
    PIR1.1 = 0   'clear the TMR2 interupt flag
    PIE1.7 = 1 'Enable Gate Interrupt
    
    Goto main   'Just get it going...
    
    '---[TMR2 - interrupt handler]--------------------------------------------------
        disable   'I think I need to kill the interupts here..?
    CheckCount:
        T2CON.2 = 0   'stop timer2
        T1CON.0 = 0   'stop timer1
        timercount = TMR1L + TMR1H << 8   'stuff the contents of the timer register into a word
        TMR1L = 0     'reset counter to 0...
        TMR1H = 0     'upper 1/2 too
        TMR2 = 0       'rest timer 2
        PIR1.1 = 0   'Clear TMR2 Interrupt Flag
        T1CON.0 = 1  'restart timer1
        T2CON.2 = 1  'restart timer2
      '  gosub main    'if I don't add this, I never seem to get out of the interrupt and return to the main routine...
    @ INT_RETURN
        enable     're-enable interrupts
        
    '----Main loop-----------------------------------------------------------
    Main:
        LCDOUT $fe,2, " Count= ", dec timercount,"    ",$fe,$C0,"  TMR2 = ", dec timertemp,"    "
        pause 100   'changing the duration of the pause also changes the count on timer1.  Why?
        return    
      
    GOTO Main
    
        end

    Thanks very much,

    Steve

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


    Did you find this post helpful? Yes | No

    Default

    I've never used the touch sensor thingy's, but here's a couple items that will be causing problems.
    • You've enabled TMR1GIE (PIE1.7), but there isn't a handler for it.
      Don't think you really need it anyway if TMR2 is handling the gate, and creating an interrupt at the same time.
      &nbsp;
    • There is a return in your Main loop. Very Bad!
      &nbsp;
    DT

  4. #4
    Join Date
    Jan 2009
    Location
    California, USA
    Posts
    323


    Did you find this post helpful? Yes | No

    Default

    Ahhh, thanks Darrel... where would this forum be without you! No problem too large or small.

    I don't know what happened with the return inside my main loop... Bad late night cut & paste I guess. Thanks for pointing that out!

    About TMR1GIE (PIE1.7)...
    I've gone back and re-re-re-read section 12.6 (and figure 12-6) about the timer1 gate and "toggle mode" again, and also the "Timer 2 Time Base Setup" section of AN1171, and a few things are starting to make more sense... and it appears that the interrupt I want to watch is NOT the TMR2 to PR2 match, it's the Timer 1 Gate Event Interrupt , "TMR1GIF"(PIR1.7) . That explains some of the other weird results I've had.

    I don't see the "Timer 1 Gate Event Interrupt" listed in the Available Interrupt Sources on your website Darrel. Is there a way for me to add that to the selection so i can use TMR1GIF with "Instant Interrupts"?

    Thanks very much for your help! Hopefully I'll be able to get the Touch Sensor thing figured out and be one of the first to post a chunk of working code for it.


    Steve

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


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Byte_Butcher
    I don't see the "Timer 1 Gate Event Interrupt" listed in the Available Interrupt Sources on your website Darrel.
    Yeah, it's not in there.

    But it's not too hard to add it to the DT_INTS-14.bas file....
    Code:
    ASM
      #define TMR1GATE_INT   PIR1,TMR1GIF     ;-- Timer1 Gate Interrupt
      #define INT_INT   INTCON,INTF     ;-- INT External Interrupt
      #define RBC_INT   INTCON,RBIF     ;-- RB Port Change Interrupt
      #define TMR0_INT  INTCON,T0IF     ;-- TMR0 Overflow Interrupt 16F
      #define TMR1_INT  PIR1,TMR1IF     ;-- TMR1 Overflow Interrupt
    ...
    and
    Code:
    GetIntInfo  macro  IflagReg, IflagBit
    
    Found = NO
    ; nolist
      ifdef TMR1GIF    ;----{ TMR1 Gate Interrupt }---------------[PIR1, TMR1GIF]---
          INT_Source  PIR1, TMR1GIF, PIE1, TMR1GIE
      endif
      ifdef INTF    ;----{ INT External Interrupt }----------------[INTCON, INTF]---
          INT_Source  INTCON, INTF, INTCON, INTE
      endif
      ifdef RBIF    ;----{ RB Port Change Interrupt }--------------[INTCON, RBIF]---
    ...
    <hr>
    Then in your program's interrupt definition ...
    Code:
    '-----Set up Interrrupts
    ASM
    INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
            INT_Handler   TMR1GATE_INT,  _CheckCount,   PBP,  yes
        endm    
        INT_CREATE               ; Creates the interrupt processor
    ENDASM
    
    @ INT_ENABLE  TMR1GATE_INT     ; enable Timer1 Gate interrupts
    Good Luck!
    DT

  6. #6
    Join Date
    Aug 2005
    Location
    Houston, TX
    Posts
    43


    Did you find this post helpful? Yes | No

    Default Capacitor checker

    I made a capacitor checker using a 16F84A which works very well within limits. It uses the pot command. The code in PICBasic (not Pro) is:

    ' Capacitor Measurement
    ' Four digit common anode mulitplexed display
    ' Scan about 60/s (4ms pause)
    ' Driver 74HC4511
    ' Works for 2.0 uf (1K)- 100pf (20K)
    ' 8/20/06
    ' For 16F84A Chip
    ' Data output port A (Pin A5 NC)
    ' Pins 1 - 4 - Digit select for multiplex
    ' Pin5 - pot command
    ' Pin6 - Display Blanking signal (0 = blank)
    ' Pin7 - Range 1 = high value (1K resistor); 0 = low (20K)
    ' Digits 1 - 4; W1 - W4
    ' Measurement (Msr) W10
    ' Note that scan must be 60/s, and 1ms on + 3ms off shows no flicker, but
    ' leds are dim. 2ms on & 2ms off works well.
    Settings:
    Symbol Blank = pin6
    Symbol Range = pin7
    Symbol D1 = w1
    Symbol D2 = w2
    Symbol D3 = w3
    Symbol D4 = w4
    Symbol Msr = w10
    Symbol PortA = 5
    Poke $85, 0 ' Set port A to all outputs
    Output 1 ' Digit 1 - MSD
    Low 1 ' off
    Output 2 ' Digit 2
    Low 2
    Output 3 ' Digit 3
    Low 3
    Output 4 ' Digit 4
    Low 4
    Output 6 ' Blanking
    Low 6 ' Blank all segments


    Start:
    pause 750
    Blank = 0
    If range = 0 then testlow 'Check high or low state

    'Testhigh:
    pot 5,40,msr
    Msr = Msr*10 'Raise results for 4 digit display
    goto math

    Testlow:
    Pot 5,255, msr
    Msr = Msr*100

    Math: 'Set up digits in memory for display
    D1 = Msr/1000
    D4 = Msr//1000
    D2 = D4/100
    D4 = D4//100
    D3 = D4/10
    D4 = D4//10

    Display:
    poke porta, D1 'Send data
    High 1 'Select Digit
    Blank = 1 'Remove blanking
    Pause 2 'Pause
    Blank = 0 'Blank
    Low 1 'Unselect digit
    'Pause 2 'Pause again to save battery

    poke porta, D2
    High 2
    Blank = 1
    Pause 2
    Blank = 0
    Low 2
    'Pause 2

    poke porta, D3
    High 3
    Blank = 1
    Pause 2
    Blank = 0
    Low 3
    'Pause 2

    poke porta, D4
    High 4
    Blank = 1
    Pause 2
    Blank = 0
    Low 4
    Pause 2
    Goto display
    end

  7. #7
    Join Date
    Jan 2009
    Location
    California, USA
    Posts
    323


    Did you find this post helpful? Yes | No

    Default Thanks Darrel!, CSM is working!

    Bingo!
    I changed my interrupt from TMR2/PR2 match to TMR1 gate event and it's working beautifully now. The count on the LCD now accurately reflects what's going on with the CSM oscillator.

    Thanks so much for posting the necessary modifications to DT_INTS-14.bas.
    I actually opened that file and had a look just before bed last night and had pretty much figured out to do the modifications you posted. Thanks for confirming it for me.

    It looks like I need to adjust the TMR2 prescaler a bit to maximize the number of counts in the period, but it's working great now and the next thing to do is set up the averaging and "button pressed" detection routine but I think that should be pretty easy, even for me.

    I'll post code when I've got it working well. I'm rather surprised no one here has played with the Touch Sensor module on the 16F726/7 yet....
    I spent hours searching the archives and came up with a big zero.

    Thanks again Darrel!
    Last edited by Byte_Butcher; - 12th March 2009 at 16:19.

  8. #8
    Join Date
    Oct 2013
    Posts
    41


    Did you find this post helpful? Yes | No

    Default Re: 16F726 Capacitive sensing module

    Hi,
    Is it possible to use A ByteBucher code on PIC16F724.

    How to modified a Darrels Taylor file "DT_INTS-14.bas" with his red text on this thread.
    When I open his file "DT_INTS-14.bas" ver 1.10 I dont see anywhere where I can put this code:

    GetIntInfo macro IflagReg, IflagBit

    Found = NO
    ; nolist
    ifdef TMR1GIF ;----{ TMR1 Gate Interrupt }---------------[PIR1, TMR1GIF]---
    INT_Source PIR1, TMR1GIF, PIE1, TMR1GIE


    and


    ASM
    #define TMR1GATE_INT PIR1,TMR1GIF ;-- Timer1 Gate Interrupt


    Can someone help me to use capacitive sensing on this pic

    Best regards

Similar Threads

  1. Version Control
    By btaylor in forum mel PIC BASIC Pro
    Replies: 33
    Last Post: - 16th October 2011, 17:12
  2. Relaxation oscillators (for capacititive touch sensing)
    By HankMcSpank in forum mel PIC BASIC Pro
    Replies: 24
    Last Post: - 6th December 2009, 22:03
  3. mTouch capacitive sensing
    By jrprogrammer in forum mel PIC BASIC Pro
    Replies: 14
    Last Post: - 1st November 2008, 22:54
  4. Replies: 1
    Last Post: - 27th July 2008, 06:14
  5. Rf module
    By tangray in forum Adverts
    Replies: 0
    Last Post: - 7th August 2006, 07:14

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