Go Down

Topic: VAL Abfrage (HIGH und LOW) Verständnis (Read 2076 times) previous topic - next topic

dennisbergner89

Mar 29, 2014, 05:46 pm Last Edit: Mar 29, 2014, 09:29 pm by uwefed Reason: 1
Hallo Liebe Leute,

ich bin Arduinoanfänger und habe mir etwas gebastelt. Bei der IF Anweisung mit ) if val == HIGH ) habe ich ein Problem. Hier sage ich wenn der EINGANG also PIN 5 auf HIGH ist, dann mache das der Fußgänger überqueren kann. Wenn ich nun von PIN 5 auf das Steckboard gehe und dann noch ein Kabel von der gleichen Reihe auf die Erde lege, dann bleibt die Lampe auf Grün. Ich will jedoch simulieren, dass ein Fußgänger bei Drücken eines Schalters über die Strasse kann (Blau muss angehen).  Nun verstehe ich nicht, warum er umschaltet, wenn ich die Kabel voneinander trenne. Wenn ich diese trenne müsste es ja auf LOW sein oder verstehe ich da was falsch?

Danke ihm Voraus

Grüße

Dennis


/
Code: [Select]
/ Beispiel Fussganger will Ampel ueberqueren

const int GRUEN = 12;  //ROT connected to digital pin 13
const int GELB = 11; //GELB connected to digital pin 11
const int ROT = 8; //GRUEN connected to digital pin 8
const int BLAU = 2;  //BLAU connected to digital pin 2
const int KABEL = 5; //KABEL connected to digital pin 5

int val = 0;         //val will be used to store the state
                    //of the input pin

void setup()
{
  pinMode(ROT, OUTPUT);    //sets the digital pin as output
  pinMode(GELB, OUTPUT);   //sets the digital pin as output
  pinMode(GRUEN, OUTPUT);  //sets the digital pin as output
  pinMode(BLAU, OUTPUT);   //sets the digital pin as output
  pinMode(KABEL, INPUT);   //sets the digital pin as input
}
void loop(){
 val = digitalRead(KABEL); //read input value and store it
 
 //check whether the input is HIGH (Kabel aneinander)
[glow=yellow,2,300] if (val == HIGH) {[/glow]
    delay(1000);
    digitalWrite(GRUEN, LOW);
    digitalWrite(GELB, HIGH);
    delay(1000);
    digitalWrite(GELB, LOW);
    digitalWrite(ROT, HIGH);
    delay(1000);
    digitalWrite(BLAU, HIGH);
    delay(1000);
    digitalWrite(BLAU, LOW);
    delay(1000);
    digitalWrite(GELB, HIGH);
    delay(1000);
    digitalWrite(ROT, LOW);
    digitalWrite(GELB, LOW);
    digitalWrite(GRUEN, HIGH);
 
} else {
   digitalWrite(GRUEN, HIGH);
}
}

Serenifly

Hast du einen Pullup- oder Pulldown Widerstand am Taster? Ein offener Eingang ist eine Antenne und fängt sich beliebig Störungen ein. Deshalb muss der Pin auf einem definierten Pegel liegen.

Das einfachste ist man nimmt die internen Pullups:
Code: [Select]

pinMode(KABEL, INPUT_PULLUP);   //sets the digital pin as input


Und schaltet den Taster nicht gegen 5V sondern auf Masse. Dann ist er nicht gedrückt HIGH (wegen dem internen Widerstand auf 5V) und gedrückt LOW. Wenn man das Kabel abzieht liegt dann immer noch HIGH an.

Siehe auch hier:
http://arduino.cc/en/Tutorial/InputPullupSerial

dennisbergner89

Hallo,

ja danke das hat mir etwas geholfen. Ich habe jetzt verstanden, dass wenn das Kabel was den Ausgang 5 verlässt über ein weiteres Kabel auf Ground läuft dann ist er LOW wenn sie nicht verbunden sind auf HIGH . Aber warum diese Umkehrung?

Kann ich dieser Umkehrung irgendwie wieder logisch machen?

Ich verstehe nicht wofür dieses Pullup ?

Dennis

dennisbergner89

#3
Mar 29, 2014, 07:38 pm Last Edit: Mar 29, 2014, 09:28 pm by uwefed Reason: 1
Jetzt sieht es so aus. Ich habe als Anfangswert LOW und habe dieses Pullup noch rein gebracht. Wenn ich nun den Taster drücke geht die Amplesteuerung. Vor dem Pull UP ist es die ganze zeit einfach gelaufen. Aber vielleicht kannst du mir trotzdem noch erklären, was das Pull UP bewirkt und wieso ich das benutzen muss und warum dieses HIGH und LOW mit nicht logisch vor kommt.

Code: [Select]

// Beispiel Fussganger will Ampel ueberqueren

const int GRUEN = 13;  //ROT connected to digital pin 13
const int GELB = 11; //GELB connected to digital pin 11
const int ROT = 8; //GRUEN connected to digital pin 8
const int BLAU = 2;  //BLAU connected to digital pin 2
const int KABEL = 5; //KABEL connected to digital pin 5

