Ok, my process abpove was right, but the code snippets were riddled with errors (on account I used Timer1 in my code)...I actually spotted one more, so pay no attention to the code snippets above! Here's another attempt below, not saying it's error free (on account again, it's a hack), but use it as a starter, then come back if you've problems...
(this is for a 12f1822, but the concept is the same for its larger brothers...as are most of the registers - this was just a direct copy of my fuse settings....they may need tweaking to suit your own config)
Code:
@ __CONFIG _CONFIG1, _FCMEN_OFF & _FOSC_INTOSC & _WDTE_SWDTEN & _MCLRE_OFF & _CP_ON & _IESO_OFF & _BOREN_OFF & _PWRTE_OFF
@ __CONFIG _CONFIG2, _LVP_OFF
'
DEFINE OSC 8 'tell picbasic what speed the oscillator is
'
INCLUDE "DT_INTS-14.bas" '
INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts
'
Osccon = %01110010 'sets the internal oscillator to 8Mhz
'
TRISA.0 = 1 . 'make pin 7 (RA1) CPS0 analogue
ANSELA.0 = 1 'make pin 7 (RA1) CPS0 as input
'
OPTION_REG = %10000111 'use timer0 as interrupt (timebase) TMR0 Prescaler on (bit3) 256:1 prescale value (bits 2-0)
'
CPSCON0 = %10001101 'set the CPS module highest frequency availabe (fo vcc mode) + timer0 clock sourced from CPS module. (BIT 1)
'
CM1CON0 = 0 ' COMPARATOR OFF
CM1CON1 = 0 ' COMPARATOR OFF
'
CPS0_PRESENTCOUNT var word
CPS0_THRESHOLD var word
CPS0_LASTCOUNT var word
'
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR0_INT, _Timer0_Int, pbp, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
'
TMR0 = 0 'clear down TIMER0
@ INT_ENABLE TMR0_INT 'enable timer0 interrupts
'
main:
pause 100
goto main
'
'**************************************************************************************************
Timer0_Int:
@ INT_DISABLE TMR0_INT ' stop timer0 interrupts while we're in here
CPS0_PRESENTCOUNT = TMR0 ' take a snapshot of Timer0's present count.
CPS0_THRESHOLD = CPS0_LASTCOUNT - ((CPS0_LASTCOUNT/100)*2) ' this sets the 'trigger' up for a 20% diversion (finger press)
CPS0_LASTCOUNT = CPS0_PRESENTCOUNT ' store away the present timer0count for the next time we come into the interrupt routine
if CPS0_PRESENTCOUNT < CPS0_THRESHOLD then 'if the present incoming timer0 count is 20% below the last count, then a finger has been placed on the sensor - go do 'stuff'
blah blah
TMR0 = 0 ' clear timer0 down
@ INT_ENABLE TMR0_INT ' re-enable interrupt
@ INT_RETURN
end
One unknown, is the timer0 prescaler - you may need to tweak this (the OPTION_REG = %10000111 entry) to keep your oscillator under a count of 255 between successive timer0 interrupts (else timer0 will overflow & you'll have one helluva time trying to trap a finger press!). Actually it's better to use timer1 as the timer to count the CPS oscillator output pulses....since it's 16 bits and gives you more room to play with, but I can't be bothered to rejig the above....just consider iot as a framework to start from!
one thing I *strongly* recommend, is getting some debiuug/serout/hserout/pickit2uart tool going down onto your PC screen ...just so you can see/confirm what you CPS oscillator counts are ....or you'll be grabbing int the dark.
Bookmarks