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.
Thomas wrote:
> Woran kann das liegen?
Versuchs mal so:
if (PIND & (1<<PIND2))
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.
Kann es damit zu tun haben das PD2 als Interupt genutzt wird?
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????
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).
ich denke, dass die Ursache die fehlenden Klammern sind.... Otto
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.
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
Thomas wrote: > if (!(PIND & (0<<PIND2))) > steuerung = 1; > > > damit geht es. Glaube ich nicht...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.