Diskussion:Veranstaltungsreihe/Mikrocontroller Workshop
Probleme mit der Ansprache der Taster[Quelltext bearbeiten]
Bei dem folgenden kleinen Testprogramm sollte der Eingang der Ports B, also der Taster, direkt auf den Port C kopiert werden, an dem sich die Dioden befinden.
// korrigierte Version #include <avr/io.h> int main(void) { DDRC = 0xFF; // PORT C komplett als Ausgang DDRB = _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3); // Pins mit Taster (PB0 - PB3) als Eingang setzen PORTB = _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3); // Pull-Ups von PB0 - PB3 aktivieren while (1) { PORTC = PINB; } return 0; }
Wenn man nun einen Taster drückt, geht die entsprechende Diode für diesen Taster ca. 3 Sekunden aus (Low-Active). Drückt man während dieser Zeit erneut auf den Taster wird die Zeit, die die Diode ausgeschaltet auf weitere 3 Sekunden erhöht. Wie soll man denn so eine vernünftige Abfrage der Taster programmieren, die einen Taster öfter als 1-mal pro 3 Sekunden abfragen kann.
Eine Hardware-Lösung sind Pullup-Widerstände. Dass heißt die PORTB0 bis PORTB3 müssen mit einem hohen Widerstand z.B. 10 kΩ auf 5 V gezogen werden. Mir ist aufgefallen, dass die Taster so auch unanfälliger für Störungen sind.
Gibt es auch eine Software Lösung? In dem Testprogramm lief das doch einigermaßen passabel.
Könnte irgendjemand das Testprogramm hier veröffentlichen?
Ja, das ist ganz einfach. Man muss zusätzlich noch die Internen Pullup Widerstände des Controllers aktivieren. Die sin aktiv, wenn man eine 1 in das entsprechende Bit des PORT Registers schreibt, während der Pin auf Eingang gestellt ist.
Hier gibts ein Tutorial rund um den Atmel: Atmel-GCC-Tutorial
Dort gibt es auch einen Abschnitt ueber softwaremaessige Tastenentprellung.
ubuntu 8.04:[Quelltext bearbeiten]
apt-get install avr-binutils E: Konnte Paket avr-binutils nicht finden
Toolchain funktioniert aber trotzdem.