Forum: Mikrocontroller und Digitale Elektronik Wert eines Knopfes lesen


von Luca B. (lucabert)


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:
1
// PORTD2 und 3 als Eingang
2
DDRD &= ~(1<<2);
3
DDRD &= ~(1<<3);
4
// PORTC0-3 als Ausgang
5
DDRC |= (1<<0) | (1<<1) | (1<<2) | (1<<3);
6
7
while(1 == 1)
8
{
9
  if(bit_is_set(PIND_PIN, 2))
10
    PORTC &= ~2;
11
  else
12
    PORTC |= 2;
13
}

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

von Armin (Gast)


Lesenswert?

heißt das Eingangsregister wirklich PIND_PIN?

Pulldown-Widerstände an den Eingängen?

von Peter D. (peda)


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

von Oliver (Gast)


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

von Luca B. (lucabert)


Angehängte Dateien:

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

von Oliver (Gast)


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

von High Performer (Gast)


Lesenswert?

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

von Luca B. (lucabert)


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

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.