Interrupt-Problem Arduino Uno / Mega168

Gast #3096801
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.
#3096813
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, ....
Gast #3096829
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?
Gast #3096853
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.
#3096858
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
#3096888
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.
#3096894
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren