PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : tasten betätigung zählen



Nadors
01.03.2006, 18:58
moin,
ich möchte ein programm schreiben welches beim 4 tasten druck eine LED leuchten lässt.


#include <avr/io.h>

int i=0;

int main()
{
DDRB |= (1 << PB0);
PORTD|= (1 << PD2);

while (1)
{
if (PIND & (1 << PD2))
i=i+1;
if (i==4)
PORTB &= ~(1 << PB0);
else
PORTB |= (1 << PB0);
}
return 0;
}


geht aber nicht, die LED bleibt aus. deswegen hab ich mal
int i = 5
if (i>=4)
gemacht um zusehen woran es liegt. jetzt blinkt die LED allerdings.
kann mir jemand sagen woran es liegt?

ich benutze einen atmega8 auf den myavr board.

danke

mfg, nadors

kanal28
01.03.2006, 20:31
Das Problem dürfte darin liegen, dass der atmega8 die while-Schleife ständig (ziemlich schnell) durchläuft. In der Zeit, in der Du die Taste gedrückt hälst, zählt er folglich i immer weiter hoch. In der Variante (i == 4) ist die Bedingung also nur sehr kurz erfüllt, bei (i>=4) kommt es irgendwann zu einem Überlauf und i ist negativ, die LED schaltet um, bis i wieder größer 3 ist...

Wenn Du den Tastendruck zählen willst, musst Du die Taste entprellen und sicherstellen, dass er jedes Drücken nur einmal zählt. (geht sicher professionell auch - ich helfe mir einfach damit, dass ich in einer while-Schleife auf den Tastendruck warte, dann einen Moment Zeit vergehen lasse und danach mit einer while-Schleife warte, bis die Taste losgelassen ist; dann wieder von vorn)

Nadors
02.03.2006, 13:43
könntest du vielleicht den code posten? irgendwie bekomme ich das nicht hin.

kanal28
02.03.2006, 19:13
schau Dir mal die zwei Seiten an:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#.28Tasten-.29Entprellung
http://www.mikrocontroller.net/articles/Entprellung

Da sind auch code-Beispiele dabei - die sollten die wesentlichen Fragen klären.

Viel Erfolg!