As for the LCD, I had the LCD hooked up. All of the decode works. Now, when the number is decoded, the isd25120 chip repeats the number entered. When the program initiates, the welcome statement plays when the user pushes any button. This prompts him to enter a password. The pic starts repeating the digits decoded after 5 digits have been input( for this I have no explanation why). Every tone decoded after is announced perfectly. That section of the code is after the password[c]. So I reason that the tone is being input into the array. When c = 8 the code should compare the array to the constants but it doesn't. It also doesn't play the error message. It allows about 7-8 more characters to be input and then starts over with the welcome message.
if password [0] <> "1" then user_password ' <-- Why isn't this "then error" ?
If password[0] doesn't equal "1", then I want the program to check codeword[0] to see if they equal.
goto play_menu_message ' <-- This is where the code gets to if the password was "12345678" Can you tell if the code ever gets here ?
As far as I can tell, The code never gets here.
if password [0] <> codeword [0] then error ' <-- The value of codeword[0] is undefined.
if password [1] <> codeword [1] then error ' <-- The value of codeword[1] is undefined etc.
These are undefined because in the play_menu_message the option is given to set this. I will post this section of the code. Here is the entire program:
@ 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
low select_dtmf
c = 0
e = 0
loop:
iF dtmf_ready = 0 Then loop ' Check for DTMF present, if none loop again
welcome:
portc = %00000000
pause 200
ce = 0
pause 200
ce = 1
begin:
if dtmf_ready = 0 then begin 'waits for number to be depressed
select_dtmf = 1 ' Enable the data output from the MT8870
Pause 1 ' Pause 1 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
select_dtmf = 0 ' Disable the MT8870 data output
reset = 0
reset = 1
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 200
ce = 0
pause 200
ce = 1
c = c + 1
if c <= 7 then begin
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
else
goto play_menu_message
endif
user_password:
if password [0] <> codeword [0] then error
if password [1] <> codeword [1] then error
if password [2] <> codeword [2] then error
if password [3] <> codeword [3] then error
if password [4] <> codeword [4] then error
if password [5] <> codeword [5] then error
if password [6] <> codeword [6] then error
if password [7] <> codeword [7] then error
goto play_menu_message
error:
e = e + 1
if e >= 2 then end_call
c = 0
portc = %00001000
pause 200
ce = 0
pause 200
ce = 1
goto begin
play_menu_message:
portc = %00010010
pause 200
ce = 0
pause 200
ce = 1
menu:
if dtmf_ready = 0 then menu'waits for number to be depressed
gosub GetDtmf 'gets number
If dtmf = "1" then set_password
else
goto play_menu_message:
endif
set_password:
c = 0
portc = %01100101
pause 20
gosub play 'play enter password message
hold:
if dtmf_ready = 0 then hold
gosub getdtmf
codeword[c] = dtmf
c = c + 1
if c =< 7 then hold
c = 0
portc = %11011010
pause 20
gosub play 'play re-enter password message
hold1:
if dtmf_ready = 0 then hold1
gosub getdtmf
codeword1[c]=dtmf
c = c + 1
if c =< 7 then hold1
if codeword[0] <> codeword1[0] then password_entry_error
if codeword[1] <> codeword1[1] then password_entry_error
if codeword[2] <> codeword1[2] then password_entry_error
if codeword[3] <> codeword1[3] then password_entry_error
if codeword[4] <> codeword1[4] then password_entry_error
if codeword[5] <> codeword1[5] then password_entry_error
if codeword[6] <> codeword1[6] then password_entry_error
if codeword[7] <> codeword1[7] then password_entry_error
password_correct:
portc = %01111110
pause 20
gosub play 'play password has been changed message
pause 3000
goto play_menu_message
password_entry_error:
portc = %01110101
pause 20
gosub play 'plays entries do not match
pause 3000
goto play_menu_message
end_call:
portc = %10010001
pause 20
gosub play'play finish message
goto start
play:
ce = 0
pause 200
ce = 1
return
GetDtmf:
select_dtmf = 1 ' Enable the data output from the MT8870
Pause 1 ' Pause 1 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_wait:
IF dtmf_ready = 0 Then dtmf_wait ' Loop here until DTMF signal stops
select_dtmf = 0 ' Disable the MT8870 data output
reset = 0
reset = 1
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
return




Bookmarks