| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| de:examples:digi:switch [2011/08/19 13:11] – wittkoepper | de:examples:digi:switch [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
|---|
| |
| |
| Die Störanfälligkeit macht die Nutzung von Schaltern kompliziert. Die am häufigsten verwendete Methode um dies zu verhindern, ist den Input des Microcontrollers durch einen Widerstand an die Erde oder das Inputpotential anzuschließen. Einen so benutzten Widerstand nennt man einen pull-down oder pull-up Widerstand. Normalerweise liegt der Widerstand eines pull-down oder pull-up zwischen 1kΩ bis 1 MΩ. Wenn der Schalter offen ist, wird der Input mit der Spannung des Widerstands geladen, wenn man den Schalter schließt, empfängt der Input die Spannung des Schalters, da der Leitungswiderstand des Schalters im Vergleich zum Widerstand beinahe 0 ist. Allgemein kann er als volt-box bezeichnet werden. | Die Störanfälligkeit macht die Nutzung von Schaltern kompliziert. Die am häufigsten verwendete Methode um dies zu verhindern, ist den Input des Microcontrollers durch einen Widerstand an die Erde oder das Inputpotential anzuschließen. Einen so benutzten Widerstand nennt man einen pull-down oder pull-up Widerstand. Normalerweise liegt der Widerstand eines pull-down oder pull-up zwischen 1kΩ bis 1 MΩ. Wenn der Schalter offen ist, wird der Input mit der Spannung des Widerstands geladen, wenn man den Schalter schließt, empfängt der Input die Spannung des Schalters, da der Leitungswiderstand des Schalters im Vergleich zum Widerstand beinahe 0 ist. Allgemein kann er als "volt-box" bezeichnet werden. |
| |
| |
| |
| [{{ :examples:digi:switch:switch_input_pull-up.png?200|Switch connection scheme with pull-up resistor}}] | [{{ :examples:digi:switch:switch_input_pull-up.png?200|Schalter-Anschluss Schema mit einem pull-up Widerstand}}] |
| |
| |
| |
| |
| Ein einfacher zwei-Kontakt Schalter kann als Sensor mit einen pull-up oder pull-down Widerstand genutzt werden, der Schalter wird mit einem Kontakt am Input verbunden und der andere am Widerstand. Normalerweise haben Microcontroller eingebaute pull-up/down Widerstand Optionen, daher ist es nicht notwendig ein Widerstand in den Schaltkreis einzubauen. | Ein einfacher zwei-Kontakt Schalter kann als Sensor mit einen pull-up oder pull-down Widerstand genutzt werden. Hierzu wird ein Kontakt des Schalters mit dem Input verbunden und der andere mit dem Widerstand. Normalerweise haben Mikrocontroller eingebaute pull-up oder down Widerstände, daher ist es nicht notwendig einen Widerstand in den Schaltkreis einzubauen. |
| Zum Beispiel, AVR Microcontroller haben 20 kΩ – 50 kΩ pull-up Widerstände an ihren I/O Pins. | AVR Mikrocontroller haben beispielsweise 20 kΩ – 50 kΩ pull-up Widerstände an ihren I/O Pins. |
| Es muss noch erwähnt werden, dass mechanische Schalter ein weiteres Problem haben - "switch bounce". Dies bedeutet, dass beim Schalten in sehr kleinen Abständen die Verbindung abreißt durch die Schwingung des mechanischen Schalters. In den Beispielen dieses Kapitels werden nicht durch Switch bounce beeinflusst, das Problem wird im nächsten Kapitel bearbeitet. | Darüber hinaus muss noch erwähnt werden, dass mechanische Schalter ein weiteres Problem haben, den "switch bounce". Hierdurch wird beim Schalten in sehr kleinen Abständen die Verbindung durch die Schwingung des mechanischen Schalters unterbrochen. Die Beispiele dieses Kapitels werden nicht durch den "switch bounce" beeinflusst, das Problem wird im nächsten Kapitel ausführlicher bearbeitet. |
| | |
| |
| ===== Übung ===== | ===== Übung ===== |
| |
| Es gibt drei Druckknopf-Schalter am digitalen I/O Modul. Diese Schalter verbinden die Pins den Microcontrollers mit der Erde, aber nicht direkt durch einen Widerstand, um einen Kurzschluss zu vermeiden, wenn der Knopf gedrückt wird, während der Pin als Output definiert ist. Die Schalter haben einen pull-up Widerstand, aber diese haben einen viel größeren Widerstand als Schutzwiderstände, daher liegt beim Drücken des Schalter eine Spannung von nur nahe 0V am Pin an. | Es gibt drei Druckknopf-Schalter am digitalen I/O Modul. Diese verbinden die Pins den Mikrocontrollers mit der Erde, aber nicht direkt durch einen Widerstand. Auf diese Weise soll ein Kurzschluss vermieden werden, wenn der Knopf gedrückt wird, während der Pin als Output definiert wird. Die Schalter besitzen einen pull-up Widerstand, welcher aber einen viel größeren Widerstand als die Schutzwiderstände hat, daher liegt beim Drücken des Schalter eine Spannung von nahezu 0 V am betreffenden Pin an. |
| |
| Die Schalter sind an den PC0, PC1 und PC2 Pins. Um den Status der Schalter zu lesen müssen die Pins des Microcontorllers als Input gesetzt werden. Man benötigt nicht die internen pull-up Widerstände des AVRS, da die Pins schon externe Widerstände haben. | Die Schalter befinden sich an den PC0, PC1 und PC2 Pins. Um den Status der Schalter zu lesen müssen die betreffenden Pins des Mikrocontrollers als Input gesetzt werden. Man benötigt nicht die internen pull-up Widerstände des AVR, da die Pins schon externe Widerstände haben. |
| Wenn der Knopf gedrückt wird, hat der entsprechende Bus des Pins den Wert 0, wenn der Knopf losgelassen wird, den Wert 1. LED Indikatoren können benutzt werden, um der Micrcontroller den Status den Knopfs verstanden hat. | Wenn der Schalter betätigt wird, hat der entsprechende Bus des Pins den Wert 0, wird er losgelassen, den Wert 1. Mit Hilfe von LED Indikatoren kann überprüft werden, ob der Mikrocontroller den Status den Schalters verstanden hat. |
| |
| Der Beispielcode um die Knöpfe zu nutzen basiert auf der HomeLab Pins Library, welche im LED Abschnitt eingeführt wurde. | Der Beispielcode zur Benutzung der Schalter basiert auf der HomeLab Pins Bibliothek, welche im LED Kapitel eingeführt wurde. |
| |
| | |
| <code c> | <code c> |
| // | // |
| // Program for testing the buttons of the Digital i/o module | // Program zum Testen der Schalter des digitalen I/O Moduls |
| // | // |
| #include <homelab/pin.h> | #include <homelab/pin.h> |
| |
| // | // |
| // Determining the pins of LED-d and buttons. | // Festlegung der Pins von LED-d sowie der Schalter. |
| // | // |
| pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; | pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; |
| |
| // | // |
| // Main program | // Hauptprogramm |
| // | // |
| int main(void) | int main(void) |
| unsigned char i; | unsigned char i; |
| |
| // Setting the LED pins as outputs and buttons pins as inputs. | // Setzt die LED Pins als Output und die Schalter-Pins als Input. |
| for (i = 0; i < 3; i++) | for (i = 0; i < 3; i++) |
| { | { |
| } | } |
| | |
| // Endless cycle | // Endlosschleife |
| while (true) | while (true) |
| { | { |
| // Each button has a corresponding LED, | // Jeder Schalter hat eine zugehörige LED, |
| // which lights when button is pressed. | // die aufleuchtet, wenn er betätigt wird. |
| for (i = 0; i < 3; i++) | for (i = 0; i < 3; i++) |
| { | { |
| </code> | </code> |
| |
| Im Beispiel werden LEDS und Knöpfe als Array definiert - das erlaubt es Sie im //for// loop zu nutzen. Wenn das Programm startet, sind die LED Pins als output und die Knöpfe als Input gesetzt. In der Endlosschleife des Programms wird ein konstant der Status der Knöpfe abgefragt, welcher den Status der dazugehörigen LED bestimmt. Der erste Knopf ist für die grüne LED, der Zweite für die Gelbe und der Dritte für die Rote. | Im Beispiel werden LEDS und Knöpfe als Array definiert - das ermöglicht es Sie in einer //for// Schleife zu nutzen. Wird das Programm gestartet, werden die LED Pins als Output und die Schalter als Input gesetzt. In der Endlosschleife des Programms wird durchgehend der Status der Schalter abgefragt, welcher den Status der dazugehörigen LED bestimmt. Der erste Schalter ist für die grüne LED, der Zweite für die Gelbe und der Dritte für die Rote. |
| | |
| | |
| | |
| /* | |
| Aufmerksamen Lesern fällt, trotz der Einfachheit des kompilierten Programms auf, dass es etwas größer ist als angenommen. Der Grund dafür ist, dass die Pins der LEDs und Knöpfe als Array definiert sind, und wie in der LED Übung gesagt, vereinfacht der Compiler keine Arrays aus Pins. Das kompilierte Programm würde viel kompakter sein wenn alle LEDs und Knöpfe individuell bearbeitet würden oder //for//loop, aber in diesem Fall würde den Quellcode länger und monotoner sein. Wenn man mit drei Knöpfen und drei LEDs arbeitet, ist es schwer sich für den einen oder anderen Weg zu entscheiden, falls die Zahl jedoch größer wird, wird es immer effektiver Arrays zu nutzen, anstatt für jeden Knopf/LED eine Zeile Code zu schreiben. | |
| */ | |