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.
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, ....
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.
^^ 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?
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 :-)
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.
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
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
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?
> 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.
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.