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 seeThere 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
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