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, ....
Pullup-Widerstand habe ich schon ausprobiert: nix. mit kondensatoren entprellter taster bringt leider auch keinen erflog.
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 :-)
Und ich frage dich ein letztes mal: Hast du * Pullup ein * den Schalter so angeschlossen, dass er nach Masse schaltet und nicht nach +5V
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
> digitalWrite(2, HIGH);
das schaltet den Pullup ein , steht zumindest so in dem "Arduino
Programmier-Handbuch" von freeduino.de
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?
nein geht nicht. selbst mit der geringst möglichen kabellänge ist es noch wie vorher.
> 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.
Und was muss ich machen damit es einen Unterschied bei RISING und FALLING gibt?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.