Hello,
Well after changing some pause timing and sharing it before and after the indicator LED routine, It seems to be working pretty good now. However, I still need to be able to use the 1/0 button as a single shot
button where pressing once shuts it down, as you have it, and pressing it again turns it back on with full pwm and level 5 selected, without the 1/0 button looping. You mentioned a finite machine, but I'm not sure as to how that
applies. Also, is there a quick way that I can change the pwm frequency to 1Khz, instead of 256? 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
p_level var byte
DEFINE DEBUG_REG PORTB
DEFINE DEBUG_BIT 7 ;pgd
DEFINE DEBUG_BAUD 9600
DEFINE DEBUG_MODE 0
OSCCON = 010000 '4 mhz
CPSCON0 = 001100 'high range
CPSCON1 = 0 'cps ch 0
ANSELB = 000111 'SETS INPUTS B0-B2 AS ANALOG
TRISB = 111111 'SETS INPUTS B0-B5 AS INPUTS b7 output
WPUB = 000000 'DISABLES WEAK PULL-UP BITS
TRISC = 111011 '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=000101 'capsense as input no prescale no sync
INTCON= $C0 'peripheral interrupts
PW=1023
p_level=5
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
p_level=0
ELSEif KP = 1 THEN 'UP BUTTON PRESSED
p_level= (p_level+1) min 5
'PW= (PW+256) MIN 1023
else 'DOWN BUTTON PRESSED
p_level= p_level-1
'PW = PW-256
IF p_level.7 THEN p_level=0
'IF PW.15 THEN PW=0
endif
lookup2 p_level, [0,12,48,218,586,1023],pw 'gamma 1.35,5 levels plus OFF
CCPR1L = PW>>2;
ccp1con=12|((PW&3)<<4);
#IFDEF DBUG
debug "KEY ",#KP,13,10
debug #PW,13,10
#ENDIF
PAUSE 50
FLG=0 'clr key pressed flag
ENDIF
'SET DISPLAY LEDS ACCORDING TO THE BRIGHTNESS LEVEL
IF p_level= 5 THEN
HIGH LED5
ENDIF
IF p_level=4 THEN
HIGH LED4
ENDIF
IF p_level=3 THEN
HIGH LED3
ENDIF
IF p_level=2 THEN
HIGH LED2
ENDIF
if p_level=1 THEN
high LED1
endif
if p_level=0 then
porta = 0
ENDIF
PAUSE 250
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
Bookmarks