View Full Version : Old classic If-Then...
Ioannis
- 31st October 2008, 21:58
I got a little confussed on this nested If-Then:
if level<=high_level then
if thermiko1=0 then
if thermistor1=0 then
if auto1=0 then
if onboard_an2<=pres_limit then
if pump=0 then
module_rel_out=1
else
module_rel_out=0
endif
endif
endif
endif
endif
endif
does make module_rel_out=1 but does not makes it 0 if the conditions (one or more) are not met.
I am missing something but cannot figure what...
Any help appreciated.
Ioannis
Tobias
- 31st October 2008, 22:20
You need to insert the ELSE statement for each IF. For example, if the first IF is not true, the code never gets to the ELSE ...=0
mister_e
- 31st October 2008, 23:49
to execute this part...
if pump=0 then
module_rel_out=1
else
module_rel_out=0
endif
ALL previous conditions have to be met.
Melanie
- 1st November 2008, 01:56
Simply pre-load the ELSE condition into the variable before entering the IF loop...
module_rel_out=0
if level<=high_level then
if thermiko1=0 then
if thermistor1=0 then
if auto1=0 then
if onboard_an2<=pres_limit then
if pump=0 then module_rel_out=1
endif
endif
endif
endif
endif
Acetronics2
- 1st November 2008, 09:58
Hi, Ioannis
Why not use an AND combination of your conditions.
Karnaugh would LOVE your example.
Try this little soft ... and ENJOY.
Karnaugh Minimizer 2.0
Copyright (c) 2002-2007 ShurikSoft.
http://www.shuriksoft.com
Alain
Ioannis
- 1st November 2008, 11:37
Hi all and thanks for the replies.
Alain: I tried with AND but got an error of too many variables. Indeed was long line!
Melanie: That was what I did just before reading your post. Yes this works but was not appealing to me as an elegant solution.
Steve & Tobias: Yes,I see now, after the morning cup of coffee that it never reached the ELSE statement.
Thanks again to all.
Ioannis
Acetronics2
- 1st November 2008, 14:15
Hi Ioannis
I do not Understand you ...
'Essai 16F84 Random
DEFINE LCD_EBIT 1 ' Other LCD pins are same as Manual - Holy Manual - my sweet Manual ...
' DEFINE LCD_DREG PORTB ' I/O port where LCD is connected
' DEFINE LCD_DBIT 0
' DEFINE LCD_RSREG PORTB
' DEFINE LCD_RSBIT 4 ' Register select pin
' DEFINE LCD_EREG PORTB
' DEFINE LCD_EBIT 5 ' Enable pin
' DEFINE LCD_BITS 4 ' 4-bit data bus
' DEFINE LCD_LINES 2 ' LCD has 2 character lines
DEFINE OSC 4
@ __config _XT_OSC & _WDT_ON & _CP_OFF
'************************************************* ****************************
'Variables
Level var Word
High_Level var Word
Onboard_an2 var Word
PressLimit var Word
Auto1 var Bit
Thermikol var Bit
Thermistor1 var Bit
Pump var Bit
LevelOk var Bit
PressOk var Bit
module_rel_out var Portb.7
'************************************************* ****************************
'Constantes
'************************************************* ****************************
'Preset
CLEAR
PORTA = 0
PORTB = 0
TRISA = 0
TRISB = 0
High_Level = 40000
Level = 0
Thermikol = 1
Thermistor1 = 1
Onboard_an2 = 500
PressLimit = 35000
Auto1 = 1
Pump = 0
PAUSE 500
LCDOUT $FE,1
RANDOM Level
RANDOM Onboard_An2
Loop:
RANDOM Level
RANDOM Onboard_An2
IF (level <= high_Level) THEN
PORTB.5 = 1
ELSE
PORTB.5 = 0
ENDIF
IF ( onboard_an2 <= PressLimit ) THEN
PORTB.6 = 1
ELSE
PORTB.6 = 0
ENDIF
Module_rel_out = (level <= high_Level) && Thermikol && Thermistor1 && Auto1 && ( onboard_an2 <= PressLimit ) && !Pump
LCDOUT $FE,2,# Module_Rel_Out ," ",DEC5 Level ," ",DEC5 Onboard_an2 ," "
LCDOUT $FE,$C0,"out", DEC5 High_Level, " ", DEC5 Presslimit
PAUSE 300
IF Module_rel_out THEN PAUSE 500
GOTO Loop
END
As you see ... I played somewhat with my Personnal Testboard to verify everything was running fine ...
And it runs fine !!!
"your" line is here :
Module_rel_out = (level <= high_Level) && Thermikol && Thermistor1 && Auto1 && ( onboard_an2 <= PressLimit ) && !Pump
...
Value Comparisons or logic levels have equal behaviour here ...
Cheers ...
Alain
Ioannis
- 1st November 2008, 15:13
Hi Alain.
On the following if I try to put the second if-then inside the logic expression, I get an "Temp variables exceeding T4" error in MPASM assembler.
This compiles OK:
if pump=0 and (thermistor1=1 or thermiko1=1 or onboard_an2>(pres_limit+10)) then
module_rel_out.0=0
endif
if level>stop_level then
if pump=0 then
module_rel_out.0=0
endif
endif
This produces the above error:
if pump=0 and (thermistor1=1 or thermiko1=1 or onboard_an2>(pres_limit+10) or level>stop_level) then
module_rel_out.0=0
endif
Thanks,
Ioannis
Acetronics2
- 1st November 2008, 15:18
Hi, Ioannis
Do not use " IF thermistor1 = 1" but "IF Thermistor" ... result is the same
Do not use " IF thermistor1 = 0 " but "IF NOT Thermistor" ... result is the same
Alain
Acetronics2
- 1st November 2008, 15:56
if (pump=0) and ( thermistor1 or thermiko1 or ( onboard_an2>(pres_limit + 10))) then
module_rel_out.0=0
endif
if (level>stop_level) then
if pump=0 then
module_rel_out.0=0
endif
endif
Compile fine
BUUUUUUT ... I do think you should make your Karnaugh Table ( Table of states ) "a bit" clearer ... might help a lot ( lol )
Alain
Alain
Archangel
- 1st November 2008, 20:17
Thanks Alain,
For
RANDOM Level
RANDOM Onboard_An2
It gives me a new test tool, never could see a use for that command before. Sometimes it's not the main point of your posting that benefits others, sometimes it's the little things that you use everyday.
Archangel
- 1st November 2008, 20:21
Hi, Ioannis
Do not use " IF thermistor1 = 1" but "IF Thermistor" ... result is the same
Do not use " IF thermistor1 = 0 " but "IF NOT Thermistor" ... result is the same
Alain Could you please explain a little more, so I can understand why ?
Thank You
mister_e
- 1st November 2008, 20:38
I understand why.. the problem is to explain... enjoy the following language barrier mess :D
If ConditionIsTrue Then DoSomething
Dealing with Bit Var, you have ONLY 2 choices... OR the var is 1 OR the var 0, True or False.
So why messing with condition if your variable already hold it?
It's just another way to write your IF-THEN
Darrel Taylor
- 1st November 2008, 21:47
I get an "Temp variables exceeding T4" error in MPASM assembler.
Hi Ioannis,
That error is comming from ReEnterPBP.bas
There's no way for it to know if the complex formula/IF statement is in the main program or the interrupt handler. And if it's in the handler, it will end up overwriting PBP's system vars.
If you know for sure that the offending statements are NOT in the handler. You can open the ReEnterPBP.bas file and comment the error line.
ifdef T5
; ERROR "Temp variables exceeding T4"
endif
HTH,
Archangel
- 2nd November 2008, 08:18
Hi Ioannis,
That error is comming from ReEnterPBP.bas
There's no way for it to know if the complex formula/IF statement is in the main program or the interrupt handler. And if it's in the handler, it will end up overwriting PBP's system vars.
If you know for sure that the offending statements are NOT in the handler. You can open the ReEnterPBP.bas file and comment the error line.
ifdef T5
; ERROR "Temp variables exceeding T4"
endif
HTH,
Hi Darrel,
So if I understand this right, ERROR is a reserved word in assembler, and if IFDEF calls it then MPASM displays the error when compiling . . . YES?<br><br> Hi Steve, thanks , I will give that some thought.
Darrel Taylor
- 2nd November 2008, 09:39
Hi Darrel,
So if I understand this right, ERROR is a reserved word in assembler, and if IFDEF calls it then MPASM displays the error when compiling . . . YES?
Yup. You got it. :)
Ioannis
- 3rd November 2008, 07:46
Hi. Thanks for the replies.
Alain: I was going to use the syntax later (if thermistor then...), after I had my program working. But as Darrel explained, this would have no effect as the error was coming from the ReEnterPBP.bas.
Darrel: Thanks for the explanation. I forgot to mention that I was using yours routine for the Interupts, sorry... But did not imagine that this could be coming from the ReEnterPBP.bas. It seemed more logical to be a problem of the Assembler or Compiler.
Useful the tip for the error.
Anyway, many thanks to all.
Ioannis
Powered by vBulletin® Version 4.1.7 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.