- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Problem mit if else

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.08.2007
    Ort
    Delmenhorst
    Alter
    38
    Beiträge
    731

    Problem mit if else

    Anzeige

    Praxistest und DIY Projekte
    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?
    Code:
    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]

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    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.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.08.2007
    Ort
    Delmenhorst
    Alter
    38
    Beiträge
    731
    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:
    Code:
    if (BPORT1 = 11111110b) then
     Do
     Loop Until BPORT1 <> 11111110b
     _REL1=_REL1 * -1
    end if

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.08.2007
    Ort
    Delmenhorst
    Alter
    38
    Beiträge
    731
    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.
    Code:
    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.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    16.09.2004
    Ort
    Schwabenland
    Beiträge
    156
    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]

    Code:
    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

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.08.2007
    Ort
    Delmenhorst
    Alter
    38
    Beiträge
    731
    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.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    16.09.2004
    Ort
    Schwabenland
    Beiträge
    156
    Dann probier mal das hier:
    SHOW_BINARY(Station_IO) statt SHOW_BINARY(BPORT1)

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.08.2007
    Ort
    Delmenhorst
    Alter
    38
    Beiträge
    731
    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.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    16.09.2004
    Ort
    Schwabenland
    Beiträge
    156
    Willst Du bei Tastendruck nur den Zustand des Relais toggeln? Dann musst Du das so in etwa machen
    Code:
    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

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.08.2007
    Ort
    Delmenhorst
    Alter
    38
    Beiträge
    731
    Mal davon agsehen das immer alle schalten schon nicht schlecht.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad