Forum: Mikrocontroller und Digitale Elektronik Auselesn Pinzustand funktioniert nicht


von Thomas (Gast)


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.

von Benedikt K. (benedikt)


Lesenswert?

Thomas wrote:

> Woran kann das liegen?

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

von Thomas (Gast)


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.

von Thomas (Gast)


Lesenswert?

Kann es damit zu tun haben das PD2 als Interupt genutzt wird?

von Thomas (Gast)


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????

von Otto (Gast)


Lesenswert?

if ( PINC & (1<<PINC1) ) {
  /* Aktion */
}

Otto

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ist DDRD richtig gesetzt, sieht man im Codefetzen ja nicht? Und du hast 
zu viele Fälle im Sourcecode.
1
  DDRD |= (1<<PIND2); // PIND2 als Eingang schalten
2
3
  while(1)
4
  {
5
    timer_wait(1000);
6
    if (PIND & (1<<PIND2))
7
      fprintf(lcd, "\nTaster:\nOFFEN");
8
    else 
9
      fprintf(lcd, "\nTaster:\nGESCHLOSSEN");
10
  }

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-Tutorial#Tasten_und_Schalter

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

von Otto (Gast)


Lesenswert?

ich denke, dass die Ursache die fehlenden Klammern sind....

Otto

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Mal den Wirrwarrcode logisch formatiert:
1
if (PIND & (1<<PIND2))  // wird WAHR, wenn 5V an PIND2 anliegen
2
  fprintf(lcd, "\nTaster:\naus");
3
else if (PIND & (0<<PIND2)) // wird NIE wahr (irgendwas & 0 ergibt 0)
4
        fprintf(lcd, "\nTaster:\nein");
5
     else // wird also WAHR, wenn keine 5V an PIND2 anliegen
6
        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.

von Thomas (Gast)


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

von Benedikt K. (benedikt)


Lesenswert?

Thomas wrote:

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

Glaube ich nicht...

von Sven P. (Gast)


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.

von Thomas (Gast)


Lesenswert?

sorry ihr habt ja Recht,...habe die Prüfung

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

verwendet!

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
Noch kein Account? Hier anmelden.