In my example of the PicBasic-manual there is an example for SELECT-CASE like this:
Example
SELECT CASE x
CASE 1
y = 10
CASE 2, 3
y = 20
CASE IS > 5
y = 100
CASE ELSE
y = 0
END SELECT
In my example of the PicBasic-manual there is an example for SELECT-CASE like this:
Example
SELECT CASE x
CASE 1
y = 10
CASE 2, 3
y = 20
CASE IS > 5
y = 100
CASE ELSE
y = 0
END SELECT
PBP 2.50C, MCS+ 3.0.0.5, MPLAB 8, MPASM 5.14, ASIX Presto, PoScope, mE mikroBasic V7.2, PICKIT2
So what you are saying is that portion of the code should look like this:
begin:
if dtmf_ready = 0 then begin 'waits for number to be depressed
gosub GetDtmf 'gets number
select case c 'places number in an array
case 0
dtmf = password [0]
case 1
dtmf = password [1]
case 2
dtmf = password [2]
case 3
dtmf = password [3]
case 4
dtmf = password [4]
case 5
dtmf = password [5]
case 6
dtmf = password [6]
case 7
dtmf = password [7]
end select
c = c + 1
if c =< 7 then begin
Is this what you are trying to say? Anyway I am going to try it. I guess I misuderstood what the example was telling me to do. Thanks for the help and suggestions.
Travin
...and smoother:
dtmf=password[c] (replaces the hole Setect-part)
or better:
password[c]=dtmf
this maybe will work as you expect....
PBP 2.50C, MCS+ 3.0.0.5, MPLAB 8, MPASM 5.14, ASIX Presto, PoScope, mE mikroBasic V7.2, PICKIT2
...and smoother:
dtmf=password[c] (replaces the hole Setect-part)
or better:
password[c]=dtmf
this maybe will work as you expect....
I am not quite sure what you are saying. Why did you put [c]? Are you just using c in place of numbers for the array? Thanks for the help
Travin
I haven't been able to get this thing to work. Maybe you smarter people can assist. Here is the gist: I call the phone and the welcome message asks for the password. The user then enters the password on the keypad. The password is 8 digits long. Everything works fine until this part, naturaly. For some reason, the program is not recognizing the password. Any help is appreciated. Using 16f876a with 20mhz and PBP
'____________________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
Start:
c = 0
e = 0
loop:
iF dtmf_ready = 0 Then loop ' Check for DTMF present, if none loop again
welcome:
portc = %00000000
pause 20
gosub play 'play welcome statement
begin:
if dtmf_ready = 0 then begin 'waits for number to be depressed
gosub GetDtmf 'gets number
select case c 'places number in an array
case 0
dtmf = password [0]
case 1
dtmf = password [1]
case 2
dtmf = password [2]
case 3
dtmf = password [3]
case 4
dtmf = password [4]
case 5
dtmf = password [5]
case 6
dtmf = password [6]
case 7
dtmf = password [7]
end select
c = c + 1
if c =< 7 then begin
if password [0] = "1" then
goto password1
else
goto user_password
endif
password1:
if password [1] = "2" then
goto password2
else
goto error
endif
password2:
if password [2] = "3" then
goto password3
else
goto error
endif
password3:
if password [3] = "4" then
goto password4
else
goto error
endif
password4:
if password [4] = "5" then
goto password5
else
goto error
endif
password5:
if password [5] = "6" then
goto password6
else
goto error
endif
password6:
if password [6] = "7" then
goto password7
else
goto error
endif
password7:
if password [7] = "8" then
goto play_menu_message
else
goto error
endif
play_menu_message:
portc = %00010010
gosub play 'play menu message
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
Travin,
For starters, in your Select Case section
change all the
dtmf = password [0], dtmf = password[1], etc
to
password[0] = dtmf, password[1]=dtmf, etc
otherwise you are setting the dtmf value you just converted to ASCII to some unknown value stored in your uninitialized password array.
Cheers,
Paul Borgmeier
Salt Lake City, Utah USA
www.cruxanalysis.com
I changed the format, as I had no idea that mattered. However, it still doesn't work. I know for sure that it is decoding the numbers, because it tells me what number is entered verbally. When I placed that section of the code after the select case for the password entry, it stopped telling me the values which leads me to believe the select case statement doesn't work for the passsword portion. Would it be easier if I didn't convert the data to ascii? Thanks for the help. Here is the code I have now if anyone feels like looking at it. Thanks for all the help.
@ 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
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:
High reset
pause 100
high ce
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 20
gosub play 'play welcome statement
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 Then dtmf_wait1 ' Loop here until DTMF signal stops
select_dtmf = 0 ' Disable the MT8870 data output
low reset
high reset
select case c 'places number in an array
case 0
password [0]=dtmf
case 1
password [1]=dtmf
case 2
password [2]=dtmf
case 3
password [3]=dtmf
case 4
password [4]=dtmf
case 5
password [5]=dtmf
case 6
password [6]=dtmf
case 7
password [7]=dtmf
end select
Select case dtmf
case "1"
portc = %10010111
pause 200
low ce
pause 200
High ce
case "2"
portc = %10011001
pause 200
low ce
pause 200
high ce
case "3"
portc = %10011011
pause 200
low ce
pause 200
high ce
case "4"
portc = %10011101
pause 200
low ce
pause 200
high ce
case "5"
portc = %10011111
pause 200
low ce
pause 200
high ce
case "6"
portc = %10100001
pause 200
low ce
pause 200
high ce
case "7"
portc = %10100011
pause 200
low ce
pause 200
high ce
case "8"
portc = %10100101
pause 200
low ce
pause 200
high ce
case "9"
portc = %10100111
pause 200
low ce
pause 200
high ce
case "0"
portc = %10101001
pause 200
low ce
pause 200
high ce
end select
c = c + 1
if c =< 7 then begin
if password [0] = "1" then
goto password1
else
goto user_password
endif
password1:
if password [1] = "2" then
goto password2
else
goto error
endif
password2:
if password [2] = "3" then
goto password3
else
goto error
endif
password3:
if password [3] = "4" then
goto password4
else
goto error
endif
password4:
if password [4] = "5" then
goto password5
else
goto error
endif
password5:
if password [5] = "6" then
goto password6
else
goto error
endif
password6:
if password [6] = "7" then
goto password7
else
goto error
endif
password7:
if password [7] = "8" then
goto play_menu_message
else
goto error
endif
Travin
Last edited by Travin77; - 22nd May 2006 at 21:01.
Bookmarks