Multi-Button CSM with Pic16LF722A


Closed Thread
Results 1 to 32 of 32

Hybrid View

  1. #1
    Join Date
    May 2013
    Location
    australia
    Posts
    2,645


    Did you find this post helpful? Yes | No

    Default Re: Multi-Button CSM with Pic16LF722A

    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
    Last edited by richard; - 19th May 2016 at 00:12. Reason: ps
    Warning I'm not a teacher

Similar Threads

  1. Replies: 5
    Last Post: - 18th March 2012, 21:40
  2. multi functions button press
    By malwww in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 27th May 2009, 00:12
  3. Multi-Threading
    By Ted's in forum mel PIC BASIC Pro
    Replies: 22
    Last Post: - 2nd September 2008, 05:55
  4. Multi-tasking
    By malc-c in forum mel PIC BASIC Pro
    Replies: 9
    Last Post: - 13th July 2006, 18:50
  5. Multi Interrupt How To ?
    By capitano in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 3rd February 2005, 14:48

Members who have read this thread : 4

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts