; Filename: DTMF_GEN.SRC
; Author: Stephen Holland
; Applications Engineer
; Scenix Semiconductor Inc.
; Revision: 1.0
; Date: July 05, 1998
; Part: SX28AC rev. 2.5
; Freq: 50Mhz
; Compiled using Parallax SX-Key software v0.8
;
; *This virtual peripheral relies on external RC filters to generate complete
; DTMF tones.
;
;
; The DTMF number string to be dialed is defined by the label _dialnum.
; Each key can be defined as an 8-bit hex value where the upper and
; lower nibbles repesent the keypad bitwise row and column ($RRRRCCCC).
;
; example: _dialnum dw $11,$21,$82,$42,$14,$12,$41,$42,$42,$42,$42,0
; represents the number 14083278888.
;
; Keypad
;
; 1209 1336 1477 1633
; ________________________________
; | | | | |
; 697 | $11 | $12 | $14 | $18 |
; | (1) | (2) | (3) | (A) |
; ________________________________
; | | | | |
; 770 | $21 | $22 | $24 | $28 |
; | (4) | (5) | (6) | (B) |
; ________________________________
; | | | | |
; 852 | $41 | $42 | $44 | $48 |
; | (7) | (8) | (9) | (C) |
; ________________________________
; | | | | |
; 941 | $81 | $82 | $84 | $88 |
; | (*) | (0) | (#) | (D) |
; ________________________________
;
;*************************************************************
; Device
;*************************************************************
device pins28,pages4,banks8,oschs
device turbo,stackx,optionx
id 'DTMF_GEN'
reset reset_entry
;*************************************************************
; Equates
;*************************************************************
pwm0_pin = rb.4
pwm1_pin = rb.5
;*************************************************************
; Variables
;*************************************************************
org 8
temp ds 1
string ds 1
;*************************************************************
; Bank 0 variables
;*************************************************************
org 10h
timers = $
;timer
timer_accl ds 1
timer_acch ds 1
timer_flag ds 1
;*************************************************************
; Bank 1 variables
;*************************************************************
org 30h
pwm = $
pwm_duty_1 ds 1
pwm_duty_1_buf ds 1
pwm_duty_2 ds 1
pwm_duty_2_buf ds 1
pwm_period_1 ds 1
pwm_period_1_buf ds 1
pwm_period_2 ds 1
pwm_period_2_buf ds 1
counter_low ds 1
counter_high ds 1
row ds 1
col ds 1
;*************************************************************
; Interrupt routine - virtual peripherals
;*************************************************************
org 0
interrupt ;3 it takes 3 cycles to get an interrupt
bank timers ;1
;timer
stc ;1 set carry
add timer_accl,#1 ;2 add timer_accl+carry(=1)
sc
jmp :timer_out
add timer_acch,#0
snc ;1
setb timer_flag.0 ;1
:timer_out ;=7
;*************************************************************
; D/A Conversions
;*************************************************************
da_conv bank pwm ;1
dec pwm_duty_1 ;1 decrement port_duty
movb pwm0_pin,/pwm_duty_1.7 ;4 move complement of most significant bit to output
dec pwm_duty_2 ;1 decrement port_duty
movb pwm1_pin,/pwm_duty_2.7 ;4 move complement of most significant bit to output
decsz pwm_period_1 ;1
jmp interrupt_out ;3
mov pwm_duty_1,#5 ;2
mov pwm_duty_2,#5 ;2
mov pwm_period_1,#9 ;2
make_dtmf
get_row
jb row.0,make697 ;4/6
jb row.1,make770 ;4/6
jb row.2,make852 ;4/6
jb row.3,make941 ;4/6
make697 csae counter_low,#end697 ;1 take new table value
jmp :continue ;1
mov counter_low,#sine697 ;1 reload table-counter
:continue mov w,counter_low ;1
mov m,#6 ;1 set page
iread ;1 get table_data
mov m,#$F ;1
mov pwm_duty_1,w ;1
inc counter_low ;1
jmp get_col
make770 csae counter_low,#end770 ;1 take new table value
jmp :continue ;1
mov counter_low,#sine770 ;1 reload table-counter
:continue mov w,counter_low ;1
mov m,#6 ;1 set page
iread ;1 get table_data
mov m,#$F ;1
mov pwm_duty_1,w ;1
inc counter_low ;1
jmp get_col
make852 csae counter_low,#end852 ;1 take new table value
jmp :continue ;1
mov counter_low,#sine852 ;1 reload table-counter
:continue mov w,counter_low ;1
mov m,#6 ;1 set page
iread ;1 get table_data
mov m,#$F ;1
mov pwm_duty_1,w ;1
inc counter_low ;1
jmp get_col
make941 csae counter_low,#end941 ;1 take new table value
jmp :continue ;1
mov counter_low,#sine941 ;1 reload table-counter
:continue mov w,counter_low ;1
mov m,#6 ;1 set page
iread ;1 get table_data
mov m,#$F ;1
mov pwm_duty_1,w ;1
inc counter_low ;1
get_col
jb col.0,make1209 ;4/6
jb col.1,make1336 ;4/6
jb col.2,make1477 ;4/6
jb col.3,make1633 ;4/6
make1209 csae counter_high,#end1200 ;1 take new table value
jmp :continue ;1
mov counter_high,#sine1200 ;1 reload table-counter
:continue mov w,counter_high ;1
mov m,#6 ;1 set page
iread ;1 get table_data
mov m,#$F ;1
mov pwm_duty_2,w ;1 = 21
inc counter_high ;1
jmp da_out
make1336 csae counter_high,#end1336 ;1 take new table value
jmp :continue ;1
mov counter_high,#sine1336 ;1 reload table-counter
:continue mov w,counter_high ;1
mov m,#6 ;1 set page
iread ;1 get table_data
mov m,#$F ;1
mov pwm_duty_2,w ;1 = 21
inc counter_high ;1
jmp da_out
make1477 csae counter_high,#end1477 ;1 take new table value
jmp :continue ;1
mov counter_high,#sine1477 ;1 reload table-counter
:continue mov w,counter_high ;1
mov m,#7 ;1 set page
iread ;1 get table_data
mov m,#$F ;1
mov pwm_duty_2,w ;1 = 21
inc counter_high ;1
jmp da_out
make1633 csae counter_high,#end1633 ;1 take new table value
jmp :continue ;1
mov counter_high,#sine1633 ;1 reload table-counter
:continue mov w,counter_high ;1
mov m,#7 ;1 set page
iread ;1 get table_data
mov m,#$F ;1
mov pwm_duty_2,w ;1 = 21
inc counter_high ;1
da_out
interrupt_out mov w,#-163 ;1 ;interrupt every 159 clocks
retiw ;3
;*************************************************************
; Reset entry
;*************************************************************
reset_entry mov !ra,#%0000 ;set ra data direction register
mov !rb,#%00110000 ;set rb data direction register
mov m,#$F
clr fsr ;reset all ram banks
:loop setb fsr.4
clr ind
ijnz fsr,:loop
bank pwm
mov pwm_period_1,#9 ;set initial periods
mov pwm_period_2,#9
mov pwm_duty_1,#5 ;set initial duty cycles
mov pwm_duty_2,#5
mov !option,#%10011111 ;enable rtcc interrupt
;*************************************************************
; Main
;*************************************************************
main_loop
mov w,#_dialnum ;send phone number string
page DTMF_generation
call DTMF_generation
here jmp here
jmp main_loop
;*************************************************************
; Subroutines
;*************************************************************
org $200
;*************************************************************
; Jump table for page 1
;*************************************************************
DTMF_generation
jmp DTMF_generation_jump
DTMF_generation_jump_out
retp
;*************************************************************
DTMF_generation_jump
mov string,w ;send string at w
loop
mov w,string ;read chr at w
mov m,#1
iread
mov m,#$F
test w ;if 0, exit
snz
jmp DTMF_generation_jump_out
bank pwm
mov temp,w
and w,#$0f ;Keep only the lower 4 bits
mov col,w ;This is the column
swap temp
mov w,temp
and w,#$0f ;Keep only the lower 4 bits
mov row,w ;This is the row
setb ra.3 ;Enable output
mov m,#$F
mov !rb,#%00000000 ;1 Enable PWM outputs
bank timers ;Send tone for 300ms
mov !option,#%11011111 ;disable rtcc interrupt
mov timer_accl,#$ff ;100mS
mov timer_acch,#$0f ;--//--
mov !option,#%10011111 ;enable rtcc interrupt
clrb timer_flag.0 ;Clear overflow-flag
jnb timer_flag.0,$ ;Is overflow-flag set?
bank timers
mov !option,#%11011111 ;disable rtcc interrupt
mov timer_accl,#$ff ;100mS
mov timer_acch,#$0f ;--//--
mov !option,#%10011111 ;enable rtcc interrupt
clrb timer_flag.0 ;Clear overflow-flag
jnb timer_flag.0,$ ;Is overflow-flag set?
bank timers
mov !option,#%11011111 ;disable rtcc interrupt
mov timer_accl,#$ff ;100mS
mov timer_acch,#$0f ;--//--
mov !option,#%10011111 ;enable rtcc interrupt
clrb timer_flag.0 ;Clear overflow-flag
jnb timer_flag.0,$ ;Is overflow-flag set?
:interdigit inc string ;next chr
clrb ra.3 ;Disable output
mov m,#$0f
mov !rb,#%00110000 ;1 Disable PWM outputs
bank timers ;Send tone for 100ms
mov !option,#%11011111 ;disable rtcc interrupt
mov timer_accl,#$ff ;50mS
mov timer_acch,#$7f ;--//--
mov !option,#%10011111 ;enable rtcc interrupt
clrb timer_flag.0 ;Clear overflow-flag
jnb timer_flag.0,$ ;Is overflow-flag set?
jmp loop
;*************************************************************
; Data
;*************************************************************
org $1a0
_dialnum dw $22,0
org $600
sine697 = $
dw 5 ; 1
dw 6 ; 2
dw 7 ; 3
dw 7 ; 4
dw 8 ; 5
dw 8 ; 6
dw 8 ; 7
dw 8 ; 8
dw 9 ; 9
dw 9 ;10
dw 9 ;11
dw 9 ;12
dw 9 ;13
dw 9 ;14
dw 9 ;15
dw 9 ;16
dw 9 ;17
dw 8 ;18
dw 8 ;19
dw 8 ;20
dw 8 ;21
dw 7 ;22
dw 7 ;23
dw 6 ;24
dw 5 ;25
dw 4 ;26
dw 3 ;27
dw 2 ;28
dw 2 ;29
dw 2 ;30
dw 1 ;31
dw 1 ;32
dw 1 ;33
dw 1 ;34
dw 0 ;35
dw 0 ;36
dw 0 ;37
dw 0 ;38
dw 0 ;39
dw 0 ;40
dw 0 ;41
dw 1 ;42
dw 1 ;43
dw 1 ;44
dw 1 ;45
dw 2 ;46
dw 2 ;47
dw 3 ;48
end697 = $
dw 4 ;49
sine770 = $
dw 5 ; 1
dw 6 ; 2
dw 7 ; 3
dw 7 ; 4
dw 7 ; 5
dw 8 ; 6
dw 8 ; 7
dw 8 ; 8
dw 9 ; 9
dw 9 ;10
dw 9 ;11
dw 9 ;12
dw 9 ;13
dw 8 ;14
dw 8 ;15
dw 8 ;16
dw 7 ;17
dw 7 ;18
dw 7 ;19
dw 6 ;20
dw 5 ;21
dw 4 ;22
dw 3 ;23
dw 2 ;24
dw 2 ;25
dw 2 ;26
dw 1 ;27
dw 1 ;28
dw 1 ;29
dw 1 ;30
dw 0 ;31
dw 0 ;32
dw 0 ;33
dw 0 ;34
dw 0 ;35
dw 0 ;36
dw 1 ;37
dw 1 ;38
dw 1 ;39
dw 1 ;40
dw 2 ;41
dw 2 ;42
dw 3 ;43
end770 = $
dw 4 ;44
sine852 = $
dw 5 ; 1
dw 6 ; 2
dw 7 ; 3
dw 7 ; 4
dw 7 ; 5
dw 8 ; 6
dw 8 ; 7
dw 8 ; 8
dw 9 ; 9
dw 9 ;10
dw 9 ;11
dw 9 ;12
dw 9 ;13
dw 8 ;14
dw 8 ;15
dw 8 ;16
dw 7 ;17
dw 7 ;18
dw 7 ;19
dw 6 ;20
dw 5 ;21
dw 4 ;22
dw 3 ;23
dw 2 ;24
dw 2 ;25
dw 2 ;26
dw 1 ;27
dw 1 ;28
dw 1 ;29
dw 0 ;30
dw 0 ;31
dw 0 ;32
dw 0 ;33
dw 0 ;34
dw 1 ;35
dw 1 ;36
dw 1 ;37
dw 2 ;38
dw 2 ;39
dw 3 ;40
end852 = $
dw 4 ;41
sine941 = $
dw 5 ; 1
dw 6 ; 2
dw 7 ; 3
dw 7 ; 4
dw 8 ; 5
dw 8 ; 6
dw 8 ; 7
dw 9 ; 8
dw 9 ; 9
dw 9 ;10
dw 9 ;11
dw 8 ;12
dw 8 ;13
dw 8 ;14
dw 7 ;15
dw 7 ;16
dw 6 ;17
dw 5 ;18
dw 4 ;19
dw 3 ;20
dw 2 ;21
dw 2 ;22
dw 1 ;23
dw 1 ;24
dw 1 ;25
dw 0 ;26
dw 0 ;27
dw 0 ;28
dw 0 ;29
dw 0 ;30
dw 1 ;31
dw 1 ;32
dw 1 ;33
dw 2 ;34
dw 2 ;35
dw 3 ;36
end941 = $
dw 4 ;37
sine1200 = $
dw 5 ; 1
dw 7 ; 2
dw 8 ; 3
dw 8 ; 4
dw 9 ; 5
dw 9 ; 6
dw 10 ; 7
dw 9 ; 8
dw 9 ; 9
dw 8 ;10
dw 8 ;11
dw 7 ;12
dw 6 ;13
dw 5 ;14
dw 4 ;15
dw 3 ;16
dw 2 ;17
dw 1 ;18
dw 1 ;19
dw 0 ;20
dw 0 ;21
dw 0 ;22
dw 0 ;23
dw 0 ;24
dw 1 ;25
dw 1 ;26
dw 2 ;27
dw 3 ;28
end1200 = $
dw 4 ;29
sine1336 = $
dw 5 ; 1
dw 7 ; 2
dw 8 ; 3
dw 8 ; 4
dw 9 ; 5
dw 9 ; 6
dw 9 ; 7
dw 9 ; 8
dw 8 ; 9
dw 8 ;10
dw 7 ;11
dw 6 ;12
dw 5 ;13
dw 3 ;14
dw 2 ;15
dw 1 ;16
dw 1 ;17
dw 0 ;18
dw 0 ;19
dw 0 ;20
dw 0 ;21
dw 1 ;22
dw 1 ;23
dw 2 ;24
dw 3 ;25
end1336 = $
dw 4 ;26
org $700
sine1477 = $
dw 5 ; 1
dw 7 ; 2
dw 8 ; 3
dw 8 ; 4
dw 9 ; 5
dw 9 ; 6
dw 9 ; 7
dw 8 ; 8
dw 8 ; 9
dw 7 ;10
dw 6 ;11
dw 5 ;12
dw 3 ;13
dw 2 ;14
dw 1 ;15
dw 1 ;16
dw 0 ;17
dw 0 ;18
dw 0 ;19
dw 0 ;20
dw 1 ;21
dw 2 ;22
dw 3 ;23
end1477 = $
dw 4 ;24
sine1633 = $
dw 5 ; 1
dw 7 ; 2
dw 8 ; 3
dw 8 ; 4
dw 9 ; 5
dw 9 ; 6
dw 9 ; 7
dw 8 ; 8
dw 7 ; 9
dw 6 ;10
dw 5 ;11
dw 3 ;12
dw 2 ;13
dw 1 ;14
dw 1 ;15
dw 0 ;16
dw 0 ;17
dw 0 ;18
dw 1 ;19
dw 2 ;20
dw 3 ;21
end1633 = $
dw 4 ;22
file: /Techref/scenix/lib/io/osi1/dfs/dtmf.src, 13KB, , updated: 1999/2/20 12:23, local time: 2024/11/20 00:15,
|
| ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://linistepper.com/techref/scenix/lib/io/osi1/dfs/dtmf.src"> scenix lib io osi1 dfs dtmf</A> |
Did you find what you needed?
|