Wert eines Knopfes lesen

OP #1754468
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
Gast #1754485
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
OP #1754514
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
Angehängte Dateien:
Gast #1754620
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
OP #1754722
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren