Quote Originally Posted by Joe S. View Post
You post your code in PDF format, and the only way anyone can test it is to retype it all over, no thanks.
I post the code from PDF.
Code:

    '16f84a

    Symbol OUT_PIN = PORTB.0            ' Output to solenoid RB0
    Symbol LED = PORTB.1                ' Control button to RB1
    Symbol CNTL_BUTTON = PORTB.7        ' Control button to RB7
    
    spacing var byte
    temp var byte
    
    TRISA = $FF
    TRISB = $FC                         ' RB0 and RB1 outputs, others input
    spacing = 15
    LED = 0
    temp = 1
    
    gosub wait_button
    
    LED = 1
    pause 2000                          ' Wait for two seconds
    if CNTL_BUTTON = 1 then spacing = 30: goto direct   ' If button is released before 2 secs
                                                        ' code goes directly into the default spacing
    temp = 0
    gosub wait_button                   ' If button is pressed more than 2 secs,
                                        ' it gets caught here and waits for release
    LED = 0
    pause 1000                          ' Wait for 100 ms
    
repeata:
    spacing = spacing + 5               ' Increase the spacing count by 2 every time
    toggle LED
    pause 1000
    toggle LED
    if spacing = 45 then spacing = 20   ' Till it reaches maximum and reset to minimum
    temp = 1
    gosub wait_button                   ' Access the push button state and repeat if short press
    pause 2000                          ' Delay for 2 seconds
    if CNTL_BUTTON = 1 then goto repeata
    LED = 1
    OUT_PIN = 0
'Calculate the value to be loaded into TMR0 for counting at RA4 connected to the encoder output
'Use a multiplier to convert the spacing in cm to number of pulses to count
'Say if the distance measuring wheel's dia is 40 cm then its circumference = 3.14*40 appr = 125 cm
'For one revolution ie 125 cm distance traveled = 500 pulse outputs of encoder
'Correspondingly 500/125 = 4 pulses/cm distance, therefore set the count as 255 - (spacing * 4)
direct:
    spacing = 255 - (spacing * 4)
    OPTION_REG = %00110000              ' TMR0 counter on falling edge of RA4
    'Cnt = 0                            ' Clear the event counter, Cnt
    ON INTERRUPT GOTO ISR               ' Interrupt service routine
    TMR0 = spacing
    OUT_PIN = 0
    INTCON = %10100000                  ' Enable TMR0 overflow interrupt
    
NXT:
    if OUT_PIN = 1 then
        pause 300
        OUT_PIN =0
    endif
    GOTO NXT                            ' Continue
    
'This is the interrupt service routine, ISR. The program jumps here whenever TMR0 overflow occurs
    DISABLE                             ' Disable interrupts
ISR:                                    ' Entry point of the ISR
    OUT_PIN = 1
    TMR0 = spacing
    INTCON = %10100000                  ' Enable TMR0 overflow interrupt
    RESUME                              ' Resume main program
    ENABLE                              ' Enable interrupts
    
wait_button:
    if CNTL_BUTTON && 1 = temp then wait_button
    return
    end