Forum: Mikrocontroller und Digitale Elektronik If Bedingung mit DIP Schalter verbinden


von Nino K. (lnino)


Lesenswert?

Hi an alle.

Ich habe folgende Herausforderung und weiß nicht recht wie ich diese 
umsetzen soll. Vielleicht habt ihr dazu eine Idee.

Ich habe folgende If Bedingungen:

if(var1 >=5 && var1 <=12){
// do something
}

else if(var1 >=15 && var1 <=20){
// do something
}

else if((var1 >=15 && var1 <=20)&& var2=1){
// do something
}

Ich möchte nun einen DIP Schalter mit 3 Hebeln einbauen.
Hebel1 = klein
Hebel2 = groß
Hebel3 = groß

Hinter klein soll sich "var1 >=5 && var1 <=12" verbergen.
Hinter groß soll sich "var1 >=15 && var1 <=20" verbergen.

Könnte ihr mir helfen dies umzusetzen?

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

El Nino schrieb:
> Ich möchte nun einen DIP Schalter mit 3 Hebeln einbauen.

was ist ein DIP Schalter mit 3 Hebeln?


> Könnte ihr mir helfen dies umzusetzen?

Was soll denn umgesetzt werden? Die Erweiterung deiner Abfrage?


> if(var1 >=5 && var1 <=12){
> // do something
> }

+

> Hebel1 = klein

+

> Hinter klein soll sich "var1 >=5 && var1 <=12" verbergen.


-->

if( (var1 >=5 && var1 <=12) || klein == 1 )

 {
 // do something
 }

von Nino K. (lnino)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> was ist ein DIP Schalter mit 3 Hebeln?

Ein DIP Schalter ist folgendes:
http://de.wikipedia.org/wiki/DIP-Schalter

Ich denke ich hatte es oben schon angeführt, versuche es aber nochmal zu 
erklären.

Wenn ich am DIP Schalter den "Hebel" beispielsweise nach oben bewege, 
möchte ich, dass in der If Bedingung durch einen Verweis oder ähnliches 
"var1 >=5 && var1 <=12" drin steht.

In der If Bedingung mit einer einzelnen Variabel zu arbeiten ist ja kein 
Problem, aber wie soll ich ein Spektrum von 5 bis 12 abdecken?

Ist dies möglich?

von hdd (Gast)


Lesenswert?

Hab ich das richtig verstanden, du möchtest bei eingeschaltetem Hebel1 
nur die erste Abfrage prüfuen und beim Hebel2 die beiden anderen?
Dann ver-und-e doch die Abfragen jeweils noch mit der Prüfung ob Hebel1 
bzw. Hebel2 an ist.

von Sebastian (Gast)


Lesenswert?

Sorry aber dein Problem ist nicht ganz klar formuliert....

von Oliver (Gast)


Lesenswert?

1
if (hebel_1)
2
   var1 = 10;
3
if (hebel_2 || hebel_3)
4
   var1 = 17;

Oliver

von chick (Gast)


Lesenswert?

Man hast DU Probleme.

Dein Dip-Schalter ist doch nur ne weitere Variable für die IF-Abfragen.

Also
- Dip-Schlater einlesen
- Variable 3 , 4 und 5 draus generieren
- Variable 3, 4 und 5 in den IF-Abfragen drin

fertig.

von Bernd (Gast)


Lesenswert?

Soll denn nun var1 unabhängig von den
Schaltern oder DIP-Schaltern (wo ist der Unterschied?)
irgendwelche Werte annehmen?

Dann wissen das doch die Schalter nicht.

Was ist denn nun die Herausforderung?

Problem klar formuliert - und wahrscheinlich
ist es dann keines mehr.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

El Nino schrieb:
> Ein DIP Schalter ist folgendes:
> http://de.wikipedia.org/wiki/DIP-Schalter

na du bist mir ja ein Held. Was ein DIP-Schalter ist, weiß ich 
sicherlich. Ich hab da allerdings nicht direkt den Begriff "Hebel" 
assoziiert.

von Nino K. (lnino)


Lesenswert?

Vielleicht habe ich mein Problem doch nicht ganz klar formuliert.

Ich versuche es nun etwas detailierter.

Das Beispiel wird für einen Sicherheitsode bei einem Tresor verwendet.

Der Tresor hat einen Knopf. Je nachdem wie lange man den Knopf drückt 
kann man ein kurzes oder ein langes Signal senden.

