www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Auselesn Pinzustand funktioniert nicht


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich brauche eure Hilfe!
mache mit:

if (PIND & (0<<PIND2))
steuerung = 1;

eine Abfrage und will somit den Zustand vom Pin PD2 haben (der ebenfalls 
als Interupt eingerichtet ist). An diesem Pin ist ein Taster 
angeschlossen. Bei betätigung werden die 5V auf Masse gelegt.

Jedoch wird steuerung nie 1 gesetzt. Selbst wenn ich auf 1 prüfe:

if (PIND & (0<<PIND2))


Woran kann das liegen? Die 5V bzw. 0V habe ich mit dem Mulimeter 
nachgemessen...das stimmt.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas wrote:

> Woran kann das liegen?

Versuchs mal so:
if (PIND & (1<<PIND2))

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh das war ein Feher von mir sorry...das wollte ich oben schon 
schreiben.
Da habe ich zwei mal das selbe stehen.
Also mit der Vorgeschlagenen Überprüfung habe ich es auch schon 
versucht...damit klappt es auch nicht.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es damit zu tun haben das PD2 als Interupt genutzt wird?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir keiner weiterhelfen?
Ich habe mal um die Pegel zu prüfen folgenden code geschrieben:


while(1)
{
timer_wait(1000);

if (PIND & (1<<PIND2))
fprintf(lcd, "\nTaster:\naus");

else if (PIND & (0<<PIND2))
fprintf(lcd, "\nTaster:\nein");

else
fprintf(lcd, "\nundefiniert:\nFehler");
}


Im Normalschaltzustand schreibt er "Taster aus" drücke ich den Taster 
kommt "undefiniert Fehler"...woran liegt das????

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if ( PINC & (1<<PINC1) ) {
  /* Aktion */
}

Otto

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist DDRD richtig gesetzt, sieht man im Codefetzen ja nicht? Und du hast 
zu viele Fälle im Sourcecode.

  DDRD |= (1<<PIND2); // PIND2 als Eingang schalten

  while(1)
  {
    timer_wait(1000);
    if (PIND & (1<<PIND2))
      fprintf(lcd, "\nTaster:\nOFFEN");
    else 
      fprintf(lcd, "\nTaster:\nGESCHLOSSEN");
  }


Wenn das nix bringt, dann die Hardware kontrollieren.

Der Taster sollte so angeschlossen sein, wie in der Bildhälfte ACTIVE 
LOW gezeigt, damit OFFEN und GESCHLOSSEN im Quellcode passen.
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Statt des externen Pullup-Widerstands kann auch der interne verwendet 
werden (PORTD |= (1<<PIND2); nach der DDRD Anweisung).

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denke, dass die Ursache die fehlenden Klammern sind....

Otto

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal den Wirrwarrcode logisch formatiert:
if (PIND & (1<<PIND2))  // wird WAHR, wenn 5V an PIND2 anliegen
  fprintf(lcd, "\nTaster:\naus");
else if (PIND & (0<<PIND2)) // wird NIE wahr (irgendwas & 0 ergibt 0)
        fprintf(lcd, "\nTaster:\nein");
     else // wird also WAHR, wenn keine 5V an PIND2 anliegen
        fprintf(lcd, "\nundefiniert:\nFehler");

Der Fall "Taster: ein" kann nie vorkommen. Wenn immer der Fall 
"undefiniert: Fehler" angezeigt wird, werden die 5V nie registriert. Das 
kann an einem falsch oder nicht gesetzten DDRD liegen.

Bei einem Verdacht auf Wechselwirkung mit dem Interrupt, würde ich den 
Interrupt mal probeweise nicht benutzen.

Nur der Vollständigkeit halber: Wenn es ein einfacher Taster ist, dann 
hält der ja nicht seine Position. Der Fall "Taster: aus" würde nur so 
lange angezeigt, wie der Taster gedrückt ist. Die Bezeichnung aus/ein 
ist hier ein leicht schizophren, daher habe ich oben Offen/Geschlossen 
geschrieben.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi
danke für die vielen Antworten...habe das Problem wie folgt gelöst:


if (!(PIND & (0<<PIND2)))
steuerung = 1;


damit geht es.

danke nochmal

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas wrote:

> if (!(PIND & (0<<PIND2)))
> steuerung = 1;
>
>
> damit geht es.

Glaube ich nicht...

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas wrote:
> hi
> danke für die vielen Antworten...habe das Problem wie folgt gelöst:
Himmel, lerns doch mal.

> if (!(PIND & (0<<PIND2)))
> steuerung = 1;
Das ist BLÖDSINN, da äquivalent zu
> if(1)
> steuerung = 1;

Ansonsten tipp Quelltext nicht ab, sondern kopier ihn bitte.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry ihr habt ja Recht,...habe die Prüfung

if (!(PIND & (1<<PIND2)))

verwendet!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.