Hello again,
Okay I got the buttons to work as i wished, and I changed to 4 pwm levels. However, I have added code to indicate which of the 4 levels I am currently at.
There is a "pause 300" that you have in the MAIN program area that delays the led indicator change from the time that the button is pressed. I tried to move the code for the led indicators to a point before the "pause 300", but then the program quits working. Is this pause what determines the time between steps if a[ button is continuously pressed, or does it serve another purpose? Another dumb thing, if I want 5 levels plus off, as shown in my previously posted example, how do I do it? Currently I am using a value of 256 from the original 16 as you had to get 4 steps, but that works out pretty evenly.
What is "if PW.15 then PW=0" doing? Is it checking bit 15 of PW to be high? Please see cod attached.
Thanks.
[CODE'********************************************* *******************
'* Name : CAPSENSE.BAS *
'* Author : RICHARD *
'* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 10/20/2011 *
'* Version : 1.0 *
'* Notes : *
'* : 16LF722A *
' *
'************************************************* ***************
'#DEFINE DBUG 1
#CONFIG
__config _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDTE_OFF & _BOR_OFF & _PLLEN_ON
#ENDCONFIG
define OSC 4
include "dt_ints-14.bas"
include "REENTERPBP.bas"
' variables used by interrupt handler, comment out as per assembler
wsave VAR BYTE $20 SYSTEM ' location for W if in bank0
'wsave VAR BYTE $70 SYSTEM ' alternate save location for W
' if using $70, comment wsave1-3
' --- IF any of these three lines cause an error ?? ------------------------
' Comment them out to fix the problem ----
' -- Which variables are needed, depends on the Chip you are using --
wsave1 VAR BYTE $A0 SYSTEM ' location for W if in bank1
'wsave2 VAR BYTE $120 SYSTEM ' location for W if in bank2
'wsave3 VAR BYTE $1A0 SYSTEM ' location for W if in bank3
asm
INT_LIST macro
INT_HANDLER T1GATE_INT, _TB1, PBP,YES
endm
INT_CREATE
ENDASM
THRESH CON 16000 'needs to be established
FLG VAR BYTE 'GOT A KEY
KP VAR BYTE 'WHICH KEY pressed
key_inx var byte ;key index
PW VAR WORD ;PULSEWIDTH
DEFINE DEBUG_REG PORTB
DEFINE DEBUG_BIT 7 ;pgd
DEFINE DEBUG_BAUD 9600
DEFINE DEBUG_MODE 0
OSCCON = %00010000 '4 mhz
CPSCON0 = %10001100 'high range
CPSCON1 = 0 'cps ch 0
ANSELB = %00000111 'SETS INPUTS B0-B2 AS ANALOG
TRISB = %01111111 'SETS INPUTS B0-B5 AS INPUTS b7 output
WPUB = %00000000 'DISABLES WEAK PULL-UP BITS
TRISC = %11111011 'ccp1 output portc.2
OPTION_REG=$86 'edge int. prescale 1:128
PIE1.7=1 'timer1 gate interrupt
T1GCON=$f9 'single shot timer0 overflow as input
T1CON=%11000101 'capsense as input no prescale no sync
INTCON= $C0 'peripheral interrupts
PW=1023
t2con=7
LED1 VAR PORTA.1 ' SET LED LEVEL INDICATORS
LED2 VAR PORTA.2
LED3 VAR PORTA.3
LED4 VAR PORTA.4
LED5 VAR PORTA.5
LED VAR portc.2
;up down off
;key0=portb.0=ch0, key1=portb.1=ch1, key2=portb.2=ch2
#IFDEF DBUG
portb.7=1
LED=1
pause 2000
Debug "Start",13 ,10
LED=0
pause 500
#ENDIF
ccp1con=12
CCPR1L=255 'SET TO MAX BRIGHTNESS
FLG=0
key_inx=0
MAIN:
IF FLG=1 THEN
IF KP = 0 THEN '1/0 BUTTON PRESSED
ccp1con=0 ;kill it
led=0
PW=0
ELSEif KP = 1 THEN 'UP BUTTON PRESSED
PW= (PW+256) MIN 1023
else 'DOWN BUTTON PRESSED
PW = PW-256
IF PW.15 THEN PW=0
ENDIF
CCPR1L = PW>>2;
ccp1con=12|((PW&3)<<4);
#IFDEF DBUG
debug "KEY ",#KP,13,10
debug #PW,13,10
#ENDIF
PAUSE 300
FLG=0 'clr key pressed flag
ENDIF
IF pw = 1023 THEN
HIGH LED5
ENDIF
IF pw = 768 or PW = 767 THEN
HIGH LED4
ENDIF
IF pw = 512 or PW = 511 THEN
HIGH LED3
ENDIF
IF pw = 256 or PW = 255 THEN
HIGH LED2
ENDIF
if pw = 0 THEN
high LED1
endif
GOTO MAIN
TB1:
#IFDEF DBUG
debug #TMR1,13,10
#ENDIF
IF TMR1 < THRESH THEN ' KEY DETECTED
if !flg then
KP=key_inx
FLG=1 'set key pressed flag
endif
ENDIF
key_inx=key_inx+1 ;check next key
if key_inx > 2 then key_inx=0
CPSCON1 = key_inx
TMR1=0
T1GCON.3= 1 ;single shot reset
@ INT_RETURN][/CODE]
Bookmarks