OK, this is what I came up for decoding rotary dialer. It reads and decodes the pulses and compares 3 digits from the EEPROM. If one has different needs just change the arrays accordingly.
Code:
clear
read 0,array[0],array[1],array[2] 'array holds the stored digits to compare.
INCLUDE "DT_INTS-14.bas" ' Base Interrupt System
INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts
'wsave var byte $20 system 'depends on the PIC used
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, _Timer1, PBP, yes
endm
INT_CREATE
ENDASM
@ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts
goto main
Timer1:
time=time+1 'Interrupt every 0,131msec for a 4MHz PIC clock
if time>7 then 'time resets every 0,8 sec approximately
time=0
endif
@ INT_RETURN
main:
digit[0]=0:digit[1]=0:digit[2]=0 'clear array every time it loops here
for i=0 to 2 'three digit counter. Change this for more
get_digit:
while !dial:pause 10:wend 'wait for dial rotation
get_next
time=0
while dial
if time>1 then main 'every digit takes around 10 ms. If times gets 1
wend 'then it sure timed out
digit[i]=digit[i]+1 'increment digit value
time=0 'reset time variable
while !dial 'wait for next high edge
if time>4 then next_digit 'if time is more than 500-600ms then
wend 'next digit has arrived
goto get_next
next_digit:
if digit[i]<>array[i] then error 'if digit and array are different then wrong number dialed
next i
high green:pause 1000:low green:goto main 'SUCCESS!
error:
high red:pause 1000:low red:goto main 'WRONG DIGITS!!!
end
Ioannis
Bookmarks