Hi guys , well after some bad Ad readings from " interesting" ad channel , solved the touch switch using the CTMU
there is no examples of setup of the CTMU for Capacitance Touch sensor for the 18F on PBP at the moment
This example is the most simplest setup of the CTMU , which is how Microchip show in the App note and within the datasheets on the CTMU , refer to earlier posts in the link, also take a look a cap switch design http://ww1.microchip.com/downloads/e...U%2001375a.pdf
and the material for production ( Look at PET with a metal film application as well)
For what i wanted i needed a simple touch switch by using the body of a metal power on/off push switch to change modes , the switch supplied power only and now allowed the user to change modes of operation without having to add switches or change the way the power cct work
A ground tag was attached to the body to the A/D channel
for this example the value of <1000 ( 12bit ADC )was found to be correct for a touched switch in my cct , where the reading up past 2000 dec was an untouched sensor
the subrouine is called from an ISR every 10ms , the values of 4 reading are read and averaged , the value while its <1000 waits until the button is not touched ( acts as debouce ) before it toggles the mode / mode change
the values used in DT avg routine set to sensitivity of the touch switch by the "Fastspread" value , as usually the not touched value did not range that wide ( 500 ) and the samples at !0ms x 8 sample s gave 80ms min for a valid sample
this still requires some tweeking but it works
hope it helps
cheers
Sheldon
IN THE ISR
Code:gosub Cap_Touch_Sensor ' do reading of the capacitive Touch Sensor ( earth point of pwr switch) on AN7 / GET AN AVERAGE if VALUE1 < 1000 THEN ' if the Averaged value <1000 then sensor is being touched while VALUE1 < 1000 ' while the value < 1000 ( sensor is being touched ) gosub Cap_Touch_Sensor ' do reading of the capacitive Touch Sensor wend ' wait till its not being touched toggle IR_TX_HI_PWR ' toggle the output for Hi pwr mode endif
Code:Cap_Touch_Sensor: ' ----- Setup CTMU - for Touch Switch on AD7 , used when IR-TX ---------- CTMUCONH = %00000000 ' Bit7 CTMU enable 1=On ,0 = Off, Bit6 N/A , Bit5 CTMUSIDL - 1= disable modual when in idle mode 0= continue module operation when in idl mode ' Bit4 TGEN 1 = ENABLE 0= disable edge delay gen , bit3 EDGEN 1= edges not blocked 0= edges blocked , Bit2 EDGSEQEN - 1 = edge1 occure prior edge2 can 0= no edge seq ' Bit1 IDISSEN 1= grounded 0= Not grounded Analoge current Source , CTTRIG 1= Trig Output enabled 0 = disabled CTMUCONL = %00000000 ' Bit7 EDG2POL 1= edge2 pos edge responce 0= edge2 neg edge responce ,Bit6-5 Edge2 select source= 11=CTED1PIN 10=CTED2 pin, 01 ECCP1 , 00 ECCP2 ' Bit4 EDG2POL 1= edge1 pos edge responce 0= edge1 neg edge responce ,bit3-2 Edge1 source= 11=CTED1PIN 10=CTED2 pin, 01 ECCP1 , 00 ECCP2 ' Bit1 = Edge 2 (R/W) status 1= event occured 0= Not occured ,Bit0 = Edge 1 (R/W) status 1= event occured 0= Not occured , CTMUICON = %00000011 ' Bit7-2 011111-000001 max - min pos change from nominal current , 000000 Nominal current output set by bit1-0 ,111111 -100000 min -max neg change from nominal current ' Bit1-0 IRNG - Current Source Range Select bita 11= 100xbase(55uA) 10= 10xbase(5.5uA) ,01=base (0.55uA), 00= current sourse disabled ANCON0.7 = 1 ' Set PortF:2 Analog / Digital allocation - 0 = digital ,1 analog - ANSEL7 TRISF.2 = 1 ' Set TRISF.2 = 1 - Select portF.2 to Input - AN7 ADCON0 = %00011101 ' Select the A/D channel - AN7 turn on A/D CTMUCONH.7 = 1 ' Turn on CTMU CTMUCONH.1 = 1 ' IDISSEN (Bit1) - Drain any charge on the A/D channel pauseus 2 ' wait for charge to drain CTMUCONH.1 = 0 ' IDISSEN (Bit1) - Stop Discharge on the A/D channel pauseus 2 ' delay before selecting the CTMU edge1 CTMUCONL.0 = 1 ' Begin Charging Edge1stat pauseus 2 ' wait for charge CTMUCONL.0 = 0 ' stop Charging Edge1stat adcin 7,value1 ' do ADC reading on AN7 - touch switch input gosub aVERAGE ' average the readings ADCON0 = %00011100 ' Select the A/D channel - AN7 and turn off A/D module CTMUCONH.7 = 0 ' Turn off CTMU RETURN
Code:Average: AvgCount CON 8 ' Number of samples to average in Average routine Fastspread CON 500 ' Fast Average threshold +/- in Average routine IF Value1 = ADavg Then NoChange IF ABS (Value1 - ADavg) > Fastspread OR Value1 < AvgCount Then FastAvg IF ABS (Value1 - ADavg) < AvgCount Then RealClose ADavg = ADavg - (ADavg/AvgCount) ADavg = ADavg + (Value1/AvgCount) GoTo AVGok FastAvg: ADAVG = VALUE1 GoTo AVGok RealClose: ADavg = ADavg - (ADavg/(AvgCount/4)) ADavg = ADavg + (Value1/(AvgCount/4)) AVGok: Value1 = ADavg ' Put Average back into Value ' copy value for use by touch switch NoChange: Return




Bookmarks