As I continued my debugging I found another problem in my below code that I initially thought was also a read-modify-write problem that Charles Leo at meLabs previously corrected me on. But on closer inspection I don't think so. I am including my current ISR code below and would appreciate any help from anyone in looking at it to see if you can see why RC2 (sol_valve) never goes high during the execution of this ISR, even though the code is setting it high. As you can see, I made sure that ANSEL = 0 and ANSELH = 0 at beginning of the ISR to make all PORTC digital and to be sure I don't have another "read-modify-write" problem as was previously pointed out to me by Charles Leo. Can't see why RC2 (sol_valve) will never go high even when the code directs it to. RC2 is connected to the + coil terminal of a DPDT single side stable non-latching relay and therefore the relay is never being triggered from the non-energized to energized state because RC2 is not going HIGH. Any ideas would be greatly appreciated?
Code:
'--------------------{ Begin Interrupt Handler }--------------------------
DISABLE ' Disable interrupts during interrupt handler
Int_handler:
'Initialize registers/ports upon Interrupt wakeup from Sleep
OPTION_REG.7 = 0 ' Enable PortA/PortB Pullups
WDTCON = %0001000 ' Turn WDT on for ops
' A/D & Comparators disabled
ANSEL=0 ' Set ports to digital I/O
ANSELH=0 ' Analog module disabled
CM1CON0=0 ' Disable comparators
CM2CON0=0
' PORT Settings
TRISA = %11111111 ' All PORTA pins to inputs...RA2& RA3 are used..
' RA2 as input clock to TMR0 overflow interrupt
' RA3 as input for sensing Flush switch closure
TRISB = %00000000 ' All PORTB pins to outputs..RB5 is used.
TRISC = %11100000 ' Set lower 5 pins of PortC as outputs....RC0,
' RC1, RC2, RC3 & RC4 are used.
PORTA = %00000000 ' PortA pins all set to Low
PORTC = %00000000 ' LEDs (RC0 and RC1) set to low
' Initialization of inputs/outputs
flush = 1 ' Init RA3 (flush) @ High value as flush interrupt
HS1 = 1 ' Init RA2 (HS1) at High for METER pulse overflow
' TMR0 clock input (RA2) for meter pulse inputs
ext_pwr = 0 ' Init RC3 at low value to turn off external power
sol_valve = 0 ' Init RC2 (sol_valve) at Low value
' Interrupts Settings
TMR0_Enable VAR INTCON.5 'Alias for On_Off switch of TMR0 counter
FLUSH_INT_FLAG VAR INTCON.0 'Alias RA3(FLUSH) On-change-inter. flag
TMR0_INT_FLAG VAR INTCON.2 'Alias Timer0 overflow flag bit
' Process this Interrupt
DEFINE WRITE_INT 1
IF FLUSH_INT_FLAG = 1 Then ' Interrupt was from RA3 on change
REPEAT
' Wait till the external Flush interrupt is at high level..
' this limits interrupt to switch closure only & not also
' for switch opening.
Until flush = 1
ext_Pwr = 1 ' Power on RL1 & external power during the
' Interrupt Service Routine (ISR). This puts
' power to RL1 & opens valve at same time.
Pause 40 ' Delay for 40 millisecs
ext_pwr = 0 ' Turn off power to RL1 & external power circuit.
PULSOUT LED_Red,2000*4 ' Blink RED LED 40 msec for valve open.
'Write 7, flush ' Write FLUSH value..remove comment for test only
Endif
' Valve is open and water is flowing...Measure flow meter output
TRISC.4 = 0 ' Make RC4 an output for HS_Pwr.
HS_Pwr = 1 ' Turn on power to HS1 & HS2 sensors.
TMR0_Enable = 1 ' Enable the TMR0 pulse counter for overflow interrupt
' Set registers for using A/D converter
' Set ADCON registers for A/D converter
ADCON0 = %10110101
' ADCON0.7 = ADFM = 1 ' 10-bit result is right justified
' ADCON0.6 = VCFG = 0 ' Set VREF+ to Vdd
' CHS<3:0> = 1101 ' Select 0.6V Ref channel
ADCON1 = %00110000 ' Select FRC as A/D conversion clock source
' Set FOSC=1MHz to stay inside recommended TAD range when not in SLEEP
OSCCON = %01000001
DEFine ADC_BITS 10
REPEAT ' Execute this loop while waiting for flow to reach 1.6 gallons.
' Flash Green flow light while water flowing till pulse counter overflow
LED_Grn = 1
Pause 125
LED_Grn = 0
Pause 500
' If Battery is low..flash battery monitor RED LED while water flowing
VRCON.4 = 1 ' Turn 0.6V reference ON
PAUSEUS 100 ' Allow VP6 to settle
ADCIN 13,ADINPUT ' Get VP6 analog reading (10-bit)
VRCON.4 = 0 ' Turn 0.6V reference OFF
'WRITE 11,ADINPUT
'A/D scale for 0.6 volts is 0.6 * 1024 Full Scale = 6138
VDD = 6138/ADINPUT ' convert input reading to Vdd voltage
' Vdd now holds the measured Vdd voltage * 10 (i.e., 3.4V = 34)
' The formula is the same for any Vdd voltage. Assume normal
' Vdd = +3.95vdc direct from fully charged battery pack input.
'WRITE 13,b0 ' Remove comments on Write statements for test only
'WRITE 14,b1
'Write 17,Vthr
IF Vdd <= Vthr THEN ' If Vdd less than or equal to 3.2v, blink the
LED_Red = 1 ' RED LED for warning to replace batteries.
PAUSE 125
LED_Red = 0
Pause 500
EndIF
Until TMR0_INT_FLAG = 1 ' Loop ends when pulse counter overflows
HS_Pwr = 0 ' Turn off power to HS1 & HS2 sensors.
ext_pwr = 1 ' Turn on power to RL1 & external power circuit.
HIGH sol_valve ' Generate 5 sec pulse on RC2 to RL1..close
Pause 5000
Low sol_valve
ext_pwr = 0 ' Turn off power to RL1 & external power circuit.
PULSOUT LED_Red,2000*4 ' Blink RED LED 40 msec for valve closed command
'WRITE 19, TMR0_INT_FLAG ' Write TMR0 value..remove comment for test
dummy = flush ' Clear mismatch condition
FLUSH_INT_FLAG = 0 ' Clear interrupt flag & enable RA3 on interr.
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