PDA

View Full Version : Capacitive sensing module on 16f1936



grahamg
- 25th April 2010, 14:17
I am not sure weather I am doing something incorrectly or maybe there is a problem with the data sheet.



DEFINE OSC 4

@ __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_ON & _BOREN_ON & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDTE_OFF & _FOSC_XT
@ __CONFIG _CONFIG2, _WRT_HALF & _BORV_25 & _PLLEN_OFF

db0 VAR PORTC.0 'o 0:3 digit data
db1 VAR PORTC.1 'o
db2 VAR PORTC.2 'o PIN13
db3 VAR PORTC.3 'o PIN14
digitsel1 VAR PORTC.4 'o PIN15
digitsel2 VAR PORTC.5 'o PIN16
TX VAR PORTC.6 'o
RX VAR PORTC.7 'i

cs VAR PORTA.0 'o
nu1 VAR PORTA.1 'o
nu2 VAR PORTA.2 'o
'EXPECTED ACTUAL
BUT1 VAR PORTB.0 'i pin21 03A-O3B 03C-03D
UP VAR PORTB.1 'i pin22 03C-03D 03E-03F
BUT3 VAR PORTB.2 'i pin23 03E-03F 040-041
ENTER VAR PORTB.3 'i pin24 040-041 042-043
DOWN VAR PORTB.4 'i pin25 042-043 044-045
BUT2 VAR PORTB.5 'i pin26 044-045 03A-03B
nu3 VAR PORTB.6 'o pin27
nu4 VAR PORTB.7 'o pin28

INDEX var byte
BASEVAL VAR byte[12] 'AFTER COMPILING BASEVAL=ADDRESS 03A


GOTO START:
DEFINE INTHAND MYINT
ASM
MYINT CLRF BSR ;SET PAGE=0
BTFSS PIR1,TMR1GIF ;TEST FOR TIMER1 GATE INTERRUPT
BRA TIMER0 ;MUST BE TIMER0
BCF T1CON,TMR1ON ;STOP TIMER1
CLRF FSR0H ;CLEAR FSR HIGH BYTE
MOVLW _BASEVAL ;MOV BASEVAL TO FSR0 LOW
MOVWF FSR0L
MOVLW 6 ;MOVE 6 TO WREG
SUBWF _INDEX,W ;SUBTRACT W FROM INDEX
BTFSC STATUS,Z ;TEST FOR ZERO
CLRF _INDEX ;IF ZERO THEN ZERO INDEX
MOVF _INDEX,w ;MOVE INDEX TO W
MOVWF CPSCON1 ;MOV W TO CAPACITIVE SENSING CHANNEL
LSLF WREG,W ;MULTIPY W BY 2
ADDWF FSR0L,F ;ADD W TO BASEVAL
MOVF TMR1L,W ;MOVE TIMER1 LOW TO WREG
MOVWI INDF0++ ;SAVE WREG TO BASEVAL+INDEX*2 AND INC FSR0
MOVF TMR1H,w ;MOVE TIMER1 HIGH BYTE TO WREG
MOVWI INDF0++ ;SAVE WREG TO BASEVAL+INDEX*2+1
INCF _INDEX,f ;INCREMENT INDEX
CLRF TMR1L ;CLEAR TIMER1 LOW
CLRF TMR1H ;CLEAR TIMER1 HIGH
BSF T1CON,TMR1ON ;TURN TIMER 1 ON
BCF PIR1,TMR1GIF ;CLEAR TIMER 1 GATE INTERRUPT FLAG
RETFIE ;RETURN FROM INTERRUPT
TIMER0 BCF INTCON,TMR0IF ;CLEAR TIMER0 INTERRUPT FLAG
RETFIE ;RETURN FROM INTERRUPT
ENDASM


START:
ANSELA=$00
TRISA=$00
ANSELB=$3F
TRISB=$3F
PORTA=$01
PORTB=$00
PORTC=$30
TRISC=$80
CPSCON0=$8C 'BITS 2,3=OSCILLATOR RANGE
CPSCON1=$00 'BITS 0-2 SELECT CHANNEL
OPTION_REG=$C4
T1CON=$C5
T1GCON=$E1
PIR1=$00
PIE1=$80
INDEX=0
INTCON=$E0
loop1:
goto loop1


When I compile the above code and run it with the ICD3 I appear to get valid timer1 values in sfr locations 03a-045. When I touch the touch pad connected to pin 26 (CPS5) the value in 03a,03b changes. All other locations appear to be offset by a vale of 2. See expected,actual addresses after the port definitions. Can anyone explain why this is like it is?

Graham Guthrie