A little DTMF help


Closed Thread
Results 1 to 40 of 49

Hybrid View

  1. #1
    Join Date
    May 2005
    Location
    San Diego, CA
    Posts
    8


    Did you find this post helpful? Yes | No

    Cool To pinpoint

    So I understand, does the following section play a sound for each number that is pressed? If so, does it work? Or is the problem before this section of code?

    Select case dtmf
    case "1"
    portc = %10010111
    case "2"
    portc = %10011001
    case "3"
    portc = %10011011
    case "4"
    portc = %10011101
    case "5"
    portc = %10011111
    case "6"
    portc = %10100001
    case "7"
    portc = %10100011
    case "8"
    portc = %10100101
    case "9"
    portc = %10100111
    case "0"
    portc = %10101001
    end select
    pause 200
    ce = 0
    pause 200
    ce = 1

  2. #2
    Join Date
    Feb 2006
    Posts
    89


    Did you find this post helpful? Yes | No

    Default Sorta

    Yes, those are the addresses for the individual number sounds on the isd25120.
    This section works sometimes, allow me to explain.

    I call the pic and the phone answers.
    I press any button and the welcome message plays.
    I start entering my password (1,2,3,4,5,6,7,8)
    On the first try, I do not have a verbal reply until after the number 5 is decoded. Everytime after it works like a champ. Then randomly, the welcome menu message plays. Once it plays, I enter the password again, this time I have a verbal response everytime. Once all eight numbers are entered, the program should play the menu message, but it doesn't happen. I just press a few more numbers and then we start all over at the welcome message. I am boggled. I thought it may be the power supply, but I have caps on the pic, the op amp (lm 741), and the dtmf decoder. I know all the sound recordings work as I wrote a program to verify that. I know the decode sequence works as well as I have checked this out as well. It is this damn password and array that seems to be the problem. Thanks.

    Travin

  3. #3
    Join Date
    May 2005
    Location
    San Diego, CA
    Posts
    8


    Did you find this post helpful? Yes | No

    Cool Array format

    Remove the spaces in your arrays and see if this changes anything.

    For example, change this (and others). . .

    if password [0] <> "1" then user_password
    if password [1] <> "2" then error
    if password [2] <> "3" then error
    if password [3] <> "4" then error
    if password [4] <> "5" then error
    if password [5] <> "6" then error
    if password [6] <> "7" then error
    if password [7] <> "8" then
    goto error


    to this. . .

    if password[0] <> "1" then user_password
    if password[1] <> "2" then error
    if password[2] <> "3" then error
    if password[3] <> "4" then error
    if password[4] <> "5" then error
    if password[5] <> "6" then error
    if password[6] <> "7" then error
    if password[7] <> "8" then
    goto error

    and also change this (and others). . .

    password var byte [8]
    codeword var byte [8]
    codeword1 var byte [8]


    to this . . .

    password var byte[8]
    codeword var byte[8]
    codeword1 var byte[8]

    I always thought that they had to be together without a space, but I could be wrong. Doesn’t hurt to try it.

    Let me know.

  4. #4
    Join Date
    Oct 2004
    Location
    Hangover, Germany
    Posts
    289


    Did you find this post helpful? Yes | No

    Arrow

    Just do some debugging !


    1. Put the speaking of the single digits in a subroutine.

    2. After collecting 8 digits, play each digit (with a pause!) through this subroutine in order to check the collected password.

    3. put some LEDs to the PIC in order to see the handshakes from your chips.

    4. fill the password by hardcoding:
    After collecting 8 digits insert:
    Password[0]="1"
    Password[1]="2"...

    I think, you are loosing digits, or there is some noise, so you get whorse digits.
    PBP 2.50C, MCS+ 3.0.0.5, MPLAB 8, MPASM 5.14, ASIX Presto, PoScope, mE mikroBasic V7.2, PICKIT2

  5. #5
    Join Date
    May 2005
    Location
    San Diego, CA
    Posts
    8


    Did you find this post helpful? Yes | No

    Cool Had a thought

    I had a thought, but over looked the lookup command
    Last edited by Wink; - 27th May 2006 at 16:42.

  6. #6
    Join Date
    Feb 2006
    Posts
    89


    Did you find this post helpful? Yes | No

    Default Interesting results

    I changed the loop at the beginning from its original to a repeat:until loop. This didn't change anything. So, I made a rountine that allows the entry of 8 digits to be input. It then speaks them back to me. They are sometimes different than what I pressed into the keypad. Most of the mistakes are duplicates. All things being equal, that still doesn't explain why the error message doesn't play in the normal program. I guess I need to "debounce" the input section of the code with the software, but I am not sure how. Any ideas other than a whole lot of pauses? Thanks for the help. Here is the code I used:

    @ device pic16F876A, hs_osc, wdt_on, lvp_off, protect_off
    include "MODEDEFS.BAS"
    define OSC 20
    adcon1=7
    trisa.0 = 1
    trisa.1 = 0
    trisa.2 = 0
    trisa.3 = 0
    trisb = %11111111
    trisc = %00000000


    '_________pic to mc145436a assignments______________________

    dtmf_ready VAR PORTA.0 'pin 12 (DV)
    select_dtmf VAR PORTA.1 'pin 3 (Enamble)
    reset VAR PORTA.2 'pin 5 (GT)
    DT0 VAR PORTB.4 'pin 2 (D1)
    DT1 VAR PORTB.5 'pin 1 (D2)
    DT2 VAR PORTB.6 'pin 14 (D4)
    DT3 VAR PORTB.3 'pin 13 (D8)
    ce var portA.3 'pin from isd chip
    '____________________variables____________________ ______

    dtmf VAR byte ' Stores most recent DTMF digit
    dtmf1 var byte
    password var byte [8]
    codeword var byte [8]
    codeword1 var byte [8]
    c var byte
    e var byte

    '___________________Initial Conditions__________________
    start:
    pause 100
    ce = 1
    reset = 1
    select_dtmf = 0
    c = 0
    e = 0

    loop:
    iF dtmf_ready = 1 Then
    goto welcome
    else
    goto loop
    endif
    welcome:
    portc = %00000000
    pause 20
    ce = 0
    pause 20
    ce = 1
    pause 2000
    c = 0
    repeat
    begin:
    if dtmf_ready = 0 then begin 'waits for number to be depressed
    select_dtmf = 1 ' Enable the data output from the MT8870
    Pause 10 ' Pause 100 mS to let data settle
    dtmf = 0
    IF DT0 = 1 Then 'Check Input port 0
    dtmf = dtmf + 1
    EndIF
    IF DT1 = 1 Then 'Check Input port 1
    dtmf = dtmf + 2
    EndIF
    IF DT2 = 1 Then 'Check Input port 2
    dtmf = dtmf + 4
    EndIF
    IF DT3 = 1 Then 'Check Input port 3
    dtmf = dtmf + 8
    EndIF
    LookUp dtmf,["_1234567890*#"],dtmf

    dtmf_wait1:
    IF dtmf_ready = 1 Then dtmf_wait1 ' Loop here until DTMF signal stops
    reset = 0
    PAUSEUS 30 ' Hold GT for > 18mS
    reset = 1
    select_dtmf = 0 ' Disable the MT8870 data output
    PAUSEUS 400 ' Allows time for DV transition

    password[c]=dtmf

    Select case dtmf
    case "1"
    portc = %10010111
    case "2"
    portc = %10011001
    case "3"
    portc = %10011011
    case "4"
    portc = %10011101
    case "5"
    portc = %10011111
    case "6"
    portc = %10100001
    case "7"
    portc = %10100011
    case "8"
    portc = %10100101
    case "9"
    portc = %10100111
    case "0"
    portc = %10101001
    end select
    pause 20
    ce = 0
    pause 20
    ce = 1
    c = c + 1
    until c > 7
    Select case password[0]
    case "1"
    portc = %10010111
    case "2"
    portc = %10011001
    case "3"
    portc = %10011011
    case "4"
    portc = %10011101
    case "5"
    portc = %10011111
    case "6"
    portc = %10100001
    case "7"
    portc = %10100011
    case "8"
    portc = %10100101
    case "9"
    portc = %10100111
    case "0"
    portc = %10101001
    end select
    pause 20
    ce = 0
    pause 20
    ce = 1
    pause 1500
    Select case password[1]
    case "1"
    portc = %10010111
    case "2"
    portc = %10011001
    case "3"
    portc = %10011011
    case "4"
    portc = %10011101
    case "5"
    portc = %10011111
    case "6"
    portc = %10100001
    case "7"
    portc = %10100011
    case "8"
    portc = %10100101
    case "9"
    portc = %10100111
    case "0"
    portc = %10101001
    end select
    pause 20
    ce = 0
    pause 20
    ce = 1
    pause 1500
    Select case password[2]
    case "1"
    portc = %10010111
    case "2"
    portc = %10011001
    case "3"
    portc = %10011011
    case "4"
    portc = %10011101
    case "5"
    portc = %10011111
    case "6"
    portc = %10100001
    case "7"
    portc = %10100011
    case "8"
    portc = %10100101
    case "9"
    portc = %10100111
    case "0"
    portc = %10101001
    end select
    pause 20
    ce = 0
    pause 20
    ce = 1
    pause 1500
    Select case password[3]
    case "1"
    portc = %10010111
    case "2"
    portc = %10011001
    case "3"
    portc = %10011011
    case "4"
    portc = %10011101
    case "5"
    portc = %10011111
    case "6"
    portc = %10100001
    case "7"
    portc = %10100011
    case "8"
    portc = %10100101
    case "9"
    portc = %10100111
    case "0"
    portc = %10101001
    end select
    pause 20
    ce = 0
    pause 20
    ce = 1
    pause 1500
    Select case password[4]
    case "1"
    portc = %10010111
    case "2"
    portc = %10011001
    case "3"
    portc = %10011011
    case "4"
    portc = %10011101
    case "5"
    portc = %10011111
    case "6"
    portc = %10100001
    case "7"
    portc = %10100011
    case "8"
    portc = %10100101
    case "9"
    portc = %10100111
    case "0"
    portc = %10101001
    end select
    pause 20
    ce = 0
    pause 20
    ce = 1
    pause 1500
    Select case password[5]
    case "1"
    portc = %10010111
    case "2"
    portc = %10011001
    case "3"
    portc = %10011011
    case "4"
    portc = %10011101
    case "5"
    portc = %10011111
    case "6"
    portc = %10100001
    case "7"
    portc = %10100011
    case "8"
    portc = %10100101
    case "9"
    portc = %10100111
    case "0"
    portc = %10101001
    end select
    pause 20
    ce = 0
    pause 20
    ce = 1
    pause 1500
    Select case password[6]
    case "1"
    portc = %10010111
    case "2"
    portc = %10011001
    case "3"
    portc = %10011011
    case "4"
    portc = %10011101
    case "5"
    portc = %10011111
    case "6"
    portc = %10100001
    case "7"
    portc = %10100011
    case "8"
    portc = %10100101
    case "9"
    portc = %10100111
    case "0"
    portc = %10101001
    end select
    pause 20
    ce = 0
    pause 20
    ce = 1
    pause 1500
    Select case password[7]
    case "1"
    portc = %10010111
    case "2"
    portc = %10011001
    case "3"
    portc = %10011011
    case "4"
    portc = %10011101
    case "5"
    portc = %10011111
    case "6"
    portc = %10100001
    case "7"
    portc = %10100011
    case "8"
    portc = %10100101
    case "9"
    portc = %10100111
    case "0"
    portc = %10101001
    end select
    pause 20
    ce = 0
    pause 20
    ce = 1
    pause 1500
    goto start

    Travin

    P.S. I also added another 1600ma 4.5v power source in parallel to make sure that power wasn't an issue.
    Last edited by Travin77; - 27th May 2006 at 17:32.

  7. #7
    Join Date
    Feb 2006
    Posts
    89


    Did you find this post helpful? Yes | No

    Default Cause of errors?

    If you hold the numbers depressed too long, the program puts the same number in the next array space. So, I am going to have to revisit the decode section. It is interesting that the dtmf chip is disabled at the time of data entry of the decoded number into the array. Also, only one verbal response plays.

    Travin

    No need to post a reply to myself. I debounced the software with a Pause 500 just before "until c > 7", and it worked like a champ. I tried several different pauses during tone entry and never had another repeat. So, thinking I had it solved, I placed the corrected code into the original code and whalla, the same problem. So, I guess the if then statements on the password section are bunk. It still won't play the error message if the entry is wrong, it won't go to the menu message if the entry is right, and it still starts over after pressing a random number of buttons on the phone after all eight digits of the password have been input.
    Last edited by Travin77; - 27th May 2006 at 18:22.

Similar Threads

  1. DTMF on a 12V car system
    By Jumper in forum Schematics
    Replies: 1
    Last Post: - 7th December 2008, 15:41
  2. DTMF output
    By din_kt in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 28th February 2008, 15:24
  3. DTMF Decoding?
    By muddy0409 in forum General
    Replies: 1
    Last Post: - 19th December 2007, 16:28
  4. Replies: 2
    Last Post: - 31st July 2006, 17:06
  5. Problems with DTMF Generatiom
    By Angus Anderson in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 30th May 2006, 22:12

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts