I got the material from a local office supply place - OfficeMax. It is the clear stuff used as covers for book bindings.
I have been using capacitive touch switches for several years with little problem except the
Q prox chips became obsoleted after a couple of years.
Any Microchip can be used as the requirements are unbelievably simple:
An I/O pin to charge with supply voltage and an AD pin to read the cap sense value.
I sometimes take 20 to 100 readings, bubble sort them highest to lowest, then average
only array elements 20% to 80% to to remove any errant readings.
The outcome is stable, varies only one or two at 8 bit.
The AD needs to be coded for power conservation however.
The following code is derived almost directly from AN1286:
The touch button is simply a 3/16" stainless steel machine screw through the faceplate withCode:'PIC18F2520 subLOAD_AD_ARRAY: ADCON0 = %00000001 'ENABLES AD For i = 0 To 99 LOW PORTA.0 LOW PORTA.2 ASM NOP ENDASM TRISA.0 = 1 'INPUT HIGH PORTA.2 ASM NOP ENDASM 'AD BY REGISTER'S ADCON0.1 = 1 ' START AD GO/DONE BIT While ADCON0.1 = 1 : Wend ' AD ENDED GO/DONE Bit wAD.LowByte = ADRESL ' 2520 10 BIT AD ONLY wAD.HighByte = ADRESH yAD_ARRAY100[i] = wAD >> 2 Next ADCON0 = %00000000 'DISABLE AD Return
a double nut tightened around a soldered wire loop connected to the AD.
I add a little grommet for looks.
The charge lead is simply wound several times around the screw behind the faceplate.
Another version is individual metal tabs of sheet metal adhered to the underside of the
enclosure for buttons.
The AD wire is soldered to each tab and the charge wire only needs to wrap around the
AD wire or all AD wires.
The cap sensor readings can vary over time and the base line to compare the readings against
should be re zeroed and a new max value redetermined at regular intervals.
I laminate an inkjet photo quality paper (not photo paper) printout for the faceplate.
The last consideration is ESD.
A simple 100k resistor in line on both leads is a good solution.
Norm
Last edited by Normnet; - 7th May 2010 at 05:50.
Hi Norm.
I think you can shorten your code by Left justify the AD results and take only the ADRESH. Same as with the lines:
IoannisCode:wAD.LowByte = ADRESL ' 2520 10 BIT AD ONLY wAD.HighByte = ADRESH yAD_ARRAY100[i] = wAD >> 2
Norm,
There are many ways to do it. You can also use the interrupt TMR1 to detect changes in the output frequency due to a pad being touched by a finger. This is explained in AN1101 "Introduction to Capacitive Sensing".
http://ww1.microchip.com/downloads/e...tes/01101a.pdf
I see that you are using AN1286 "Water-Resistant Capacitive Sensing". If you are using your touch sensors in a wet environment, then you might want to consider using inductive sensors. Take a look at the table I attached to this post.
http://www.microchip.com/stellent/id...param=en538303
Robert
I'm trying to use capacitive touch too - was kinda hoping that the inbuilt capacitive sensing was a bit more straight forward than the convoluted mess and complexity it looks like. Would it be too hard for microchip to make it a bit user friendly so you just enable named pins as capacitive, then read the register to see which were pressed and had inbuilt filtering etc??
I've used Mister E's capacitive touch idea before and it seems so much simpler than the "integrated' solution.
Anyrate - enough of my ramblings, I'd like to learn to use it - hopefully it's not as complex as it appears from outset. I've copied byte butchers code as above and pasted it directly into MCS and I have errors all over the place. I have a fresh install of PBP2.6 and have also just downloaded DTs' ints-14.
How come it works for him and not for me? I had the chip type 16F726 like his also
While I'm on a roll, why wont MCS allow you to copy and paste the error list???
I think many of the issues come from the Interrupt routine but asm and interrupts are well over my head. Is there any reason Byte Butcher used interrupts rather than just checking pins periodically?
Thanks
Error[118]c:\pbp...asm 213 : Overwriting previous address contents (2007)
Error[101]c:\pbp...asm 342 : ERROR: (wsave variable not found)
Error[101]c:\pbp...asm 308 : ERROR: (" Add:" wsave VAR BYTE $20 SYSTEM)
Error[101]c:\pbp...asm363 : ERROR: (Chip has RAM in BANK1, but WSAVE was not found)
Error[101]c:\pbp...asm315 : :ERROR: (" Add:" wsave VAR BYTE $A0 SYSTEM)
Error[128]c:\pbp...asm 989 : Missing argument(s)
Error[101]c:\pbp...asm672 : ERROR: ("INT_Handler" - Interrupt Flag (FlagReg,FlagBit) not found)
Error[128]c:\pbp...asm 1000 : Missing argument(s)
Error[101]c:\pbp...asm 672 : ERROR: (INT_ENABLE" - Interrupt Flag ( FlagReg,FlagBit) not found)
He used interrupts because that is the way to do it. You need to count the number of pulses in the signal for a fixed amount of time and determine if the switch has been touched or not. This app note might help you to understand the basics of CSM
http://ww1.microchip.com/downloads/e...tes/01101a.pdf
Robert
"No one is completely worthless. They can always serve as a bad example."
Anonymous
Don't you have to do better things?
Seriously now, I mean it, while the timers do their jobs, that is to count, you can do many other tasks in your program.
That is why the so hated interrupts are needed.
As for your errors, do post your code. Do you need help or guesses?
Ioannis
Bookmarks