int val = 0;         //val will be used to store the state
                    //of the input pin

void setup()
{
  pinMode(ROT, OUTPUT);    //sets the digital pin as output
  pinMode(GELB, OUTPUT);   //sets the digital pin as output
  pinMode(GRUEN, OUTPUT);  //sets the digital pin as output
  pinMode(BLAU, OUTPUT);   //sets the digital pin as output
 [glow=yellow,2,300] pinMode(KABEL, INPUT_PULLUP);[/glow]
}
void loop(){
 val = digitalRead(KABEL); //read input value and store it
 
 //check whether the input is HIGH (Kabel aneinander)
[glow=yellow,2,300] if (val == LOW) {[/glow]
    delay(1000);
    digitalWrite(GRUEN, LOW);
    digitalWrite(GELB, HIGH);
    delay(1000);
    digitalWrite(GELB, LOW);
    digitalWrite(ROT, HIGH);
    delay(1000);
    digitalWrite(BLAU, HIGH);
    delay(1000);
    digitalWrite(BLAU, LOW);
    delay(1000);
    digitalWrite(GELB, HIGH);
    delay(1000);
    digitalWrite(ROT, LOW);
    digitalWrite(GELB, LOW);
    digitalWrite(GRUEN, HIGH);
 
} else {
   digitalWrite(GRUEN, HIGH);
}
}

 Vielen Dank

Dennis

Eisebaer

hi,

ich bin auch kein elektroniker, also versuch' ich's.

wenn Du an einen eingang keine spannung legst, heißt das nicht, daß da nix dran ist. das heißt nur, daß es nicht festgelegt ist. also mußt Du entweder plus für eingeschaltet oder minus für ausgeschaltet dran hängen.
das ließe sich zb mit einem taster machen, der "nicht gedrückt" minus durchläßt und "gedrückt" plus. also teurer taster.

andere möglichkeit: Du schickst immer minus an den eingang, und wenn Du den taster drückst, dann plus. ergibt beim drücken dann aber natürlich kurzschuß. also nur ganz wenig minus über einen großen widerstand. dann liegt immer "ein wenig" minus am eingang, und wenn Du den taster drückst, kommt "viel" plus an den eingang. der widerstand verhindert den kurzschluß.
das nennt man PULLDOWN-widerstand, weil es den eingang in richtung minus "runterzieht".

naja, und PULLUP ist das gleiche, nur umgekehrt. ein widerstand zieht den eingang in richtung plus, wenn der taster gedrückt wird, bekommt der eingang "viel" minus. die logik ist dann halt umgekehrt. der atmega auf dem arduino hat halt pullups und nicht pulldowns eingebaut, muß man umdenken.

andere möglichkeit: Du nimmst selbst einen widerstand (etwa 10000 ohm) und ziehst den eingang selbst gegen minus, dann stimmt auch die logik wieder.

gruß stefan

Serenifly

#5
Mar 29, 2014, 08:01 pm Last Edit: Mar 29, 2014, 08:15 pm by Serenifly Reason: 1
http://de.wikipedia.org/wiki/Open_circuit#Beschaltung_der_Signalleitungen

Ein Pullup (gegen 5V) oder Pulldown Widerstand (gegen Masse)  ist dazu da einen Eingang auf einem definierten Pegel zu halten. Weil CMOS Eingänge wie gesagt nie offen sein dürfen. Die schweben (floaten) dann und sind undefiniert. Da reicht es schon mit der Hand hinzulangen oder in die Nähe zu kommen, um da unkontrollierte Störungen in die Schaltung zu bringen.
Üblich sind da ca. 10k. Der Controller hat eben interne Pullups die man aktivieren kann. Dadurch spart man sich extra Beschaltung. Weshalb man meistens Pullups benutzt hat zum Teil historische Gründe aus älteren Schaltungsfamilien wie DTL und TTL.

Ob das jetzt invertiert ist oder nicht ist reine Gewöhnungs-Sache. Wenn man Elektronik lernt, ist man es nicht anders gewöhnt, als dass Taster gegen Low schalten. Das ist in professionellen Schaltungen die Regel. Pulldowns und gegen High schalten ist eher eine Anfänger/Laien-Sache damit die Logik "stimmt".

Du kannst das aber auch einfach rumdrehen. z.B. so:
Code: [Select]

#define AN LOW
#define AUS HIGH

Dann ist AN -> LOW und AUS -> HIGH

Wenn du dann noch die LEDs herumdrehst und GND gegen 5V tauscht, so dass der Strom in den µC hinein fließt wenn ein Pin LOW ist, passt das sogar für die.

Oder du verbaust selbst externe Pulldowns. Dann hast du aber ein Bauteil mehr.

dennisbergner89

Vielen Dank . Diese Infos haben mir weiter geholfen. Ich denke ich lasse es einfach so und gewöhne mich darAn , dass die Logik da meines Erachtens umgekehrt ist .

Dieses Pull Up hat jetzt aber nur was mit den Störungen zu tun und nicht mit der "Logik" richtig ?!

Dennis

Go Up