Forum: Mikrocontroller und Digitale Elektronik Interrupt-Problem Arduino Uno / Mega168


von Drahtbrücke (Gast)


Lesenswert?

Hallo zusammen !
Ich habe ein komisches Problem mit diesem Programm:

/*led mittels Interupt einschalten
*/


int led=13;   //LED an pin 13

void einschalten ()
{
digitalWrite(led, HIGH);
}

void setup ()
{
    pinMode(led, OUTPUT);
    attachInterrupt(0, einschalten, RISING);

  }

void loop()
{
}


Das müsste doch eigentlich gehen, oder? Tut es aber nicht. Die led 
müsste ja angehen wenn ich 5 Volt an Pin 2 anlege. Stattdessen passiert 
gar nichts. Erst wenn ich das Kabel abziehe, also Pin2 wieder öffne, 
geht sie an. Aber das wäre dann ja "FALLING". Ich habe auch das mal 
eingesetzt, genau wie "CHANGE", aber es ist überall dasselbe. Und was 
gar keinen Sinn ergiebt: wenn ich Pin2 gegen GND schalte und dann den 
Kontakt trenne, passiert genau das gleiche wie bei 5V.
Zu allem Überdruss macht es auch einen Unterschied WO ich das kabel 
abziehe. Der oben genannte Effekt tritt nur dann auf, wenn ich das Kabel 
der GND oder 5V buchse Anfasse und herausziehe. Wenn ich das bei Pin2 
mache passiert nichts.
Und wenn dann das Kabel nur noch in Pin2 steckt und ich meine Hand auf 
etwa 3cm heranbringe, fängt die led manchmal wie wild an zu flackern.
Das liegt vielleicht auch daran, das ich irgendwie aufgeladen bin aber 
selbst nachdem ich mich an der Heizung entladen hatte fing sie immer 
noch zu flackern  an. Also müsste der Mega168 schon krass sensibel sein 
wenn er darauf resgiert. Das kabel ist etwa 7cm lang und isoliert.
Am Ende gibts irgendein Problem am Board, ich weiß grade nicht mehr 
weiter.

von Karl H. (kbuchegg)


Lesenswert?

Drahtbrücke schrieb:

> Das müsste doch eigentlich gehen, oder? Tut es aber nicht. Die led
> müsste ja angehen wenn ich 5 Volt an Pin 2 anlege. Stattdessen passiert
> gar nichts. Erst wenn ich das Kabel abziehe, also Pin2 wieder öffne,
> geht sie an.

Du schreibst jetzt hundert mal:

Ich soll nicht davon ausgehen, dass ein Input Pin ohne irgendwelche 
Zusätzbeschaltung einen 0 Pegel hat.

Ein auf Input geschalteter Pin kann irgendeinen Pegel haben. Und ja, das 
kann auch 1 sein.

Genau aus dem grund gibt es die Pullup-WIderstände, mit denen man einem 
Pin gezielt eine 1 verpassen kann, wenn ihm von aussen kein Pegel 
aufgezwungen wird. Und die Aussenbeschaltung zieht dann den Pin auf 0, 
wenn sie schalten will.

> Aber das wäre dann ja "FALLING".

Nicht unbedingt.
Wenn du mit einem Kabel an diesen Anschluss tippst, dann sieht das nur 
für sich so aus, dass du in einem Moment eine Verbindung hast und im 
nächsten nicht mehr. Für den µC sieht es aber so aus, als ob da ein 
irrer Ivan wie ein Besessener den Pin auf 1, Pin auf 0, Pin auf 1, etc. 
schaltet ehe er dann nach (für den µC laaaanger Zeit) irgendwann sich 
mal mit sich selbst einigt, ob der Pin jetzt 1 sein soll, oder (in 
deinem Fall) der Pin wieder tun und lassen kann was er will.

> Also müsste der Mega168 schon krass sensibel sein
wenn er darauf resgiert.

ist er auch.
Und du bist eine erstklassige Antenne. Du fängst jedes 
elektromagnetische Streufeld in deiner Umgebung ein und ... in diesem 
Fall ... gibst das Potential an den Eingang weiter. Und 
elektromagnetische Felder gibt es in unserer heutigen Zeit massenhaft. 
Jedes Kabel in der Wand sendet ein, wenn auch schwaches, 50Hz Feld aus, 
Radio, Fernsehen, Handy, jeder Elektromotor in deiner Umgebung, ....

von Drahtbrücke (Gast)


Lesenswert?

Pullup-Widerstand habe ich schon ausprobiert: nix.
mit kondensatoren entprellter taster bringt leider auch keinen erflog.

von Karl H. (kbuchegg)


Lesenswert?

Drahtbrücke schrieb:
> Pullup-Widerstand habe ich schon ausprobiert: nix.

Zeigen
und beschreiben was du gemacht hast.


Es muss sein:
* Im Programm Pullup Widerstand ein.
* Mit deinem Draht verbindest du den Pin mit MASSE (GND)
  und nicht mit +5V (Vcc)


Wenn das nicht klappt, dann hast du deinen µC zumindest an diesem Pin 
geschrottet.

von Drahtbrücke (Gast)


Lesenswert?

^^ das heißt, wenn icht Pin2 verlängern will um den Schalter woanders 
anzubringen, muss ich ein abgeschirmtes kabel nehmen oder mir ne 
schaltung kreieren die nicht so empfindlich ist und dann den pin 
schaltet, oder?

von Karl H. (kbuchegg)


Lesenswert?

Drahtbrücke schrieb:
> ^^ das heißt, wenn icht Pin2 verlängern will um den Schalter woanders
> anzubringen,

