Great! I'll give it a try.
Thanks a lot![]()
Great! I'll give it a try.
Thanks a lot![]()
Roger
Thanks again Richard
Code:'======= 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
Roger
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
Code: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
Last edited by richard; - 2nd January 2022 at 22:58.
Warning I'm not a teacher
Thanks for the tip, Richardps you can use case = "A" to make it more readable
Using a 16F630 for this project, I'm quite limited in program size.
I tried something like this too:
But, if I recall well, this code is around 80 words larger than the nested IF..THEN conditions.Code: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 = 3
And as far as I can remember, SELECT CASE is also quite word consuming. I'll still give it a try later...
Roger
The AND in the If statement is really memory hungry.
Ioannis
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/show...=2078#post2078
Ioannis
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.
other option is a if elseif chain , not sure anymore which used least ram,flashCode: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:
Last edited by richard; - 3rd January 2022 at 11:15.
Warning I'm not a teacher
Bookmarks