Der Tresor ist mit einer Zeichenfolge aus 3 aufeinanderfolgenden 
Tastenbetätigungen zu öffnen. Z.b.: Kurz, Kurz, Lang

Das System funktioniert wunderbar. Jedoch habe ich den Öffnungscode hart 
im Quellcode hinterlegt. Ich möchte diesen aber mit Hilfe eines DIP 
Schlaters jederzeit ändern können.

Somit meine Frage, wie kann ich den fix hinterlegten "Geheimcode" im 
Quellcode...

if(var1 >=5 && var1 <=12){    // kurz
// do something
var_very1=1;
}

else if((var1 >=5 && var1 <=12) && var_very1=1){     // kurz
// do something
var_very2=1;
}

else if((var1 >=15 && var1 <=20)&& var_very2=1){     // lang
// do something
var_very3=1;
}

if(var_very1==1 && var_very2==1 && var_very3=1){
// Tresor öffne dich
}

... durch meinen DIP Schalter verändern?

Bitte keine Rückmeldungen über die Sinnhaftigkeit, es ist lediglich ein 
Versuchprojekt.

Vielen Dank für die Hilfe.

von Karl H. (kbuchegg)


Lesenswert?

> Das System funktioniert wunderbar. Jedoch habe ich den Öffnungscode
> hart im Quellcode hinterlegt. Ich möchte diesen aber mit Hilfe eines
> DIP Schlaters jederzeit ändern können.

Ja und?

Solche DIP-Schalter sind ja auch nichts anderes als Schalter, nur eben 
mehrerer in einem Gehäuse. Ein Schalter wiederrum ist auch nur ein 
Taster, der beim Drücken seine Position behält und nicht von alleine 
wieder zurückgeht.
ALl das sind aber mechanische UNterschiede im Aufbau. Für deinen µC ist 
das einfach nur ein Kontakt der an einem Portpin hängt und am Portpin 
ist dann 0 oder 1 sichtbar, je nachdem wie der SChalter steht.
Und wie fragt man einen Eingabepin ab?

> Ich möchte diesen aber mit Hilfe eines DIP
> Schlaters jederzeit ändern können.

Dann darf der Code eben nicht fix sein. Alles was nicht fix ist, wird in 
einer Variablen gespeichert. Also wirst du wohl Variablen brauchen, 
deren Wert sich aus der Stellung der Dip-Schalter ergibt.

von Noname (Gast)


Lesenswert?

Man könnte es, ergänzend, auch so formulieren:
Die DIP-Schalter sind auch nur Variablen, die Du vom Port eingelesen 
hast und vergleichst.
Von dem Ausgang dieses ersten Vergleichs ist wiederum abhängig welche 
Vergleiche Du mit der Zeitdauer des "Knopfdruckes" anstellst.

von Karl H. (kbuchegg)


Lesenswert?

Oder noch anders ausgedrückt

In

