Diskussion:Veranstaltungsreihe/Mikrocontroller Workshop: Unterschied zwischen den Versionen

Aus LaborWiki
Wechseln zu: Navigation, Suche
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  = 0x00;
     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 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.
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.
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 PORTB1 bis PORTB4 m�ssen mit einem hohen Widerstand z.B. 10 k&#937; auf 5 V gezogen werden. Mir ist aufgefallen, dass die Taster so auch unanf�lliger f�r St�rungen sind.
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&#937; 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?  
Gibt es auch eine Software Lösung?  
In dem Testprogramm lief das doch einigerma�en passabel.
In dem Testprogramm lief das doch einigermaßen passabel.
   
   
K�nnte irgendjemand das Testprogramm hier ver�ffentlichen?
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.
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.