Diskussion:Veranstaltungsreihe/Mikrocontroller Workshop: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
(Umlaute korrigiert, Programm jetzt mit Pull-Ups) |
||
Zeile 2: | Zeile 2: | ||
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. | 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> | #include <avr/io.h> | ||
int main(void) { | int main(void) { | ||
DDRC = 0xFF; | DDRC = 0xFF; // PORT C komplett als Ausgang | ||
DDRB = | 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) { | while (1) { | ||
PORTC = PINB; | PORTC = PINB; | ||
Zeile 13: | Zeile 15: | ||
} | } | ||
Wenn man nun einen Taster | 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 | 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- | 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 | Gibt es auch eine Software Lösung? | ||
In dem Testprogramm lief das doch | In dem Testprogramm lief das doch einigermaßen passabel. | ||
Könnte irgendjemand das Testprogramm hier veröffentlichen? | |||
Ja, das ist ganz einfach. Man muss | 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: [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial Atmel-GCC-Tutorial] <br> | Hier gibts ein Tutorial rund um den Atmel: [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial Atmel-GCC-Tutorial] <br> |
Version vom 23. Januar 2011, 11:00 Uhr
Probleme mit der Ansprache der Taster
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:
apt-get install avr-binutils E: Konnte Paket avr-binutils nicht finden
Toolchain funktioniert aber trotzdem.