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