Hi!
Well, I started a new thread, as not to confuse it with another previously posted thread concerning a PIC12F1822 and CSM application.
I have an application that I want to use 3 capacitive touch buttons for brightness up, brightness down, and a firmware 1/0 "on/off" button for full on and full off.
I have attached my code thus far. It works fairly well, although I would like the on off function to be latching, where the up/down can be held to step up and down in each direction. Currently the on/off function toggles at the same rate I am repeating the up/down function.
Code:
'****************************************************************'* Notes : Copyright (c) 2016 *
'* : Editor MicroCode Studio Plus PBP 3.0.6.0 *
'* : MUST BUILD PROJECT WITH MPASM ASSEMBLER *
'* : Device = 16LF722A-I/SO *
'* Date : 1/18/2016 *
'* Version : 1z *
'* Name : LS1236_1Z.BAS *
'* Author : R. WRIGHT *
'* : *
'****************************************************************
'SET CONFIGURATION FOR INTERNAL OSCILLATOR WITH PLL MULTIPLIER ON
#CONFIG
__config _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDTE_OFF & _BOR_OFF & _PLLEN_ON
#ENDCONFIG
define OSC 4
INCLUDE "DT_INTS-14.bas" ' PBP interrupt routines (MUST BE IN SAME FOLDER)
INCLUDE "ReEnterPBP.bas" ' Included for use of CPS module interrupt
' Courtesy of Derrel Taylor, PBP Wizard!
Include "modedefs.bas"
OSCCON = %00010000 'SETS INT OSC TO 4Mhz
WPUB = %00000000 'DISABLES WEAK PULL-UP BITS
ANSELB = %00111111 'SETS INPUTS B0-B5 AS ANALOG
TRISB = %00111111 'SETS INPUTS B0-B5 AS INPUTS
OPTION_REG = %10000111
'1 = All weak pull-ups are disabled (except MCLR, if it is enabled)
' 0 = Interrupt on falling edge of RB0/INT pin
' 0 = Timer0 clock is internal cycle clock (Fosc/4)
' 0 = Increment on low-to-high transition on RA4/T0CKI pin
' 0 = Prescaler is assigned to the Timer0 module
' 111 = 1:256 Timer0 prescaler rate
T1CON = %11000001 'enable timer 1 (bit 0) & source the clock from the CPS module (bit 6 & 7 =11)
'set the CPS module highest frequency availabe (for vcc mode)
'+ timer0 clock sourced from CPS module. (BIT 1)
CPSCON0 = %10001100 '1 = CPS module is enabled
' 000 = unused
' 11 = Oscillator is in High Range. Charge/Discharge Current is nominally 18 µA
' 0 = Capacitive Sensing Oscillator Status bit (only readable)
' 0 = Timer0 clock source is controlled by the core/Timer0 module and is FOSC/4
CPSCON1 = %00000001 '0001 = channel 1, (CPS1)
' Software variables
CPSX_PRESENT var WORD 'VARIABLE FOR BUTTON CURRENT VALUE
CPSX_THRESHOLD var WORD 'VARIABLE FOR BUTTON THRESHOLD VALUE
CPSX_LAST var WORD 'VARIABLE FOR PREVIOUS BUTTON VALUE
Duty VAR WORD 'VARIABLE FOR DUTY CYCLE
stepp var byte 'VARIABLE FOR BRIGHTNESS LEVEL
incnt var byte 'BUTTON PUSH INCRIMENT
' 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
' SET DEVICE I/O PINS
LED1 VAR PORTA.1 ' SET LED LEVEL INDICATORS
LED2 VAR PORTA.2
LED3 VAR PORTA.3
LED4 VAR PORTA.4
LED5 VAR PORTA.5
' Software/Hardware initialization
PAUSE 50 ' OSC settle delay
Duty = 255 ' SET INITIAL BRIGHTNESS TO FULL ON
stepp = 5 ' SET INITIAL LOOKUP TABLE TO 5
incnt = 1 ' set input counter to input 1
hpwm 1,DUTY,1000 ' INITIALIZE HARDWARE PWM TO SELECTED LEVELS
pause 1000 ' LET EVERYTHING SETTLE
HIGH LED5 ' TURN ON OUTPUT FOR LED 5
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR0_INT, _Timer0_Int, pbp, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
TMR0 = 0 'clear TIMER0
@ INT_ENABLE TMR0_INT ;enable timer0 interrupts
PAUSE 100
'******************************************************************************
'------------------------------< Main program >--------------------------------
'SCAN THE THREE INPUTS UNTIL FINGER DEPRESSION IS DETECTED VIA TIMER0 INTERRUPT
Main:
incnt = 2
cpscon1 = %00000001 ' 0001 = channel 1, (CPS1), DOWN BUTTON
ANSELB = %00000010 ' SETS INPUT B1 AS ANALOG
TRISB = %00000010 ' SETS INPUTS B1 AS INPUTS
pause 5
INcnt = 3
cpscon1 = %00000010 ' 0010 = channel 2, (CPS2), UP BUTTON
ANSELB = %00000100 ' SETS INPUT B2 AS ANALOG
TRISB = %00000100 ' SETS INPUT B2 AS INPUT
PAuse 5
incnt = 1
cpscon1 = %00000000 ' 0000 = channel 0, (CPS0), 1/0 BUTTON
ANSELB = %00000001 ' SETS INPUT B0 AS ANALOG
TRISB = %00000001 ' SETS INPUT B0 AS INPUT
Pause 5 ' KEEP CYCLING UNTIL INTERRUPT OCCURS
Goto Main
'******************************************************************************
'******************************************************************************
'--------------------------<INTERRRUPT ROUTINE>--------------------------------
Timer0_Int:
@ INT_DISABLE TMR0_INT ; stop timer0 interrupts when TMR0 overflow occurs
pause 100 ; PAUSE TO GET TIMER 1 COUNT
' store away the present timer1 count for the next time we come into the interrupt routine
CPSX_PRESENT = TMR1 ' get Timer1's present count.
CPSX_THRESHOLD = CPSX_PRESENT - ((CPSX_LAST/10)*6) ' this sets the 'trigger' up for a 60% diversion (finger press)
CPSX_LAST = CPSX_PRESENT
'DETERMINES WHICH BUTTON HAS BEEN PRESSED
IF CPSX_PRESENT < CPSX_THRESHOLD THEN
if (incnt = 3) AND (STEPP > 1) then ' down button pressed so decriment stepp
stepp = stepp - 1
GOTO SKIP1
ENDIF
If (incnt = 2) AND (STEPP < 5) then ' up button pressed so incriment stepp
stepp = stepp + 1
GOTO SKIP1
ENDIF
IF (INCNT = 1) AND (stepp > 0) THEN ' 1/0 button pressed for off
STEPP = 0
GOTO SKIP1
ENDIF
IF (INCNT = 1) AND (stepp = 0) THEN ' 1/0 button pressed for on
STEPP = 5
ENDIF
' lights appropriate level indicator leds according to the current lookup table value
SKIP1:
IF STEPP = 5 THEN
HIGH LED5
ENDIF
IF STEPP = 4 THEN
HIGH LED4
ENDIF
IF STEPP = 3 THEN
HIGH LED3
ENDIF
IF STEPP = 2 THEN
HIGH LED2
ENDIF
IF STEPP = 1 THEN
HIGH LED1
ENDIF
if stepp = 0 THEN
LOW LED1
endif
' SETS HARDWARE PWM OUTPUT 1 TO DESIRED LEVEL at a frequency of 1Khz
lookup stepp, [0,16,32,64,128,255],duty ' choose level, 5 levels plus OFF
hpwm 1,duty,1000 ' set new level, frequency
IF INCNT = 1 THEN ' extra delay for press of
PAUSE 200 ' I/O button
ENDIF
ENDIF
pause 10 ' settle time
TMR0 = 0 ' clear TIMER0
TMR1 = 0 ' clear TIMER1
@ INT_ENABLE TMR0_INT ; re-enable timer0 interrupt
@ INT_RETURN
'*****************************************************************************
END
Bookmarks