Materialien zum Unterricht

Der Controller lernt zählen

Ziel: Am Controller sind 8 Leuchtdioden und ein Schalter angeschlossen. Nach jedem Tastendruck geht in der Reihe die nächste Diode an. Sind nach 8 Tastendrücken alle an, gehen mit dem nächsten Druck alle aus und das Spiel beginnt von vorn.

Programm vorbereiten

Wir nehmen einfach den Quellcode aus dem letzen Projekt und löschen den Inhalt des gesamten Hauptprogrammes raus. Nur den Inhalt, nicht das Hauptprogramm!!

Vorbereitende Überlegungen

Das Hauptprogramm besteht wieder aus eine Endlosschleife while(1). Was muss in dieser Schleife gemacht werden? Es muss überprüft werden, ob der Taster gedrückt wurde. Ist das der Fall, muss am LED_PORT das nächste Pin von 1 auf 0 gesetzt werden.

Welche Problem treten auf?

Da die Schleife permanent läuft, reicht es nicht aus, den Schaltereingang einfach nur abzufragen. Denn dann würde ja bei jedem Schleifendurchlauf die nächste LED eingeschaltet werden und die Reihe wäre ruckzuck an. Wir müssen viel mehr fragen, ob der Taster gerade erst gedrückt wurde und dann in allen weiteren Durchläufen bis zum Loslassen des Tasters das Weiterzählen sperren.

Dazu verwenden wir eine Variable gedrueckt, die sich bis zum Loslassen des Tasters merkt, dass der Taster gedrückt ist.

Programmablaufplan

Der Programmablaufplan zeigt, wie das Problem zu lösen ist.

Der Programmabschnitt Pin mit der Nummer zaehler einschalten ist mit dem bekannten Makro SETZE_BIT(PORT, PIN) zu lösen.

Aufgabe: Setzte den Ablaufplan in ein lauffähiges Programm um und teste es.

Geht und geht doch nicht

Im AVR-Simulator funktioniert das Programm bei richtiger Programmierung tadellos. Wird es aber auf den Mikrocontroller übertragen und dort getestet, reagiert es ganz seltsam. Ein Drücken der Taste schaltet öfters mehr als eine LED an.

Ursache dafür ist das Prellen des Tasters. Wird er gedrückt, schließt sich im Innern ein Kontakt. Dabei kann es aber passieren, dass er nach dem ersten Schleißen noch einmal zurückprellt, also wieder öffnet und dann nochmals und endgültig schließt. Manchmal kann er auch zwei oder noch mehr Schließen und Öffnen. Da unser Controller recht flink reagiert, sieht er das als mehrmaliges Drücken und zählt jedesmal eins weiter.

Um das zu vermeiden, müssen wir den Tastendruck entprellen.

Man kann davon ausgehen, dass das Prellen des Kontaktes nach etwa 100 ms abgeschlossen ist, er also endgültig zu ist. Deshalb muss jede if-Verzweigung durch einen _delay_ms(100);-Befehl gebremst werden.

 

zurück