here's one method using interrupt
Code:
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _LVP_OFF & _BODEN_ON
TRISB=%00000001 ' Set RB0 to input, others to output
OPTION_REG=0 ' Enable internal pull-up on PORTB
' Interrupt on falling edge of RB0
INTCON = %10010000 ' Enable global interrupt
' Enable RB0 interrupt
LED VAR PORTB.7 ' connected between RB7 and GND via resistor
ClkIn var PORTB.0 ' connected between RB0 and GND
INTF var INTCON.1 ' RB0 Interrupt flag
Apulse VAR BYTE ' store the amount of pulse
on interrupt goto CountPulses
led=0
apulse=0
start:
if apulse<10 then start
'
' Here we got the 10 pulses
'
INTCON = 0 ' disable all interrupt
led=1 ' enable the LED
'
Z: goto z ' stay here 'till next system reboot
disable
' //////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
CountPulses:
' //////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'
' Here is where the program jump every time the push-buton on
' RB0 is press.
'
apulse=apulse+1 ' add a count
while clkin=0 : wend ' wait untill the push button is release
pause 50 ' debounce time
intf=0 ' reset interupt flag
resume ' Get out of here
enable ' re-enable interrupt
without interupts but a loop.
Code:
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _LVP_OFF & _BODEN_ON
TRISB=%00000001 ' Set RB0 to input, others to output
OPTION_REG.7=0 ' Enable internal pull-up on PORTB
LED VAR PORTB.7 ' connected between RB7 and GND via resistor
ClkIn var PORTB.0 ' connected between RB0 and GND
Apulse VAR BYTE ' store the amount of pulse
led=0
apulse=0
repeat
if clkin=0 then
while clkin=0 : wend
pause 50
apulse=apulse+1
endif
until apulse=10
led=1
Here:
goto here
Using internal counter(TMR0) and polling TMR0 overflow flag and RA.4 as input instead of RB0
Code:
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _LVP_OFF & _BODEN_ON
TRISB=0 ' Set output to all i/o
TRISA=255 ' set input to all
OPTION_REG=%11111000 ' TMR0 clock source = RA4
' increment counter on high to low transistion
' prescaller assign to WDT
' prescaller rate 1:1
CMCON=7 ' disable analog comparator
INTCON = %00100000 ' enable TMR0 overflow interrupt
LED VAR PORTB.7 ' connected between RB7 and GND via resistor
T0IF var INTCON.2 ' TMR0 Interrupt flag
TMR0=246 ' pre-load TMR0 to have an Interrupt after 10 pulses
' TMR0 is a 8 byte Register so 246+10=256=interrupt
led=0
WHILE T0IF=0 : WEND
LED=1
Z: GOTO Z
Almost the same as above but polling only the TMR0 register
Code:
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _LVP_OFF & _BODEN_ON
TRISB=0 ' Set output to all i/o
TRISA=255 ' set input to all
OPTION_REG=%11111000 ' TMR0 clock source = RA4
' increment counter on high to low transistion
' prescaller assign to WDT
' prescaller rate 1:1
CMCON=7 ' disable analog comparator
INTCON = %00100000 ' enable TMR0 overflow interrupt
LED VAR PORTB.7 ' connected between RB7 and GND via resistor
TMR0=0
led=0
WHILE TMR0<10 : WEND
LED=1
Z: GOTO Z
I prefer the last one, produce really tight code and easy to understand BUT if the pulse come from a PUSH-Button it can glow the LED before 10 human press as it don't provide any debounce solution. BUT if you add a 0.1-1uF in parrallel, it seems to be enough to do the job. Don't forget the pull-up resistor on the RA.4 pin. Let's say 10K as a standard value
That should be more than enough to start
Bookmarks