Diskussion:Veranstaltungsreihe/Mikrocontroller Workshop: Unterschied zwischen den Versionen

Aus LaborWiki
Wechseln zu: Navigation, Suche
Keine Bearbeitungszusammenfassung
 
K (Marcus verschob die Seite Diskussion:Microcontroller Workshop nach Diskussion:Veranstaltungsreihe/Mikrocontroller Workshop, ohne dabei eine Weiterleitung anzulegen)
 
(6 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
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
     PORTC = 0xFF;
     PORTB = _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3); // Pull-Ups von PB0 - PB3 aktivieren
     while (1) { 
     while (1) { 
  PORTC = PINB;
  PORTC = PINB;
Zeile 14: 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.
 
Hier gibts ein Tutorial rund um den Atmel: [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial Atmel-GCC-Tutorial] <br>
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.

Aktuelle Version vom 28. November 2014, 02:51 Uhr

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.