Thanks again Jerson for your help on this.
I implemented your suggestions by keeping TMR0 disabled during the MAIN and Interrupt Service Routine until just before the IF-THEN block starts checking for pulse inputs from the FlowMeter. However, I see no changes in the current flow on PowerUp or on return to SLEEP after the ISR......350 microamps in both modes. I have included my latest code that includes these changes so you can see how I did it. If I didn't do it right, please advise.
Still very frustrated on solving this problem.
Code:
' -----[ Device Declaration ]----------------------------------------------
' For MSASM assembler use following:
@ __config _INTRC_OSC_NOCLKOUT & _BOR_SBODEN & _WDT_OFF & _MCLRE_OFF & _CP_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).
' -----[ Revision History ]------------------------------------------------
' Version 1.0.7 on 6/21/09: Eliminated @ NOP in MAIN; Reformated Port
' Assignments list; Changed IntCloc from 4 to 1 MHz;
' WDT_OFF and comparators off to save power.
' Version 1.0.8 on 6/22/09: Changes to MAIN to minimize power during Sleep:
' Set BOR_SBODEN; set PCON.4 =0; ANSEL =%11110011,
' TRISA = %00001101..Set RA0, RA2 & RA3 as inputs in
' MAIN before SLEEP permits return to SLEEP after ISR.
' Version 1.0.9 on 6/25/09: Moved INTCON statement to just before SLEEP in MAIN.
' Version 1.0.10 on 6/27/09: Delayed turning on TMR0 until after Flush interrupt
' -----[ 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 enabled, 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 Setting Alias'
TMR0_Enable VAR INTCON.5 ' Alias for On_Off switch of TMR0 counter
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
' Set INT Handler
ON INTERRUPT GOTO Int_handler
'-----[ Main Code Starts Here ]------------------------------------------------
MAIN:
' Perform following steps to save power during Sleep mode
OPTION_REG.7 = 1 ' Disable PortA/PortB pull-ups
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 = %00001101 ' Set RA0, RA2 & RA3 as inputs
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
' Interrupt Settings
INTCON = %10001000 ' Enable interrupts: global & RABIE, but TMR0 disabled
IOCA = %00001000 ' before SLEEP. Enable RA3 as on-change-INT
@ 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
'------{ Begin Interrupt Handler }---------------------------------------------
DISABLE ' Disable interrupts during interrupt handler
Int_handler:
OPTION_REG.7 = 0 ' Enable PortA/PortB Pullups
WDTCON = %0001000 ' Turn WDT on for ops
'Initialize registers for interrupt ops
' A/D & Comparators disabled
ANSEL=0 ' Set PortA to digital I/O for use with RA2 and RA3
ANSELH=0 ' Analog module disabled
CM1CON0=0 ' Disable comparators
CM2CON0=0
' Port Settings
TRISA = %11111111 ' Set all PORTA pins to inputs...RA0, RA2 & RA3 are used
TRISB = %00000000 ' Set all PORTB pins to outputs
TRISC = %11110000 ' Set lower 4 pins of PartB as outputs for LEDs
PORTA = %00000000 ' PortA pins all set to Low
PORTC = %00000000 ' LEDs off, PULSOUT RC3 provides a high-going pulse
TMR0_Enable = 1 ' Enable the TMR0 pulse counter for overflow interrupt
IF FLUSH_INT_FLAG = 1 Then ' Interrupt was from RA3 on change
REPEAT
' Wait until the external Flush interrupt is at high level...limits
' interrupt to switch closure only and not also for switch opening
Until flush = 1
PULSOUT open_valve,2000*2 ' Generate 20 msec pulse to RC3 to open valve
'HIGH led1 ' Light indicator that valve is open & water flowing
Write 7, flush ' Write FLUSH value..remove comment for test only
' Put code here to start a timer to run for 50 secs as a fail safe
' to prevent overflow of toilet tank in case of sensor failure.
'PULSOUT close_valve,2000 ' Generate 20 msec
' pulse to RC4 to close valve
Endif
' Valve is open and water is flowing
REPEAT
' Wait for flow to reach 1.6 gallons
' Flash flow light while water flowinguntil pulse counter overflows
High led1
Pause 125/10
Low led1
Pause 500/10
If diff > 2 Then ' Battery is low..flash the low battery monitor light
HIGH led2 ' while water is flowing
PAUSE 125/10
Low led2
Pause 500/10
ENDIF
'Write 5, bat_mon ' Remove comment for test only
Until TMR0_INT_FLAG = 1 ' Until flow meter pulse counter overflows
PULSOUT close_valve,2000*2 ' Generate 20 msec pulse to RC4 to close valve
WRITE 11, TMR0_INT_FLAG ' Write TMR0 value..remove comment for test only
dummy = flush ' Clear mismatch condition
FLUSH_INT_FLAG = 0 ' Clear interrupt flag & enable RA3 on interrupt
TMR0_INT_FLAG = 0 ' Clear overflow flag
TMR0 = 256 - k ' Reload TMR0 to overflow after k counts
RESUME ' Resume Main Program
ENABLE
'-------{ End of Interrupt Handler }-----------------------------------------
' If the user program ends by getting to the last statement of the program
' at an END instruction, the MCU will SLEEP and await a wakeup.
END
Bookmarks