here's one method using 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=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
Using internal counter(TMR0) and polling TMR0 overflow flag and RA.4 as input instead of RB0Code:@ __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
Almost the same as above but polling only the TMR0 registerCode:@ __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
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 valueCode:@ __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
That should be more than enough to start![]()




Bookmarks