PDA

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