PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit if else



KingTobi
19.08.2007, 19:13
Hi

Hab nicht viel Ahnung von Basic bzw. Basic++, aber muss ein Programm für nen Kumpel schreiben.
Kann mir jemand die beiden Abfragen mit nem else zusammenfassen?


if (BPORT1 = 11111110b) and (_REL1=0) then
_REL1=1
Do
Loop Until BPORT1 <> 11111110b
end if
if (BPORT1 = 11111110b) and (_REL1=1) then
_REL1=0
Do
Loop Until BPORT1 <> 11111110b
end if

Danke im vorraus.


[/code]

recycle
19.08.2007, 19:50
Wenn du auf mehrere Bedingungen prüfen willst, geht das ungefähr so(kann sein, dass die Syntax in CBasic etwas anders ist):

if (Bedingung1) then
.... mach irgendwas
elseif (Bedingung2) then
.... mach irgendwas anderes
elseif (Bedingung1)
.... mach noch was anderes
else
.... mach das was pasieren soll, wenn keine der Bedingungen zutrifft
end if


D.h. mit ElseIf kannst du beliebig weitere Bedingungen abfragen und darauf reagieren, die Befehle nach dem Else werden durchgeführt, wenn keine der vorangegangenen Bedingungen zutrifft.

KingTobi
19.08.2007, 20:04
Hi

Danke für die Hilfe, bringt mir aber auch nur eine Ersparnis von einer Zeile.
Was ich bräuchte ist ein
if
... mach irgendwas
if
... mach irgendwas
else
... mach irgendwas
endif

Es soll geprüft werden ob der an P1 angeschlossene Taster gedrückt wurde, und dann soll der Wert in _REL1 wenn er auch o steht auf 1 geändert werden und wenn er auf 1 steht genau anders rum.

Aber das spielt nun keine Rolle mehr, hatte nen "Geistesblitz" wie man das vereinfachen kann. Und zwar in dem ich nicht 0 und 1 nehme sondern -1 und 1, dann geht das ganz einfach so:


if (BPORT1 = 11111110b) then
Do
Loop Until BPORT1 <> 11111110b
_REL1=_REL1 * -1
end if

KingTobi
20.08.2007, 10:07
Hi

Irgendwie klappt das hier alles nicht.
Was passieren soll?
Wenn ein Taster am DigiPort1 geschaltet wird, soll Relais1 geschaltet werden.
Wenn ein Taster am DigiPort2 geschaltet wird, soll Relais2 geschaltet werden.
usw.
Außerdem werden die Zustände die die Relais haben sollen gespeichert, damit immer alle ansind die an sein sollen.

Aber er schaltet nicht.
Hier mal der Code, etwas abgekürzt.


define LIGHT as port[16]
define BPORT1 as byteport[1]

import "...\LIB\SHOW_BINARY.BAS"
import "...\LIB\PULLUP1_ENABLE.BAS"

define ADC8 ad[8]

define SDA as port[9]
define SCL as port[10]
define EXTPORT as byteport[4]

define STATION_IO as byte[3]

define REL1 as bit [21]
define REL2 as bit [22]
define REL3 as bit [23]
define REL4 as bit [24]
define _REL1 as word
define _REL2 as word
define _REL3 as word
define _REL4 as word


PULLUP1_ENABLE()
LIGHT=off
LCD.INIT
SDA=on
SCL=on

_REL1=-1
_REL2=-1
_REL3=-1
_REL4=-1


#HAUPTSCHLEIFE
if _REL1 = 1 then
REL1=ON
else
REL1=OFF
end if
if _REL2 = 1 then
REL2=ON
else
REL2=OFF
end if
if _REL3 = 1 then
REL3=ON
else
REL3=OFF
end if
if _REL4 = 1 then
REL4=ON
else
REL4=OFF
end if

STATION_IO=OFF
EXTPORT=STATION_IO
LCD.POS 1,1
LCD.PRINT "BINARY: "
SHOW_BINARY(BPORT1)
'----------------
if (BPORT1 = 11111110b) then
goto r1
end if
if (BPORT1 = 11111101b) then
goto r2
end if
if (BPORT1 = 11111011b) then
goto r3
end if
if (BPORT1 = 11110111b) then
goto r4
end if
if (BPORT1 = 11101111b) then
goto r1
end if
if (BPORT1 = 11011111b) then
goto r2
end if
if (BPORT1 = 10111111b) then
goto r3
end if
if (BPORT1 = 01111111b) then
goto r4
end if
goto HAUPTSCHLEIFE

