PIC-Lernbeispiel: LED-Stoppuhr


zurück , Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage


Eine Stoppuhr mit 4-stellige 7-Segment-LED-Ziffernanzeige
Aufbauend auf der LED-Ziffernanzeige wird eine einfache Stoppuhr aufgebaut, die maximal 10 Minuten mit einer Auflösung von 1/10 Sekunde misst.

Schaltung
 
Stromlaufplan Die Schaltung entspricht der LED-Ziffernanzeige.

Der Eingang RA4 wird nun mit einem Tastschalter verbunden, der RA4 mit Masse verbinden kann. Mit einem 10kOhm-Widerstand wird RA4 im Ruhezustand auf "1"-Pegel gehalten (nicht in meinem Platinenlayout enthalten).

Solange der Tastschalter nicht gedrückt wird, läuft die Uhr. Die Zeitmessung wird unterbrochen, solange der Schalter gedrückt wird.

Um die Stoppuhr auf "0.00.0" zurückzusetzen, drückt man die Reset-Taste. Die längstmögliche Messzeit ist "9.59.9": 9 Minuten und 59,9 Sekunden.

Zwischen dem Pin 3 (RA4) und dem Eingangs-Steckverbinder-Pin muss noch eine Brücke eingelötet werden, dieser Platz ist eigentlich für einen Schutzwiderstand vorgesehen.


Programmablauf
Zur Vorbereitung muss man die Pins RB0-RB7 sowie RA0-RA3 in Ausgabe-Mode schalten und auf "1" setzen.

Zur Anzeige einer 4-stelligen Zahl muss man der Reihe nach die Pins RA0-RA3 vorübergehend auf "0" legen und den 7-Segment-Code der zugehörigen Ziffer am Port B ausgeben. Um ein Flackern der Anzeige zu vermeiden, sollte die Darstellung der gesamten Zahl mindestens 50 mal pro Sekunde wiederholt werden. Da der einzige Timer des 16F84 für die exakte Zeitmessung benötigt wird, wird das Anzeigetiming in diesen Rythmus einbezogen..

Bestimmte Speicherzellen enthalten die Werte für Minuten, Zehnersekunden, Einersekunden und Zehntelsekunden. Diese Speicherzellen werden beim Programmstart auf 0 gesetzt.

Es werden die üblichen Bauteile verwendet, d.h. anstelle  eines Uhrenquarzes (32768 Hz) wird der normale 4 MHz-Keramikschwinger eingesetzt. Das ergibt einen internen Takt von 1 MHz. Der Timer wird mit dem Vorteiler an den Takt angeschlossen. Der Vorteiler wird auf den Teilerfaktor 32 und der Timer auf 256-125=131 eingestellt. Damit löst der Timer alle 4 ms einen Interrupt aus. Das entspricht einer Interruptfrequenz von 250 Hz.

Bei jedem Interrupt wird zur nächsten Anzeigestelle der LED-Anzeige weitergeschaltet. Nach 4 Interrupts ist die gesamte Zahl einmal dargestellt, und im 5. Interrupt wird stattdessen ein Zähler betätigt. Danach beginnt die Anzeige von neuem. Es wird also 50 mal pro Sekunde der Anzeigezyklus durchlaufen. Der Zähler ist Basis für die Zeitmessung. Nach 5 Zählertakten ist eine 1/10 Sekunde vergangen, und die anzuzeigende Stoppzeit wird um 1/10 Sekunde erhöht.

Die Routine erhöht den Wert der Zehntelsekunden-Speicherzelle. Erreicht der Wert 10, dann wird die Speicherzelle gelöscht, und der Wert der Einersekunden um 1 erhöht. Erreicht der Wert der Einersekunden 10, dann wird die Speicherzelle gelöscht, und der Wert der Zehnersekunden um 1 erhöht. Erreicht der Wert der Zehnersekunden 6, dann wird die Speicherzelle gelöscht, und der Wert der Minuten um 1 erhöht. Erreicht der Wert der Minuten 10, dann wird die Speicherzelle gelöscht.

Nach jeder kompletten Anzeige der Werte im Display wird der Pegel am Eingang RA4 eingelesen. Ist der Wert "0", dann wird das Zählen gestoppt. Ist der Wert "1" wird das Zählen erlaubt.


Programmlisting



Weiterführend
Ich habe über 10 Minuten eine Gangabweichung von 2 Sekunden festgestellt, das sind etwa 0,3% Fehler. Da der Keramikschwinger 0,5% Toleranz hat, bin ich damit zufrieden. Bei Uhren sollte man vielleicht doch Quarze einsetzen.
Allerdings würde auch mit einem Quarz die Stoppuhr nicht genau laufen. Das Programm enthält nämlich eine grobe Unsauberkeit:
Ich erzeuge den 250Hz-Grundtakt dadurch, dass ich den Timer0 immer wieder auf 131 einstelle. Allerdings passieren beim Beschreiben des TMR0-Registers zwei störende Dinge: Das sorgt dafür, dass beim Zählen der Zeit ein paar Zyklen unter den Tisch fallen. Die Uhr läuft etwas langsamer, als sie soll. Wenn man den Timer0 für eine präzise Uhr nutzen will, muss man ihn immer komplett von 0..255 durchlaufen lassen, und darf nie das Register TMR0 beschreiben. Dadurch teilt der Timer0 aber seine Eingangsfrequenz immer durch 256. Der Zyklustakt der PIC muss also ein vielfaches von 256 Hz sein, der PIC-Takt muss also ein Vielfaches von 1024 Hz sein!! Ein 4MHz-Quarz ist also prinzipiell ungeeignet.
 
 

Da RA4 ein Schmidt-Trigger-Input ist, lassen sich recht einfach Pulsweitenmesser oder Frequenzzähler mit der selben Schaltung realisieren. Allerdings fehlen freie Ports, um Schalter anzuschließen, mit denen man zwischen verschiedenen Funktionen umschalten kann. Möglich ist es, die Schalter parallel zum Display anzuschließen, weitaus einfacher ist es allerdings, für solche Zwecke ein LCD-Display mit parallel geschalteter Tastatur zu verwenden.

Da alle Lernprogramme auch auf dem 16F876 laufen, ist auch die Nutzung dieses PIC ein Ausweg. Er hat 8 zusätzliche Pins.


zurück , Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage

Autor: sprut
erstellt: 2000
letzte Änderung: 04.02.2004