Ja, wenn du den Schalter 50 Meter entfernt anbringen willst, dann sollte 
man mal darüber nachdenken :-)

von Karl H. (kbuchegg)


Lesenswert?

Und ich frage dich ein letztes mal:

Hast du
 * Pullup ein
 * den Schalter so angeschlossen, dass er nach Masse schaltet und
   nicht nach +5V

von Drahtbrücke (Gast)


Lesenswert?

neues programm:

/*led mittels Interupt einschalten
*/


int led=13;   //LED an pin 13

void einschalten ()
{
digitalWrite(led, HIGH);
}

void setup ()
{
    pinMode(led, OUTPUT);
    pinMode(2, INPUT);
    digitalWrite(2, HIGH);
    attachInterrupt(0, einschalten, FALLING);

  }

void loop()
{
}


FALLING und RISING macht aber keinen Unterschied, beides geht nur wenn 
ich gegen GND schalte
Gestern gings irgendwie gar nicht aber das es soweit geht ist ja schon 
mal nicht schlecht.

von Karl H. (kbuchegg)


Lesenswert?

Drahtbrücke schrieb:

> void setup ()
> {
>     pinMode(led, OUTPUT);
>     pinMode(2, INPUT);
>     digitalWrite(2, HIGH);
>     attachInterrupt(0, einschalten, FALLING);
>
>   }

und wo schaltest du da den Pullup ein?

Wenn du einen Pin, der sowieso schon auf INPUT steht, nochmal auf INPUT 
schaltest, dann ist das schön. Aber es schaltet den Pullup nicht ein.
Noch nicht mal auf einem Arduino.

http://arduino.cc/en/Reference/pinMode

von Drahtbrücke (Gast)


Lesenswert?

und der restlichte plan sah so aus:
-Controller im PC
-Schalter etwa 3m weg, aber Kabel liegt neben 230V Leitung :-(

weiß nicht wie das E-Wellen mäßig in nem PC aussieht

von Drahtbrücke (Gast)


Lesenswert?

>     digitalWrite(2, HIGH);

das schaltet den Pullup ein , steht zumindest so in dem "Arduino 
Programmier-Handbuch" von freeduino.de

von Karl H. (kbuchegg)


Lesenswert?

Drahtbrücke schrieb:
>>     digitalWrite(2, HIGH);
>
> das schaltet den Pullup ein , steht zumindest so in dem "Arduino
> Programmier-Handbuch" von freeduino.de


Entschuldigung. Ich war so darauf fixiert da ein

     pinMode(2, INPUT_PULLUP);

zu lesen, dass ich diese Ausgabe übersehen habe.

Ja, das sollte es.
Gehts mit einem kurzen Kabel?

von Drahtbrücke (Gast)


Lesenswert?

nein geht nicht. selbst mit der geringst möglichen kabellänge ist es 
noch wie vorher.

von Karl H. (kbuchegg)


Lesenswert?

> FALLING und RISING macht aber keinen Unterschied,
> beides geht nur wenn ich gegen GND schalte

Ähm.
Ja.

Genau das ist auch das erwartete Verhalten!

Durch den Pullup hat der Pin einen 1 Pegel und du musst ihn gegen GND
schalten um etwas zu bewirken.

Das ist völlig normales Verhalten.
Gewöhn dich daran. Programmtechnisch ist es doch völlig wurscht, ob ein
gedrückter Taster jetzt eine 1 oder eine 0 liefert. Aber durch den
Pullup kannst du dir das nicht mehr aussuchen. Ein gedrückter Taster
liefert eine 0, weil ein gedrückter Taster den Pin mit GND verbindet. 
Und das muss auch so sein, weil beim nicht gedrückten Taster der Pullup 
den Pin auf 1 zieht.

Sonst würdest du einen Pulldown brauchen. Den hat aber der µC nicht 
eingebaut.

von Drahtbrücke (Gast)


Lesenswert?

Und was muss ich machen damit es einen Unterschied bei RISING und 
FALLING gibt?

von Karl H. (kbuchegg)


Lesenswert?

Drahtbrücke schrieb:
> Und was muss ich machen damit es einen Unterschied bei RISING und
> FALLING gibt?

Du musst den Taster entprellen.
Wie schon gesagt: Ein mechanischer Kontakt stellt nicht schlagartig eine 
Verbindung her! Das ist eher ein  auf/zu/auf/zu bis sich der Zustand 
dann auf zu einpendelt. D.h. du HAST hier tzatsächlich einen RAISING 
bzw. einen FALLING Edge Interrupt.

Und genau aus dem Grund sind Interrupts auch unbrauchbar, bzw. gar nicht 
nötig um einen Taster abzufragen. Du kannst einen Taster sowieso nicht 
schneller als in ein paar Zehntel-Sekunden drücken und wieder loslassen. 
So schnell bist du nicht. Für einen µC sind ein paar Zehntel Sekunden 
aber eine halbe Ewigkeit, in der er ein paar tausend mal nachsehen kann, 
ob du den Taster gedrückt hast oder nicht.



unglaublich, jetzt müssen wir schon die Arduino Jünger dazu bekehren, 
dass Taster entprellt werden müssen und das man das nicht mit Interrupts 
macht.

von Karl H. (kbuchegg)


Lesenswert?

http://playground.arduino.cc/Code/Bounce

Dachte ich mirs doch. Gibt es doch schon alles fix&fertig.

von Drahtbrücke (Gast)


Lesenswert?

Tatsächlich! Taster entprellt & es geht!
Vielen Dank!

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.