View Full Version : "WAIT" modifier with multiple choices - how to?
flotulopex
- 1st January 2022, 18:47
Hi There,
I'm wondering if it is possible to "WAIT" for more than only one condition at the time in DEBUGIN/SERIN2.
I usually write something like this:
START:
DEBUGIN 1000,START,[WAIT("first")]
....
I'd like to wait for more than the word "first" but also for "second" and "third".
But how?
Ioannis
- 1st January 2022, 22:18
Yes you can. But maybe you can give an example of what you want?
Ioannis
flotulopex
- 2nd January 2022, 04:59
My circuit has a serial data receiver; it "waits" for three different sets of characters (= commands) to perform different actions, one at the time.
If "READ" is received, it will do this; if "WRITE" is received, it will do that and so for the third command, "COPY".
Voilą how I imagine it should be working (this is obviously not the actual code, just the idea of what it should be doing):
START:
DEBUGIN 1000,START,[WAIT("READ" OR "WRITE" OR "COPY")]
IF "READ" DO...
IF "WRITE" DO...
IF "COPY" DO...
....
I need to "wait" for either incoming command but there's where I'm stuck in the DEBUGIN/SERIN2 timeout loop.
Due to my lack of knowledge, I have to make my circuit currently doing only one thing...frustrating :o
mpgmike
- 2nd January 2022, 07:47
My approach would be to just receive whatever comes in, then parse it later.
richard
- 2nd January 2022, 08:04
My approach would be to just receive whatever comes in, then parse it later.
+ 1
though life would be easier if
"READ" became "*READ/n" ditto for the others {/n=chr 13
buff var byte[5]
DEBUGIN 1000,START,[WAIT("*" str buff\5\13]
then see what you got
flotulopex
- 2nd January 2022, 14:15
Great! I'll give it a try.
Thanks a lot :wink:
flotulopex
- 2nd January 2022, 18:55
Thanks again Richard :smile:
'======= VARIABLES ================================================== ==============================
InString VAR BYTE[3]
LED VAR RC2
Counter VAR BYTE
Blinks VAR BYTE
'======= INITIALIZE VARIABLES ================================================== ===================
InString[0] = 0
InString[1] = 0
InString[2] = 0
LED = 0
Counter = 0
Blinks = 0
'======= PROGRAM ================================================== ================================
' Wait for strings:
' *AAA# = 1 blink
' *BBB# = 2 blinks
' *CCC# = 3 blinks
START:
Blinks = 0
DEBUGIN 1000,START,[WAIT("*"), STR InString\3\35] ' InString starts with "*" and ends with "#"
if InString[0] = 65 then
if InString[1] = 65 then
if InString[2] = 65 then
Blinks = 1
ENDIF
ENDIF
ENDIF
if InString[0] = 66 then
if InString[1] = 66 then
if InString[2] = 66 then
Blinks = 2
ENDIF
ENDIF
ENDIF
if InString[0] = 67 then
if InString[1] = 67 then
if InString[2] = 67 then
Blinks = 3
ENDIF
ENDIF
ENDIF
BLINK:
FOR Counter = 1 to Blinks
LED = 1
PAUSE 500
LED = 0
PAUSE 500
NEXT Counter
GOTO START
END
richard
- 2nd January 2022, 21:54
that will do it roger
this might be a little bit faster as only one value of instring[0] can ever be true at any one time
select case InString[0]
case = 65 ; ps you can use case = "A" to make it more readable
if InString[1] = 65 then
if InString[2] = 65 then
Blinks = 1
ENDIF
ENDIF
case 66
if InString[1] = 66 then
if InString[2] = 66 then
Blinks = 2
ENDIF
ENDIF
case 67
if InString[1] = 67 then
if InString[2] = 67 then
Blinks = 3
ENDIF
ENDIF
END select
flotulopex
- 3rd January 2022, 06:50
ps you can use case = "A" to make it more readable
Thanks for the tip, Richard :wink:
Using a 16F630 for this project, I'm quite limited in program size.
I tried something like this too:
IF InString[0] = 65 AND InString[1] = 65 AND InString[2] = 65 THEN Blinks = 1
IF InString[0] = 66 AND InString[1] = 66 AND InString[2] = 66 THEN Blinks = 2
IF InString[0] = 67 AND InString[1] = 67 AND InString[2] = 67 THEN Blinks = 3But, if I recall well, this code is around 80 words larger than the nested IF..THEN conditions.
And as far as I can remember, SELECT CASE is also quite word consuming. I'll still give it a try later...
Ioannis
- 3rd January 2022, 08:25
The AND in the If statement is really memory hungry.
Ioannis
Ioannis
- 3rd January 2022, 08:50
Long ago, our member Melanie posted this great test program parsing strings and executing commands from a terminal through serial port, with no interrupts in a fast closed loop. It had great structure and expanding possibilities.
Have a look here for the comms1.bas program: http://www.picbasic.co.uk/forum/showthread.php?t=573&p=2078#post2078
Ioannis
richard
- 3rd January 2022, 10:08
also, might need a real chip though. 64 bytes for serial work is a challenge
16f1825 or 16f18326 vs 16f630 price difference trivial performance and resources difference enormous , just saying.
an asm routine can do a string compare much more efficiently if you have a chip with two fsr's but the old clunkers
don't have that either. its a difficult path with meagre resources.
all good fun though.
InString VAR BYTE[4]
InString[3]=1
ARRAYREAD InString, 4, ncb, [WAIT ("AAA"),Blinks]
goto ncx
ncb:
InString[3]=2
ARRAYREAD InString, 4, ncc, [WAIT ("BBB"),Blinks]
goto ncx
ncc:
InString[3]=3
ARRAYREAD InString, 4, ncd, [WAIT ("CCC"),Blinks]
goto ncx
ncd:
Blinks=0
ncx:
other option is a if elseif chain , not sure anymore which used least ram,flash
Powered by vBulletin® Version 4.1.7 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.