Hier wird eine Stoppuhr mit den folgenden Eigenschaften beschrieben:
Vier unabhängig stoppbare Kanäle
Auflösung bei 1 ms
Quarzstabiler Takt mit 50 ppm Genauigkeit
Start- und Stop-Steuerung, Messpausen möglich
Vierzeilige LCD zur Anzeige
Einfacher Aufbau
Assembler-Software mit Quellcode
Software kompatibel mit 2,0 oder 2,048 oder 8,0 MHz-Quarzen
Diese Seite als PDF-Dokument zum Download
(19 Seiten, 675 kB).
1 Hardware
Das ist die gesamte nötige Hardware.
Der ATmega8 wird mit einem 2,048 Mhz-Quarz getaktet.
Verwendbar sind auch 2,0 und 8,0 MHz-Quarze
(diese erfordern auch eine Änderung der Software).
Die Stromversorgung erfolgt aus vier hintereinander
geschalteten 1,2V-Akkus. so dass eine 5V-LCD verwendet
werden kann.
Die vierzeilige LCD ist im 8-Bit-Modus an den ATmega8
angeschlossen und wird mit dem R/W-Anschluss im Busy-Modus
angesteuert.
Eine Taste setzt die Stoppuhr auf Null, eine Taste dient
zum Starten und Anhalten der Zeit und vier Tasten dienen
dem Stoppen der vier Kanäle.
Die ISP-Schnittstelle dient zum Programmieren in der
Schaltung.
2 Software-Struktur
2.1 Anzeigeschema
Das Anzeigeschema demonstriert das Ausgabeschema
im gestoppten Zustand,
bei laufender Zeitmessung, und
bei abgeschlossener Messung in angehaltenen
Kanälen.
2.2 Taktung
Die Taktung erfolgt mit einem 2,0 oder 8,0 MHz-Quarz
im TC2 mittels CTC und Compare-Match-Interrupt. Wird ein
2,048 MHz-Quarz verwendet, dann arbeitet TC2 im
Normalmodus mit dem Overflow-Interrupt.
Bei 2,0 und 2,048 MHz wird der 8-Bit-Timer mit einem
Prescaler von 8 betrieben, bei 8 Mhz mit einem solchen
von 64.
2.3 Interrupt-Service-Routine TC2
In der Interrupt-Service-Routine von TC2, die je nach
verwendetem Quarz vom TC2OVF- oder vom TC2CMP-Interrupt
angesteuert wird, wird zunächst der aktuelle Zustand
am Tasteneingang eingelesen und die ms-Flagge gesetzt.
Die weitere Verarbeitung des Tastenzustands erfolgt
außerhalb der ISR in der Hauptprogrammschleife.
Danach wird die bRun-Flagge abgefragt und, falls der
Timer läuft, die laufende Zeitmessung der
Millisekunden aktualisiert. Erreicht der
Millisekunden-Zähler 100, wird er neu gestartet und
die ds-Flagge gesetzt. Die weitere Verarbeitung der Zeit
erfolgt in der Hauptprogrammschleife. Die Verarbeitung
der Millisekunden innerhalb der Service-Routine verhindert,
dass bei langwierigen Ausgabeoperationen mit der LCD
Millisekunden-Interrupts verpasst werden.
2.4 Behandlung der Millisekunden-Flagge
Mit der Millisekunden-Flagge werden alle Tasten
daraufhin untersucht, ob sie aktiviert sind.
Zunächst wird die ms-Flagge wieder
gelöscht, um die nächste
Ausführung zu ermöglichen.
Ist die Reset-Taste gedrückt, wird
unabhängig von allen anderen Operationen
die Zeit angehalten, auf Null gesetzt und
ausgegeben. Eine weitere Prüfung der
anderen Tasten erfolgt dann nicht.
Die Start/Stop-Taste muss entprellt werden, da
sie sonst zu wildem Starten und Anhalten der
Zeit führen würde. Ist diese
gedrückt (das vom Porteingang eingelesene
Bit ist Null), wird zunächst
überprüft, ob das
Prellunterdrückungsregister rTgl Null ist.
Wenn das nicht der Fall ist, wird das
Prellunterdrückungsregister auf seinen
Anfangswert gesetzt (Prellzeit in Millisekunden).
Ist das Register auf Null, wird die Run-Flagge
invertiert und das Register rTgl auf seinen
Anfangswert gesetzt. Ist die Start/Stop-Taste
nicht gedrückt und das
Prellunterdrückungsregister nicht Null,
wird es um Eins vermindert. Auf diese Weise sind
cTgl ununterbrochene High-Zyklen nötig, bis
wieder auf Nullen am Start/Stop-Eingang reagiert
wird.
Danach werden die Tasten der einzelnen Kanäle
abgefragt. Zunächst wird geprüft, ob
die Zeit auf Null steht. Falls das der Fall ist,
werden die Tasten nicht weiter geprüft, weil
das sinnlos wäre. Ist dies nicht der Fall,
werden nacheinander alle Kanäle
überprüft. Zunächst wird festgestellt,
ob der betreffende Kanal bereits gestoppt ist. Ist
dies nicht der Fall, wird das eingelesene Portpin
auf Null geprüft. Ist dieses Null, wird die
Zeit im SRAM gespeichert, angezeigt und das
entsprechende Kanalbit gesetzt. Sind auf diese
Weise alle Kanalbits überprüft, wird die
Routine beendet.
2.5 Dezisekunden-Behandlung
Ist der Ablauf einer Zehntel-Sekunde komplett
(ds-Flagge in der ISR wurde gesetzt) wird die Zeit
um eine Zehntel Sekunde erhöht. Entsprechend
werden bei Erreichen der Obergrenzen auch die
Sekunden, Minuten und Stunden angepasst. Erreichen
die Stunden 24, beginnen diese wieder bei Null.
Nach der Erhöhung der Zeit wird für
alle Kanäle geprüft, ob diese bereits
angehalten sind. Wenn nicht, wird die aktuelle
Zeit in der Kanalzeile ausgegeben (Stunden,
Minuten, Sekunden und Zehntelsekunden).
2.6 Tonerzeugung
Die Tonerzeugung erfolgt mit dem 16-Bit-Timer TC1
im CTC-Modus mit einem Vorteiler von 8. Dadurch
sind bei einer Taktfrequenz von 2,0 MHz
Töne zwischen 3,8 Hz und 250 kHz,
bei 8,0 MHz Takt 15,3 Hz bis 1 MHz
möglich.
Die Tonausgabe erfolgt am Ausgang OC1A durch Torkeln
des Ausgangspins beim Erreichen des Compare-Matches.
Soll kein Ton ausgegeben werden, wird der Ausgang
beim Compare-Match auf Clear gesetzt, wodurch der
Lautsprecher-Elko entladen wird und beim Abschalten
kein Entladestrom in den OC1A-Pin fließt.
Bei jedem Compare-Match wird ein Interrupt
ausgelöst, der den 16-Bit-Zähler in R25:R24
um Eins vermindert. Erreicht dieser Null, wird der
Clear-Modus am Ausgabepin OC1A eingestellt und damit
der Ton beendet. Der Zähler R25:R24 bestimmt
daher die Dauer des Tons.
Die Frequenzen und die Dauer der Töne sind in
den Konstanten cTonexxx in Hz und cTonexxxDur in ms
definierbar. Aus diesen Tonhöhen werden die
Compare-Werte cCmpXXX für den CTC und die
Zählerwerte cCtrXXX errechnet und in einer
Tontabelle ToneTable: abgelegt.
Der Compare-Wert ergibt sich aus der Taktfrequenz
clock und der Tonhöhe, beides in Hz
und dem Prescalerwert von 8 nach der Formel
cmp = clock / Ton / 8 / 2 - 1
Der Zählerwert ergibt sich aus der Frequenz
in Hz und der Dauer in ms nach der Formel
ctr = Ton * 2 * Dauer / 1000
und ist daher unabhängig von der Taktfrequenz.
Die Routine ToneStart: startet den im Register
rmp (R16) eingestellten Ton (0..10), indem er zuerst
den Zählerwert und dann den Compare-Match-Wert
dieses Tons ausliest und in die Register schreibt.
Für die Töne wurden Werte ausgewählt,
die in unterschiedlichen Oktaven liegen: beim Init
und bei den Tasten Reset und Start/Stop die Oktave
4, bei Sekunden, Minuten und Stunden die Oktave 3
und bei den Tasten die Oktave 1.
2.7 LED-Ansteuerung
Die LED-Ansteuerung erfolgt mit dem Portpin PB2.
Beim Init und bei inaktiver Stoppuhr ist diese
dauerhaft an, bei laufender Stoppuhr nur bei den
noch aktiven Kanälen im Rhythmus von
Zehntelsekunden.
2.8 Sortierung nach Bestzeiten
Sind alle vier Kanäle angehalten, wird die Uhr
angehalten und die vier Zeiten werden in der Reihenfolge
ihrer Aktivierung ausgegeben. Die Reihenfolge des
Anhaltens der vier Kanäle ist im SRAM abgelegt,
die Zeiten ebenfalls.
Ist beim Assemblieren der Schalter eep auf
1 gesetzt, dann werden alle 20 Datenbytes und die vier
Reihenfolgen in das EEPROM geschrieben und können
von dort ausgelesen werden.
3 Software
Der Assembler-Quellcode der Stoppuhr mit einem ATmega8
kann hier heruntergeladen
und hier im Browser
angeschaut werden. Zum Assemblieren ist noch die
Include-Datei lcd.inc erforderlich,
die alle LCD-Routinen enthält.
Die Software ist per default auf folgende Eigenschaften
gesetzt:
Quarzfrequenz: 2,048 MHz, clock = 2048000
LCD 4x20 8-Bit-Datenbus Busy-Modus
EEPROM-Schreiben aus
Beim Programmieren des Chips ist dieser vom internen
RC-Oszillator per Fuse auf High-Speed-Xtal (bei einem
8 MHz-Quarz) oder auf Medium-Speed-Xtal (bei
2,0 oder 2,048 MHz-Quarz) umzustellen, weil sonst
die Zeiten und die Töne nicht stimmen.
Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte über
das Kommentarformular an mich.