PDA

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