|
Ни линии ни аппараты давно уже не соответствуют никаким стандартам. Поэтому в данном случае нужно все писать фактически изходя из реальных исследований всех доступных в поле зрения телефонов.
По делу:
В сях я не копенгаген, но чтоб не быть голословным привожу кусок надежного алгоритма определения номера пульсом или DTMF на асме PIC.
;пины
; portb,3 - строб от кт3170
; portb4-7 - данные кт3170.
;
; portb,0 - датчик линии для пульсового набора.
; кое какие макросы...
jnz macro k ; jmp on No Zero
btfss 3,2
goto k
endm
jz macro k ; jmp on Zero
btfsc 3,2
goto k
endm
jnb macro f1,f2,f3 ;
btfss f1,f2
goto f3
endm
jb macro f1,f2,f3 ;
btfsc f1,f2
goto f3
endm
;константы алгоритма
dialtimeout equ .4 ;время после которого цифр не ждем в секундах
dtmftimeout equ .20 ;dtmf время фиксации цифры в мсек
dtmfpause equ .40 ;dtmf ожидание паузы, в мсек.
pulsedrebezg equ .5 ;подавление антидребезга в мсек
pulsetimeout equ .200 ;детектор опускания трубки в мсек
pulsesave equ .150 ;детектор межцифровой паузы в мсек
;Счетчики - уменьшаются в перываниях пока не достигнут значения 0.
ms1xcnt equ 20h ;тик раз в 1мс
ms1cnt equ 21h ;тик раз в 1мс
ms100cnt equ 22h ;тик раз в 100мс
;ячейка где живет цифра
keys equ 23h
;позция в буфере
linepoz equ 24h
;сам буфер цифр
linebuf equ 30h ; 20h ячеек
;основной цикл проги...
main:
;Сдесь чего-нибудь инициализируем.
mloop0: movlw .100
movwf ms1cnt
mloop1:
;cдесь чего-то делаем....
jnb portb,0,mloop0
;truba snyata
movf ms1cnt,f
jnz mloop1
;100ms line on
movlw linebuf
movwf linepoz ; line buffer.
goto lineon
waitnokey: movlw dtmfpause
movwf ms1xcnt
mmkk1: jb portb,3,waitnokey
movf ms1xcnt,f
jnz mmkk1
return
;waiting for pulse or dtmf!
lineon: movlw dialtimeout*.10 ; global timeout
movwf ms100cnt
movlw dtmftimeout ; time DTMF DETECT.
movwf ms1xcnt
lineon0: movlw pulsedrebezg ; offline detect.
movwf ms1cnt
lineon1: movf linepoz,w ;
xorlw linebuf
jz skiptime ; не проверяем если нет цифры
movf ms100cnt,f
jz dial ;timeout цифр - номер набран
skiptime: jnb portb,3,nodtmf1 ;from kt3170
movf ms1xcnt,f
jnz nodtmf2
;detected 20ms pulse from DTMF reciver
swapf portb,w
andlw 0fh
movwf keys ;save dtmf code
call waitnokey ;wait release
goto storekey
nodtmf1: movlw dtmftimeout ;reset dtmf pulse data
movwf ms1xcnt
nodtmf2: jb portb,0,lineon0
movf ms1cnt,f
jnz lineon1
;starting offline mode (5ms no line)!
clrf keys ;pulse counter clear.
offstart: movlw pulsetimeout
movwf ms1xcnt ;timeout to exit in offline
offloop: movlw pulsedrebezg ;timeout offln.
movwf ms1cnt
offloop2: movf ms1xcnt,f
jz main ;долгий off - труба повешена.
jnb portb,0,offloop
movf ms1cnt,f
jnz offloop2
;starting online mode (5ms is on).
incf keys,f
;starting online mode!!
movlw pulsesave
movwf ms1xcnt
onloop: movlw pulsedrebezg
movwf ms1cnt
onloop2: movf ms1xcnt,f
jz storekey ;Долгий on - конец цифры.
jb portb,0,onloop
movf ms1cnt,f
jnz onloop2
;5ms offline.
goto offstart ;next pulse
;save pulse or dtmf!
storekey: movf keys,w
xorlw 0ah ; 10 > 0
skpnz
clrf keys
;в keys - циферка набранная с линии.
movf linepoz,w ;pozition
movwf fsr
xorlw linebuf+20h ; длинна буфера.
jz lineon ;
movf keys,w
movwf indf
incf linepoz,f
goto lineon
dial: ;сдесь весь номер набран
goto main
end
E-mail: info@telesys.ru