Darrell and Joe, thanks so much for both of your inputs. I have experimented with your suggested changes and the lowest I was able to get the current to on Power Up was 350 microamps with the settings shown in my latest Main code excerpt listed below.
Here is the experiment sequence I went thru and the resultant current loads as shown on my Micronta Multimeter:
1) My Original Code + WDT_off: 400 microamps on powerup; settled to 1070 microamps after 1st interrupt sequence. (Note: all PortAB pullups were already off, as suggested by Darrell, in my original code by virtue of the OPTION_REG = %00111000 setting in my Initialization code)
2) Previous 1) + BOR_OFF by setting BOR_SBODEN in _config and PCON.4 = 0 in MAIN: 350 microamps on powerup; settled to 1020 microamps after 1st interrupt service.
3) Previous 2) + ANSEL=%1110011 as suggested by Darrell: no apparent changes...350 microamps on powerup; settled to 1020 microamps after 1st interrupt service. This was lowest case power achieved.
l4) Previous 3) + TRISA = %00001000 as suggested by Joe: current on powerup went back up to 1020 microamps and settled to 1020 microamps after 1st interrupt service.
Obviously Cases 2 & 3) were lowest power condition achieved by your suggested changes, but still in excess of what I expected, although the impedance of my meter may be making these reading higher than actual.
However, none of these changes solved my real problem which is "how to get the MCU to return to SLEEP mode at same current as on powerup after the 1st interrupt service is processed". Although all apparent steps in the code stop after the 1st interrupt and it appears the MCU is in SLEEP, the current never returns to the lower power up condition.
Neither of your comments mentioned anything that appeared in my code to be preventing return to the SLEEP mode in the MAIN loop after the 1st interrupt service. Any ideas????
Code:
' -----[ Device Declaration ]----------------------------------------------
' For MSASM assembler use following:
@ __config _INTRC_OSC_NOCLKOUT & _BOR_SBODEN & _WDT_OFF & _MCLRE_OFF & _CP_OFF
' For PM assembler only use following instead
'@device pic16F690, intrc_osc_noclkout, _bor_sboden, pwrt_off, wdt_off, mclr_off,
' protect_off
' The above config is inteded to set CONFIG = %0000110111010100 for hex 0DD4 or
' FCMEN on (1), IESO on(1), BOREN (01), CPD off (1), CP off (1), /MCLR is
' digital input (0), /PWRTE off (1), WDTE off (0), INTOSCIO (100).
' -----[ Declare Variables & Aliases ]-----------------------------
'
diff VAR Byte ' Difference between bat_mon and Vthr
dummy VAR Byte ' For read of on-interrupt port & clear mismatch condition
flush VAR PORTA.3 ' Set RA3 as input for sensing flush switch closure Int
i VAR Byte ' Index used in Gallon counter loop
led1 VAR PORTC.0 ' Set RC0 as LED indicator of valve open..water flowing
led2 VAR PORTC.1 ' Set RC1 as LED indicator of low battery
bat_mon VAR PortA.0 ' Set RA0 as battery low power monitor
meter VAR PORTA.2 ' Set RA2 as input for Hall Sensor meter pulse Interrupt
open_valve VAR PORTC.2 ' Set RC2 as valve solenoid open command
close_valve VAR PORTC.3 ' Set RC3 as valve solenoid close command
' -----[ Declare Constants ]----------------------------------------
'
k CON 10 ' Calibration factor for flow meter...# pulses per gal
Vthr CON 3 ' Assumes Low Battery Monitor threshold = 3 volts
' -----[ Initialization ]-------------------------------------------
Init:
' Setup Timer0 as an 8-bit counter with the clock input on RA2.
' 1:1 TMR0 prescaler
' TMR0 counts on high-to-low transitions
OPTION_REG = %00111000 ' PORTA/B pullups disabled, Interrupt on falling
' edge of RA2/INT, TMR0 clock source is RA2,
' increment on high-to-low transitions, prescaler to
' TMR0, TMR0 Rate 1:2
TMR0 = 256 - k ' preload TMR0 to overflow after k counts
' Initialization of inputs/outputs
open_Valve = 0 ' Initialize RC2 (open_valve) at Low value
close_valve = 0 ' Intialize RC3 (close_valve) at Low value
TRISA.2 = 1 ' Set RA2 as input port for clock to TMR0
TRISA.3 = 1 ' Set RA3 as input port for sensing Flush switch closure
meter = 1 ' Initialize RA2 (meter) at High for METER pulse inputs
' RA2 = TMR0 clock input for simulated meter pulse inputs
flush = 1 ' Initialize RA3 (flush) at High value for flush interrupt
' Interrupts Settings
FLUSH_INT_FLAG VAR INTCON.0 ' Alias RA3(FLUSH) On-change-interrupt flag bit
TMR0_INT_FLAG VAR INTCON.2 ' Alias Timer0 overflow flag bit
INTCON = %10101000 ' Enable interrupts: global, TMR0 overflow, & RABIE
IOCA = %00001000 ' Enable RA3 as on-change-INT
' Set INT Handler
ON INTERRUPT GOTO Int_handler
'-----[ Main Code Starts Here ]------------------------------------------------
MAIN:
' Perform following steps to save power during Sleep mode
OSCCON = %0100011 ' Switch to 1 MHz internal oscillator
VRCON = %00100000 ' Set Voltage Reference for minimum power consumption
' Disable CVref
ANSEL= %11110011 ' Set PortA to Analog I/O to save power during Sleep but
' leave Bits 2 & 3 as digital for RA2 pulse count
' TMR0 overflow interrupt & RA3 On-Change intterupt.
ANSELH= %11111111 ' Analog module enabled to save power during Sleep
CM1CON0.7 = 0 ' Turn off comparators during Sleep
CM2CON0.7 = 0
PCON.4 = 0 ' Turn off BOR during Sleep
WDTCON = %00010110 ' Turn WDT off to SLEEP indefinitely
'TRISA = %00001000 ' Trick from Joe S. to reduce SLEEP power...why???
TRISB = %11111111 ' Set all PORTB pins to inputs during Sleep
TRISC = %11111111 ' Set all PORTC pins to input during Sleep
PortA = %11111111 ' Write Port A all High to clear mismatch and save
' power during SLEEP
PortB = %11111111 ' Set all Port B and C pins High to save power
PortC = %11111111 ' in Sleep mode
@ sleep
' Microcontroller is in Sleep State waiting for external FLUSH Interrupt
' Valve should be closed at this point and no water flowing
GOTO Main ' Loop to Main to wait for next Flush interrupt on RA3 change
Bookmarks