#r1
Do
Loop Until BPORT1 <> 11111110b
PAUSE 25

LCD.POS 2,1
LCD.PRINT "REL1"

if _REL1=1 then
REL1=ON
end if
if _REL1=-1 then
REL1=OFF
end if

_REL1= _REL1 * -1
goto HAUPTSCHLEIFE

Hat jemand ne Idee, von mir aus aus wie mans komplett neu und besser macht.

Dierk
20.08.2007, 12:56
Hi, das geht viel einfacher.
Du musst zunächst mit Deinen Tastern den Port auf Gnd schalten (nicht auf 5Volt!). Wenn nicht gedrückt ist, dann wird der Port automatisch auf 5V gezogen und damit als "On" erkannt (also logisch gerade verkehrt herum).
Die Zustände der Relais werden schon im Byte "STATION_IO" als Bit-Zustände gespeichert. Die Tastenzustände müssen mit Not einfach invertiert werden und dem Relais-Bits zugewiesen werden. Fertig!
Schau Dir auch die Definition hier an, dass ist einfacher und führt nicht zu weiteren Kuddelmuddel:
define REL4 ref STATION_IO at bit[8]


define LIGHT as port[16]
define BPORT1 as byteport[1]

import "...\LIB\SHOW_BINARY.BAS"
import "...\LIB\PULLUP1_ENABLE.BAS"

define ADC8 ad[8]

define SDA as port[9]
define SCL as port[10]
define EXTPORT as byteport[4]

define STATION_IO as byte

define REL1 ref STATION_IO at bit[5]
define REL2 ref STATION_IO at bit[6]
define REL3 ref STATION_IO at bit[7]
define REL4 ref STATION_IO at bit[8]

define Taster1 as Port[1] ' Taster auf GND
define Taster2 as Port[2] ' Taster auf GND
define Taster3 as Port[3] ' Taster auf GND
define Taster4 as Port[4] ' Taster auf GND

PULLUP1_ENABLE()
LIGHT=off
LCD.INIT
SDA=on
SCL=on

STATION_IO=OFF

#HAUPTSCHLEIFE
REL1=Not(Taster1)
REL2=Not(Taster2)
REL3=Not(Taster3)
REL4=Not(Taster4)

EXTPORT=STATION_IO ' Auf Byteport schreiben
LCD.POS 1,1
LCD.PRINT "BINARY: "
SHOW_BINARY(BPORT1)

goto HAUPTSCHLEIFE

KingTobi
20.08.2007, 13:18
Hi

Erstmal Danke für deine Hilfe, aber es funktioniert immernoch nciht richtig.
Der Taster verbindet Ground und einen digitalen Eingang.

Jetzt siehts jedenfalls so aus das 1 und 2 und 3 garnichts passiert und bei Eingang 4 alles schaltet.
Und auch nur solange der Taster gedrückt bleibt.

Es handelt sich übrigens um eine C-Control Station 2.

Dierk
20.08.2007, 13:22
Dann probier mal das hier:
SHOW_BINARY(Station_IO) statt SHOW_BINARY(BPORT1)

KingTobi
20.08.2007, 13:31
Nee, so klappts auch nicht.
Es sind jetzt alle Einsen zu Nullen geworden.

Wenn ich REL4=Not(Taster4) rausnehme, geht alles an wenn an Port 3 gedrückt wird.

Dierk
20.08.2007, 13:40
Willst Du bei Tastendruck nur den Zustand des Relais toggeln? Dann musst Du das so in etwa machen

define STATION_IO as byte

define REL1 ref STATION_IO at bit[5]
define REL2 ref STATION_IO at bit[6]
define REL3 ref STATION_IO at bit[7]
define REL4 ref STATION_IO at bit[8]

define Taster1 as Port[1] ' Taster auf GND
define Taster2 as Port[2] ' Taster auf GND
define Taster3 as Port[3] ' Taster auf GND
define Taster4 as Port[4] ' Taster auf GND

