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