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.




Bookmarks