Non interrupt version;
Code:
@ device pic16F690, intrc_osc_noclkout, wdt_off, mclr_off, protect_off
K CON 15 ' Calibration factor for flow meter = # pulses per gal
' 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
' A/D & Comparators disabled
ANSEL=0 ' all digital
ANSELH=0 ' analog module disabled
CM1CON0=0
CM2CON0=0
' Port setup
PORTC = 0 ' LEDs off, PULSOUT RC3 provides a high-going pulse
PORTA = 0
TRISC = %11110000 ' lower 4 pins outputs
TRISA = %11111111 ' RA2 = TMR0 clock input for simulated meter pulse inputs
TMR0 = 0 ' clear TMR0 count
Main:
IF TMR0 < K THEN
' Keep the valve open...do nothing..let water flow
ELSE
TMR0 = 0 ' clear TMR0 count
PULSOUT PORTC.3,1000 ' Generate required 10 msec pulse to RC3
' WRITE 7, TMR0 ' write count if you need to?
HIGH PORTC.0 ' LED toggle stuff
PAUSE 500
LOW PORTC.0
ENDIF
GOTO Main
END
With DT interrupts; Note that now you need to use the MPASM
assembler & config settings for MPASM.
Code:
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF
INCLUDE "DT_INTS-14.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR0_INT, _FlusO_Matic, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
K CON 15 ' Calibration factor for flow meter = # pulses per gal
' 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
' A/D & Comparators disabled
ANSEL=0 ' all digital
ANSELH=0 ' analog module disabled
CM1CON0=0
CM2CON0=0
' Port setup
PORTC = 0 ' LEDs off, PULSOUT RC3 provides a high-going pulse
PORTA = 0
TRISC = %11110000 ' lower 4 pins outputs
TRISA = %11111111 ' RA2 = TMR0 clock input for simulated meter pulse inputs
TMR0 = 241 ' preload TMR0 to overflow after 15 counts
@ INT_ENABLE TMR0_INT ; enable TMR0 counter interrupt
Main:
PAUSE 1
GOTO Main
FlusO_Matic:
TMR0 = 241 ' reload TMR0 to overflow after 15 counts
PULSOUT PORTC.3,1000 ' Generate required 10 msec pulse to RC3
' WRITE 7, TMR0 ' write count if you need to?
@ INT_RETURN
END
Then of course, you can do pretty much the same by just watching the Timer0
interrupt flag;
Code:
@ device pic16F690, intrc_osc_noclkout, wdt_off, mclr_off, protect_off
K CON 15 ' Calibration factor for flow meter = # pulses per gal
' 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
' A/D & Comparators disabled
ANSEL=0 ' all digital
ANSELH=0 ' analog module disabled
CM1CON0=0
CM2CON0=0
' Port setup
PORTC = 0 ' LEDs off, PULSOUT RC3 provides a high-going pulse
PORTA = 0
TRISC = %11110000 ' lower 4 pins outputs
TRISA = %11111111 ' RA2 = TMR0 clock input for simulated meter pulse inputs
TMR0 = 241 ' preload TMR0 to overflow after 15 counts
TMRO_INT_FLAG VAR INTCON.2 ' Timer0 overflow flag bit
INTCON = 0 ' not using interrupts + clear Timer0 int flag
Main:
WHILE TMRO_INT_FLAG = 0
WEND
PULSOUT PORTC.3,1000 ' Generate required 10 msec pulse to RC3
' WRITE 7, TMR0 ' write count if you need to?
TMRO_INT_FLAG = 0 ' clear overflow flag
TMR0 = 241 ' reload TMR0 to overflow after 15 counts
GOTO Main
END
And, last, but not least, there's the old stand-by ON INTERRUPT;
Code:
@ device pic16F690, intrc_osc_noclkout, wdt_off, mclr_off, protect_off
K CON 15 ' Calibration factor for flow meter = # pulses per gal
' 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
' A/D & Comparators disabled
ANSEL=0 ' all digital
ANSELH=0 ' analog module disabled
CM1CON0=0
CM2CON0=0
' Port setup
PORTC = 0 ' LEDs off, PULSOUT RC3 provides a high-going pulse
PORTA = 0
TRISC = %11110000 ' lower 4 pins outputs
TRISA = %11111111 ' RA2 = TMR0 clock input for simulated meter pulse inputs
TMR0 = 241 ' preload TMR0 to overflow after 15 counts
TMRO_INT_FLAG VAR INTCON.2 ' Timer0 overflow flag bit
INTCON = %10100000 ' enable global & Timer0 interrupt
ON INTERRUPT GOTO FlushOMatic
Main:
PAUSE 1
GOTO Main
DISABLE
FlushOMatic:
PULSOUT PORTC.3,1000 ' Generate required 10 msec pulse to RC3
' WRITE 7, TMR0 ' write count if you need to?
TMRO_INT_FLAG = 0 ' clear overflow flag
TMR0 = 241 ' reload TMR0 to overflow after 15 counts
RESUME
ENABLE
END
All kept really simple & fairly easy to follow/modify...;o}
Bookmarks