A little DTMF help


Closed Thread
Results 1 to 40 of 49

Hybrid View

  1. #1
    Join Date
    Feb 2006
    Posts
    89


    Did you find this post helpful? Yes | No

    Default Password theory

    Here was my logic (if you can call it that) for the password:

    In the beginning, I make an array (password[8])
    After the welcome message plays, the pic waits for a tone. Once it sees the tone, it is decoded and placed in "password[c]=dtmf", where c is initially "0".
    The program then advances c ( c = c + 1) and compares it to this statement "if c <= 7 then begin". Since c is only at 1, the program goes back up to wait for another tone. Once that tone is decoded, it places it in password[c], which this time is password[1] since c = 1. This goes on until all eight sections of the array are filled, in other words "c = 8". The program then goes to the next part of the program:

    if password [0] <> "1" then error
    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
    else
    goto play_menu_message
    endif

    each section of the array is compared to a hard coded value. If any of the single sections of the array fail the comparison, the program skips to the error routine. That is how it is supposed to work, however, at this point it doesn't work yet. Thanks for the advice.

    Travin

  2. #2
    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

  3. #3
    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

  4. #4
    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.

  5. #5
    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

  6. #6
    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 15:42.

  7. #7
    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 16:32.

Similar Threads

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