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
the pause is there to slow the key action to human speeds ,the indicator leds can go in the key pressed loop ok as far as I can see
What is "if PW.15 then PW=0" doing? Is it checking bit 15 of PW to be high?
with any subtraction if the result is negative (ie overflowed) then the highest order bit of the result is always set.
ps can porta.3 be an output ?
have a try like this
Code:
'#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 = %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
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
lookup 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 300
FLG=0 'clr key pressed flag
ENDIF
porta=0 ;all leds off
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
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
Bookmarks