INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
digitalRead unerwartetes Verhalten
03.01.2015, 10:55
Beitrag #1
digitalRead unerwartetes Verhalten
Hallo zusammen,

ich hab mal wieder eine Anfängerfrage und weiß nicht ob ich einen Fehler gemacht habe oder es einfach nur falsch verstehe.
Ich habe mit meinem Mini Pro ein paar der Beispiel Sketches durchgearbeitet und wollte mir dann einen Taster bauen. Dabei habe ich folgenden Code geschrieben:
Code:
int ledPin = 13;
int inPin = 7;
int val = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(inPin, INPUT);
}

void loop()
{
  val = digitalRead(inPin);
  Serial.print(val);
  digitalWrite(ledPin, val);
  delay(2000);
}
An Pin 7 habe ich über einen Taster plus angelegt und an Pin 13 habe ich nichts angelegt da dort auf meinem Mini Pro ein onboard LED angeschlossen ist. Da das LED für mich nicht nachvollziehbar geleuchtet hat, habe ich die Konsolenausgaben hinzugeügt und dabei folgendes Verhalten festgestellt:
Zu Beginn ist val 0 was ich auch erwarte. Dann drücke ich den Taster und gebe damit ein Signal auf Pin 7 und dann wird val 1, auch das habe ich so erwartet. Lasse ich nun den Taster wieder gehen bleibt val allerdings 1. Ich hätte erwartet dass in dem Moment in dem ich den Taster loslasse val wieder 0 wird. Da ich das nicht so ganz nachvollziehen konnte habe ich an Pin 7 mal Masse angeschlossen. Solange ich dort Masse angelegt habe ist val wieder 0. Nehme ich die Masse wieder weg ist val wieder 1.
Um diesen Lösungsvorschlag vorweg auszuschließen, ich weiß dass ich den Taster 2 Sek. lang drücken muss weil ich im Loop schließlich ein Delay von 2 Sek. eingebaut habe. Das habe ich nur gemacht damit die Konsole nicht zugespammt wird.

Habe ich einen Fehler gemacht oder ist das so richtig? Ich hätte erwartet dass val genau so lange 1 ist wie ich den Taster gedrückt halte oder mit anderen Worten, so lange wie an Pin 7 ein Signal anliegt.

Gruß
MeRo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2015, 11:33 (Dieser Beitrag wurde zuletzt bearbeitet: 03.01.2015 11:34 von MeRo113.)
Beitrag #2
RE: digitalRead unerwartetes Verhalten
[Bild: Schaltunga55c2.png]
Link

Hoffe das reicht, die Schaltung ist ja recht simpel (:
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2015, 11:53
Beitrag #3
RE: digitalRead unerwartetes Verhalten
(03.01.2015 11:37)Zorg schrieb:  da fehlt der Pullup- bzw. Pulldown- Widerstand --- siehe meine angehängte Grafik

Moin,
deswegen immer den Taster gegen GND schalten und in der CPU den Pull Up einschalten. Das ist zwar für Positiv denkende Anfänger immer eine Umstellung doch so arbeitet es sich leichter und man spart sich den zusätzlichen Widerstand.
also
pinMode(PinNr, OUTPUT); // als Ausgang definieren
digitalWrite(PinNr, HIGH); // damit schaltet man dann den Pull Up ein

val = !digitalRead(PinNr); // durch das ! wird der gelesene Wert invertiert und die Anfängerwelt ist wieder in Ordnung da in bei gedrückter Taste dann in val eine 1 steht.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2015, 11:59
Beitrag #4
RE: digitalRead unerwartetes Verhalten
Hey Zorg,

danke für die Hilfe. Habe mir gerade mal auf paar Seiten bisschen was zu Pull Up/Down Widerständen durchgelesen. Wenn ich es richtig verstehe ist ein Pull Up/Down Widerstand ein ganz normaler Widerstand oder? Daher habe ich wie auf deinem Schaltplan einen 10k Ohm Widerstand an den Taster gehangen. Aber leider bringt das auch keine Veränderung.

[Bild: Schaltung20c0c7.png]
Link

Gruß
MeRo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2015, 12:25
Beitrag #5
RE: digitalRead unerwartetes Verhalten
Vielen Dank für eure Hilfe, jetzt funktioniert es endlich Big Grin

Für alle die mit dem gleichen Problem zu kämpfen haben hier nochmal die Schaltung und der dazugehörige Code:
[Bild: Schaltung37792b.png]
Link

Code:
int led = 13;
int in  = 7;
int val = 0;

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(in, INPUT);
  digitalWrite(in, HIGH);
}

void loop()
{
  val = !digitalRead(in);
  digitalWrite(led, val);
}

Gruß
MeRo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2015, 13:23
Beitrag #6
RE: digitalRead unerwartetes Verhalten
(03.01.2015 12:25)MeRo113 schrieb:  ....
Für alle die mit dem gleichen Problem zu kämpfen haben ....

Hallo,
na eigentlich ist das kein Problem sondern Elektronik/Mikrokontroller Basiswissen...Big Grin

Lustiger wird es dann wenn du folgende Aufgabe lösen willst:
Schalte mit einem Tastendruck die LED ein und mit einem weiteren Tastendruck wieder aus....also die Funktion von einem Stromstossschalter nachbauen. Dann hast du plötzlich das Problem das der Taster prellt...und das kann man Softwaremäßig abfangen... da darfst du dich dann mal austoben...Wink
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2015, 17:11
Beitrag #7
RE: digitalRead unerwartetes Verhalten
Für die einen ist es Basiswissen und für die anderen ein Problem Big Grin

Zu deiner "Aufgabe", da muss man sich ja nur den Status speichern und invertieren.
Code:
int status = 0;

void loop()
{
  val = !digitalRead(in);
  if (val == 1) {
    status = !status;
  }
  
  digitalWrite(led, status);
}

Dort könnte man jetzt noch einen Schutz einbauen damit der Taster nicht gedrückt bleibt, in etwa so:

Code:
int status = 0;
int last = 0;

void loop()
{
  val = !digitalRead(in);
  if (val == 1 && last == 0) {
    status = !status;
  }
  last = val;
  
  digitalWrite(led, status);
}

Die Code Seite ist bei mir weniger das Problem als eben das einfache Elektrotechnik Basiswissen ):
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2015, 20:15 (Dieser Beitrag wurde zuletzt bearbeitet: 03.01.2015 20:16 von Bitklopfer.)
Beitrag #8
RE: digitalRead unerwartetes Verhalten
(03.01.2015 17:11)MeRo113 schrieb:  ....
Dort könnte man jetzt noch einen Schutz einbauen damit der Taster nicht gedrückt bleibt, in etwa so:

Code:
int status = 0;
int last = 0;

void loop()
{
  val = !digitalRead(in);
  if (val == 1 && last == 0) {
    status = !status;
  }
  last = val;
  
  digitalWrite(led, status);
}

..okay...gut so.
Und hast den Code auch mal praktisch getestet ? Toggelt das Licht dann auch zuverlässig ?....da habe ich so nämlich berechtigte Zweifel...Big Grin
lg
bk


Die Code Seite ist bei mir weniger das Problem als eben das einfache Elektrotechnik Basiswissen ):

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste