Diskussion:Microcontroller Workshop

Aus LaborWiki
Wechseln zu: Navigation, Suche

Probleme mit der Ansprache der Taster[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:[Bearbeiten]

apt-get install avr-binutils E: Konnte Paket avr-binutils nicht finden

Toolchain funktioniert aber trotzdem.