Pfad:/A> Home => AVR-DE => Anwendungen => Stoppuhren mit AVR => Stoppuhr ATmega8   This page in English: Flag EN Logo
Stoppuhr_m8 AVR-Anwendungen

Stoppuhr mit ATmega8 in Assembler

Stoppuhr mit einem ATmega8

Hier wird eine Stoppuhr mit den folgenden Eigenschaften beschrieben: Diese Seite als PDF-Dokument zum Download (19 Seiten, 675 kB).

1 Hardware

Schaltbild Stoppuhr 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

Anzeigeschema der Stoppuhr m8 Das Anzeigeschema demonstriert das Ausgabeschema
  1. im gestoppten Zustand,
  2. bei laufender Zeitmessung, und
  3. bei abgeschlossener Messung in angehaltenen Kanälen.

2.2 Taktung

Taktung 1000 Hz 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

Interrupt-Service-Routine ms 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

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

Dezisekunden 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

Sortierte Ausgabe 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: 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.

Zum Anfang dieser Seite

©2018 by http://www.avr-asm-tutorial.net