www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wert eines Knopfes lesen


Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Leute!

Nachdem mein ATMega8 wieder lebt, wollte ich endlich ein Programm 
schreiben, das alle Ein- und Ausgänge prüft.

Als Ausgänge habe ich nur 4 LEDs (verbunden an PORTC0-3), und die kann 
ich problemlos steuern (mit einem anderen Programm alle einzelnen 
geprüft).
Dazu habe ich zwei Eingänge (angeschloßen an PORTD2+3).

Als Testprogramm habe ich was in der Art geschrieben:
// PORTD2 und 3 als Eingang
DDRD &= ~(1<<2);
DDRD &= ~(1<<3);
// PORTC0-3 als Ausgang
DDRC |= (1<<0) | (1<<1) | (1<<2) | (1<<3);

while(1 == 1)
{
  if(bit_is_set(PIND_PIN, 2))
    PORTC &= ~2;
  else
    PORTC |= 2;
}

Nun bleibt das LED2 immer an, egal ob ich die Taste drucke oder nicht...
Die Taste habe ich zwischen +5V und PORTD2 angeschloßen.

Was mache ich jetzt falsches?

Danke
Luca Bertoncello

Autor: Armin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
heißt das Eingangsregister wirklich PIND_PIN?

Pulldown-Widerstände an den Eingängen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luca Bertoncello schrieb:
> Die Taste habe ich zwischen +5V und PORTD2 angeschloßen.
>
> Was mache ich jetzt falsches?

Du legst nie 0V an und damit bleibt der Pin auf 5V geladen, bzw. holt 
sich 50Hz Störungen rein.

Besser daher, die Taste nach GND legen und den internen Pullup 
einschalten.

Taste gedrückt: 0V über die Taste
Taste losgelassen: 5V über den Pullup


Peter

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luca Bertoncello schrieb:
> Die Taste habe ich zwischen +5V und PORTD2 angeschloßen.

Neben dem schon angesprochen PIND_PIN schaltest du mit deinem Taster den 
Pin zwischen +5V und undefiniert.

Wenn du den Taster an die Versorgungsspannung hängst, brauchst du noch 
einen Pull-down-Widerstand. Oder verbinde den Schalter mit Taster, und 
aktiviere die Pull-Ups im AVR.

Oliver

Autor: Luca Bertoncello (lucabert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:

> Neben dem schon angesprochen PIND_PIN schaltest du mit deinem Taster den
> Pin zwischen +5V und undefiniert.

Es ist nicht PIND_PIN, sondern einfach PIND... falsch kopiert... In 
meinem Code habe ich viele #define benutzt...

> Wenn du den Taster an die Versorgungsspannung hängst, brauchst du noch
> einen Pull-down-Widerstand. Oder verbinde den Schalter mit Taster, und
> aktiviere die Pull-Ups im AVR.

Aha! Also, einfach gesagt, am Ende, dort, sollte keinen Taster geben, 
sondern ein optischer Encoder (mit einem LM339 um das Signal zu 
übersetzen).
Aber jetzt verstehe ich schon mein Fehler... Ich habe einfach nicht 
gedacht, daß ich ein "undefined" habe, wenn der Taster nicht gedruckt 
ist.

Nun zwei Fragen:
1) Werde ich das gleiche Problem haben mit dem LM339? Ich denke nein, 
denn es immer was gültiges schicken soll (siehe Schaltung im Anhang).
2) Was sind diese Pull-Ups im AVR? Ist es was internes am ATMega? Wenn 
ja, wäre es eine Idee zum testen, ob das Programm geht... Wie nutze ich 
die?

Danke
Luca Bertoncello

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luca Bertoncello schrieb:
> 1) Werde ich das gleiche Problem haben mit dem LM339? Ich denke nein,
> denn es immer was gültiges schicken soll (siehe Schaltung im Anhang).

Ja, der "schickt" immer was gültiges.

Luca Bertoncello schrieb:
> 2) Was sind diese Pull-Ups im AVR? Ist es was internes am ATMega? Wenn
> ja, wäre es eine Idee zum testen, ob das Programm geht... Wie nutze ich
> die?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Oliver

Autor: High Performer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der LM339 hat open collector Ausgänge. Du musst also den internen Pullup 
einschalten (der LM339 schaltet seinen Ausgang gegen Masse durch).

Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Luca Bertoncello schrieb:
>> 1) Werde ich das gleiche Problem haben mit dem LM339? Ich denke nein,
>> denn es immer was gültiges schicken soll (siehe Schaltung im Anhang).
>
> Ja, der "schickt" immer was gültiges.
>
> Luca Bertoncello schrieb:
>> 2) Was sind diese Pull-Ups im AVR? Ist es was internes am ATMega? Wenn
>> ja, wäre es eine Idee zum testen, ob das Programm geht... Wie nutze ich
>> die?
>
> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Dieser habe kurz nach meiner Frage (ich blööööd!) gefunden... Besten 
Dank trotzdem...

Wegen der Frage, ob der LM339 immer was gültiges schickt.

Du sagst, daß es so macht, High Performer daß es OpenCollector ist.
Also, wen soll ich glauben? :D

Jedenfalls, mit oder ohne internen Pullup kriege ich keinen Wert vom 
LM339.
Es kann aber auch sein, daß das Problem dort liegt.

Ich werde in den nächsten Tagen ein Oszilloskop kriegen, mit dem ich 
messen werde, was der LM339 mir schickt.

Erstmal, besten Dank an allen!
Ich werde mich wahrscheinlich demnächst melden, wegen anderen 
Problemen... :D

Grüße
Luca Bertoncello

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.