PULLUP1_ENABLE()
LIGHT=off
LCD.INIT
SDA=on
SCL=on

STATION_IO=OFF

#HAUPTSCHLEIFE
If Not(Taster1) then
REL1=Not(REL1)
Do
Loop Until Not(Taster1) 'Warten solange Taste gedrückt wird
end if
If Not(Taster2) then
REL2=Not(REL2)
Do
Loop Until Not(Taster2) 'Warten solange Taste gedrückt wird
end if
If Not(Taster3) then
REL3=Not(REL3)
Do
Loop Until Not(Taster3) 'Warten solange Taste gedrückt wird
end if
If Not(Taster4) then
REL4=Not(REL4)
Do
Loop Until Not(Taster4) 'Warten solange Taste gedrückt wird
end if

EXTPORT=STATION_IO ' Auf Byteport schreiben


LCD.POS 1,1
LCD.PRINT "BINARY: "
SHOW_BINARY(STATION_IO)

goto HAUPTSCHLEIFE

KingTobi
20.08.2007, 13:49
Mal davon agsehen das immer alle schalten schon nicht schlecht.

KingTobi
20.08.2007, 20:25
Hi

Habs nun nachn bischen probieren und nochmal komplett neu schreiben hinbekommen.



define LIGHT as port[16]
define BPORT1 as byteport[1]

import "...\LIB\SHOW_BINARY.BAS"
import "...\LIB\PULLUP1_ENABLE.BAS"

define ADC8 ad[8]

define SDA as port[9]
define SCL as port[10]
define EXTPORT as byteport[4]

define STATION_IO as byte[3]

define REL1 as bit [21]
define REL2 as bit [22]
define REL3 as bit [23]
define REL4 as bit [24]

PULLUP1_ENABLE()
LIGHT=off
LCD.INIT
SDA=on
SCL=on
STATION_IO=OFF
#HAUPTSCHLEIFE


EXTPORT=STATION_IO
LCD.POS 1,1
LCD.PRINT "BINARY: "
SHOW_BINARY(BPORT1)

'--- D1 - D4 ---

if (BPORT1 = 11111110b) then
Do
Loop Until BPORT1 <> 11111110b
if ( REL1 = OFF) then
REL1 = ON
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
if ( REL1 = ON) then
REL1 = OFF
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
goto HAUPTSCHLEIFE
end if
if (BPORT1 = 11111101b) then
Do
Loop Until BPORT1 <> 11111101b
if ( REL2 = OFF) then
REL2 = ON
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
if ( REL2 = ON) then
REL2 = OFF
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
goto HAUPTSCHLEIFE
end if
if (BPORT1 = 11111011b) then
Do
Loop Until BPORT1 <> 11111011b
if ( REL3 = OFF) then
REL3 = ON
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
if ( REL3 = ON) then
REL3 = OFF
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
goto HAUPTSCHLEIFE
end if
if (BPORT1 = 11110111b) then
Do
Loop Until BPORT1 <> 11110111b
if ( REL4 = OFF) then
REL4 = ON
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
if ( REL4 = ON) then
REL4 = OFF
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
end if

'--- D5 - D8 ---

if (BPORT1 = 11101111b) then
Do
Loop Until BPORT1 <> 11101111b
if ( REL1 = OFF) then
REL1 = ON
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
if ( REL1 = ON) then
REL1 = OFF
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
goto HAUPTSCHLEIFE
end if
if (BPORT1 = 11011111b) then
Do
Loop Until BPORT1 <> 11011111b
if ( REL2 = OFF) then
REL2 = ON
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
if ( REL2 = ON) then
REL2 = OFF
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
goto HAUPTSCHLEIFE
end if
if (BPORT1 = 10111111b) then
Do
Loop Until BPORT1 <> 10111111b
if ( REL3 = OFF) then
REL3 = ON
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
if ( REL3 = ON) then
REL3 = OFF
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
goto HAUPTSCHLEIFE
end if
if (BPORT1 = 01111111b) then
Do
Loop Until BPORT1 <> 01111111b
if ( REL4 = OFF) then
REL4 = ON
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
if ( REL4 = ON) then
REL4 = OFF
EXTPORT=STATION_IO
goto HAUPTSCHLEIFE
end if
end if
goto HAUPTSCHLEIFE