if(var1 >=5 && var1 <=12){    // kurz

welcher Teil der Abfrage ist denn dafür zuständig, dass hier ein 'kurz' 
gefordert wird?

Das musst du dann eben variabel machen, wobei der dieser Teil dann eben 
von der Schalterstellung abhängt.
Es gibt da mehrere Möglichkeiten, wie man das machen kann.

Zum Beispiel (ist nicht die eleganteste Möglichkeit, aber es ist eine 
Möglichkeit)

   if( Schalter steht auf 0 ) {
     if( Druck war kurz ) {
       var_very1=1;
     }
   }
   else {    // Schalter war nicht auf 0, also muss er auf 1 sein
     if( Druck war lang ) {
       var_very1=1;
     }
   }


 Du schaffst das schon.

von Master S. (snowman)


Lesenswert?

falls deine ganzen "if...else if.. " etc in einer endlosschlaufe stehen, 
wird dein "else if((var1 >=5 && var1 <=12) && var_very1=1)" nie 
ausgeführt...

schau mal die "switch()"-anweisung an. da machst du am besten sowas wie 
"switch(status)" wobei status der schritt (1..3) ist, in dem du dich 
befindest. vor oder nach der switch-anweisung kannst du deine 
DIP-schalter abfragen und sollten sie sich in einer gewissen stellung 
befinden, so kannst du eine neue druck-sequenz für deinen tresor 
programmieren (z.b. status = 4..6).

von Marco (Gast)


Lesenswert?

wir sollen ja nichts über sinnhaftigkeit des Codes sagen, aber in deinem 
Code, falls er in einer Endlosschleife steht(was ich annehme) ist es 
egal in welcher Reihenfolge man die Tasten drückt und man könnte auch 10 
mal drücken, hauptsache die geforderten intervale tauchen alle einmal 
auf. Wie schon über mir erwähnt könnte die switch- case Anwendung besser 
passen.

Zu deien Frage:


if (dip1==1){
  max1=12;
  min1=5;
else {
  max1=20;
  min1=15;

if(var1 >=min1 && var1 <=max1){
// do something
}

einfach den zustand der Dips auslesen und die "Grenzen" dementsprechend 
anpassen. Vorausgesetzt ich habe deine Frage richtg verstanden.

von John (Gast)


Lesenswert?

Eine einfache Möglichkeit ist es die Schalterstellungen erst man 
abzufragen und drei Variablen zuzuweisen z.B.:
Schalter_a=0
Schalter_b=0
Schalter_c=1  //0=kurz, 1=lang

Dann ordnest Du die Zeit des Tastendrucks einer Variablen zu:
wenn (var1 >=5 && var1 <=12) dann Zeit=0 // kurz
wenn (var1 >=15 && var1 <=20) dann Zeit=1 // lang
else Zeit=2 // ungültig

Und dann kannst Du die Zeit mit der Schalterstellung vergleichen:
if(Zeit==Schalter_a){
// do something
var_very1=1;
}
else if((Zeit==Schalter_b) && var_very1=1){
// do something
var_very2=1;
}
...

Ich glaube Marco hat recht. Dein Beispiel ist kurz, kurz, lang. Wenn 
jetzt jemand kurz, lang, kurz, lang drückt geht der Tresor auch auf.

Gruß
John

von Nino K. (lnino)


Lesenswert?

John schrieb:
> Ich glaube Marco hat recht. Dein Beispiel ist kurz, kurz, lang. Wenn
>
> jetzt jemand kurz, lang, kurz, lang drückt geht der Tresor auch auf.

Ich denke nicht, dass das stimmt.
Innerhalb der If Bedingungen wird eine Variable gesetzt, welche für die 
nächste If Bedingung als Vorraussetzung gilt. Nur wenn diese erfüllt ist 
kann die nächste Bedingung vollständig erfüllt werden.

Durch die Verwendung von if und else if, muss bei jeder "erfolgreichen" 
Bedingungen wieder von vorne begonnen werden, damit nicht gleich in die 
nächste Bedingungen gesprungen wird wenn z.B.: 2 mal lang auf einander 
folgt.

@ Marco: Das mit den min und max Werten war die zündende Idee. Das ist 
haargenau das nachdem ich gesucht hatte. Da bin ich aber echt schön auf 
der Leitung gestanden. Vielen Dank für deine Hilfe. Juhhhuuuuuuu. Danke 
Danke Danke.

von Master S. (snowman)


Lesenswert?

hallo Christkind
deine "else if" werden nie ausgeführt werden. warum?
wenn "else if((var1 >=5 && var1 <=12) && var_very1=1)" erfüllt sein 
soll, muss der teil "(var1 >=5 && var1 <=12)" auch erfüllt sein. falls 
dieser teil aber erfüllt ist, so führt der uC zuerst "if (var1 >=5 && 
var1 <=12)" aus ohne in den nachfolgenden "else if((var1 >=5 && var1 
<=12) && var_very1=1)" zu gehen. und wenn der das nicht macht, wird er 
logischerweise auch nicht in den zweiten "else if()" gehen. -> mache 
eine switch()-anweisung. ist sauber, übersichtlich, und viel einfacher.

von Marco (Gast)


Lesenswert?

El Nino schrieb:
> else if((var1 >=15 && var1 <=20)&& var2=1){
> // do something
> }

sorry, hatte deinen Code wohl nicht ganz zuende gelesen. Das mit der 
richtigen Reihenfolge lässt sich auch so lösen, wobei ich mich hier 
etwas wundere was die Zahlenreihenfolge angeht  du fragst var1 ab und 
gehst davon aus das var 2 schon gesetzt ist... zählst du rückwärts ... 
var3...var2...var1 ???

von Marco (Gast)


Lesenswert?

zum Thema switch... hier noch ein link:

http://www.proggen.org/doku.php?id=c:switch

der passt sehr gut zu diesem Thread

von Nino K. (lnino)


Lesenswert?

Hi Marco,

stimmt ein Switch wäre hier vermutlich etwas übersichtlicher.

Ich werde mal versuchen meine IFs durch einen schönen Switch zu 
ersetzen.

Danke für den Tipp.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.