Дилетантская точка зрения!
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Maxi 20 января 2004 г. 03:28
В ответ на: Так существуют стандарты для телефонных станций, длительность, скважность, дребезг в том числе, если делать грамотно, то взять требования и по ним писать прогу и тогда любой аппарат работать будет. отправлено Marik 20 января 2004 г. 00:35

Ни линии ни аппараты давно уже не соответствуют никаким стандартам. Поэтому в данном случае нужно все писать фактически изходя из реальных исследований всех доступных в поле зрения телефонов.


По делу:

В сях я не копенгаген, но чтоб не быть голословным привожу кусок надежного алгоритма определения номера пульсом или 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