You are on page 1of 26

Lemps12-Timerfunktionen

Assembler Edition
Hans Kottmann M arz 2002

Inhaltsverzeichnis
Inhalt 1 Einfu hrung 2 Timerfunktionen 2.1 Input Capture . . . 2.2 Output Compare . . 2.3 Pulsweitenmodulator 2.4 Pulse Accumulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 3 5 5 6 6 6 7 7 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 20 24 25 26

3 Timerregister des HC12 3.1 Timer Input Capture/Output Compare Select . . . . 3.2 Timer Compare Force Register . . . . . . . . . . . . 3.3 Output Compare 7 Mask Register . . . . . . . . . . 3.4 Output Compare 7 Data Register . . . . . . . . . . . 3.5 Timer Count Register . . . . . . . . . . . . . . . . . 3.6 Timer System Control Register . . . . . . . . . . . . 3.7 Timer Control Register 1/2 . . . . . . . . . . . . . . 3.8 Timer Control Register 3/4 . . . . . . . . . . . . . . 3.9 Timer Interrupt Mask 1 . . . . . . . . . . . . . . . . 3.10 Timer Interrupt Mask 2 . . . . . . . . . . . . . . . . 3.11 Timer Interrupt Flag 1 . . . . . . . . . . . . . . . . . 3.12 Timer Interrupt Flag 2 . . . . . . . . . . . . . . . . . 3.13 Timer Input Capture/Output Compare Register 0..7 3.14 Pulse Accumulator Control Register . . . . . . . . . 3.15 Pulse Accumulator Interrupt Flag Register . . . . . 3.16 Pulse Accumulator Count Register . . . . . . . . . . 4 Anwendungsbeispiele 4.1 Temperaturmessung mit dem Sensor SMT160-30 4.2 Lemps12-Stoppuhr . . . . . . . . . . . . . . . . . 4.3 LED-Dimmer mit PWM . . . . . . . . . . . . . . 4.4 Prellen die Tasten wirklich? . . . . . . . . . . . . 4.5 Wie lange dauert ein Tastendruck? . . . . . . . . 5 Quelltexte zu den Beispielen 5.1 Temperaturmessung . . . . . . . . 5.2 HC12-Stoppuhr . . . . . . . . . . . 5.3 LED-Dimmer mit PWM . . . . . . 5.4 Prellen die Tasten wirklich? . . . . 5.5 Wie lange dauert ein Tastendruck?

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

Lemps12-Timerfunktionen

Einfu hrung
besch aftigt sich mit den Timerregistern und ihrer Verwendung. Uber diese Register werden die Timerfunktionen aktiviert und die Timer gesteuert. Die Timerfunktionen sind im MC68HC812A4 Technical Summary ab Seite 66 beschrieben. Diese Technical Summary diente als Grundlage f ur diese Einf uhrung und bendet sich nach der Installation der LempsSoftware in c:\L12\Doc\HC12A4MAN.pdf. Obwohl ich den Inhalt meiner Dokumentation immer so genau wie m oglich auf Fehler u ufe, berpr lassen sich solche leider nicht immer vermeiden. F ur Fehlerhinweise und Anregungen bin ich sehr dankbar.

Das Timerport (PORTT) des HC12 kann f ur ver schiedene Timerfunktionen genutzt werden. Uber die Software kann f ur jeden einzelnen PIN festgelegt werden, ob er als Input Capture oder als Output Compare genutzt werden soll. F ur den Pulsweitenmodulator stehen die Kan ale 0-6 zur Verf ugung. Werden die Timerfunktionen nicht ben otigt, so l asst sich das PORTT als normales digitales I/O Port nutzen. Der Timer setzt den Status des Datenrichtungsregisters DDRT ausser Kraft. Im ersten Teil werde ich auf die einzelnen Funktionen n aher eingehen und diese so verst andlich wie m oglich erkl aren. Der zweite und schwierigere Teil

Timerfunktionen
w arts. Der Inhalt dieses Z ahlers kann jederzeit ausgelesen werden, Werte k onnen aber nur bei speziellen Betriebsarten hineingeschrieben werden. Dazu muss das SMODN-Bit im Mode-Register auf 0 gesetzt werden. Normalerweise ist der Timer nicht aktiviert, die Aktivierung wird u ber das Timer System Control Register vorgenommen. Das h ochstwertigste Bit dieses Registers (0x80) muss 1 gesetzt werden.

Der Systemclock des Lemps12 (8MHz) wird u ber einen Vorteiler an das Timer Count Register gelegt. Das Teilerverh altnis (1-32) wird u ber die Timer Prescaler Select Bits im TMSK2 festgelegt. Nach einem Reset wird der Teiler auf 1 gesetzt, der Timer wird mit 8Mhz getaktet. Das Timerregister ist 16 Bit breit und z ahlt, falls der Timer freigegeben ist, bis 65535 und beginnt anschliessend wieder bei 0. Das heisst, alle 125ns z ahlt dieser Z ahler eins auf-

Register, mit denen die Timerfunktionen gesteuert werden:


TIOS (Timer Input Capture/Output Compare Select): Hier wird f ur die einzelnen Timerkan ale festgelegt, ob sie als Input Capture oder als Output Compare verwendet werden sollen. TSCR (Timer System Control Register): Im TSCR wird der Timer aktiviert und festgelegt, ob nach einem Zugri auf eines der Timer Input Capture/Output Compare Register das Timer Interrupt Flag im TFLG1 gel oscht wird. TMSK1 (Timer Interrupt Mask 1): In diesem Register wird f ur jeden einzelnen Kanal festgelegt, ob nach einem Input Capture oder einem Output Compare (je nach Einstellung im TIOS) ein Interrupt ausgel ost wird. TMSK2 (Timer Interrupt Mask 2): Unter anderem wird hier der Timer Prescaler eingestellt, es wird hier festgelegt, ob nach einem Output Compare an Kanal 7 der Counter zur uckgestellt werden soll und ob nach einem Timer uberlauf ein Interrupt ausgel ost werden soll. TFLG1 (Timer Interrupt Flag 1): Das Interrupt Flag wird gesetzt, wenn sich am betreenden Kanal ein Input Capture oder Output Compare ereignet hat. TFLG2 (Timer Interrupt Flag 2): Wird gesetzt, wenn sich eine Uberlauf des Z ahlers (0xFFFF nach 0x0000) ereignet hat.

Lemps12-Timerfunktionen

Blockdiagramm HC12-Timer

Lemps12-Timerfunktionen

2.1

Input Capture
mer Interrupt Flag gesetzt. Durch dieses Flag kann der Programmierer, beziehungsweise das Programm u ufen, ob die gew unschte Flanke bereits einberpr getroen ist, oder nicht. Ist dieses Flag gesetzt, so wird keine weitere weitere Pr ufung des Eingangssignals mehr vorgenommen, dazu muss dieses Flag von der Software wieder zur uckgesetzt werden. Im TMSK1 kann f ur die einzelnen Kan ale festgelegt werden, ob nach einem Input Capture ein Interrupt ausgel ost werden soll, oder nicht. F ur Berechnungen wie Perioden- oder Einschaltdauer werden nach dem Setzen des Interrupt Flags die Werte aus dem Input Capture Register ausgelesen. Diese Werte k onnen nachher f ur Berechnungen gebraucht werden.

Input Capture bedeutet auf Deutsch u bersetzt etwa soviel wie Eingangserfassung. S amtliche Kan ale des Timerports lassen sich als Input Capture nutzen. So stehen im Maximum acht Kan ale zur Verf ugung. Uber das TIOS werden die einzelnen Kan ale als Input Capture oder als Output Compare selektiert. In den Timer Control Register 3 und 4 wird f ur jeden PIN des PORTT einzeln festgelegt, auf welche Flanke des Eingangssignals der Timer reagieren soll. Zu jedem einzelnen Kanal geh ort ein Timer Input Capture/Output Compare Register. Sobald die gew unschte Flanke am Eingang ankommt, wird der Wert des Timer Count Registers in das zugeh orige Timer Input Capture Register geschrieben. Gleichzeitig wird das Ti-

Timer Control Register 3/4 (TCTL3/4)


Die Timer Control Register 3 und 4 sind die einzigen Register, die f ur die nebst den Registern, in denen die Timerfunktionen eingestellt werden, f ur die Input Capture Funktion wichtig sind. In diesen beiden Registern wird f ur die einzelnen als Input Capture geschalteten Kan ale festgelegt, auf welche Flanke am Kanaleingang ein Input Capture ausgel ost werden soll.

2.2

Output Compare
TMSK1 kann f ur die einzelnen Kan ale festgelegt werden, ob nach einem Output Compare ein Interrupt ausgel ost werden soll, oder nicht. Damit lassen beispielsweise Timer programmieren. Es empehlt sich in den meisten F allen, den Vorteiler des Timer Count Registers im TMSK2 so einzustellen, dass der Z ahlintervall 1s betr agt. Damit lassen sich nachher am einfachsten Berechnungen ausf uhren.

Auf Deutsch u bersetzt bedeutet Output Compare etwa soviel wie Ausgangsvergleicher. Wird einer oder mehrere der Timerkan ale 0-7 als Output Compare gesetzt, Wird dauernd der Inhalt des zum Kanal geh orenden Timer Input Capture/Output Compare Registers mit dem Timer Counter Register verglichen. Sobald die beiden Inhalt gleich sind wird im TFLG1 das Input Capture/Output Compare n Flag gesetzt. Im

Wichtige Register fu r den Output Compare:


CFORC (Timer Compare Force Register): Uber dieses Register kann per Software ein Output Compare an einem als Output Compare geschalteten Kanal ausgel ost werden. OC7M (Output Compare 7 Mask Register): Dieses Register hat f ur die als Output Compare geschalteten Kan ale dieselbe Bedeutung wie die Datenrichtungsregister f ur die normalen I/O-Ports. OC7D (Output Compare 7 Data Register): Hier wird festgelegt, welchen Zustand die einzelnen Output Compare Kan ale, die in OC7M als Ausg ange geschaltet wurden, nach einem Output Compare an Kanal 7 haben. TCTL1/2 (Timer Control Register 1/2): In diesen beiden Registern wird f ur die einzelnen als Output Compare geschalteten Kan ale festgelegt, was an dessen Ausgang nach einem Output Compare passieren soll.

Lemps12-Timerfunktionen

2.3

Pulsweitenmodulator (PWM)
deren sieben Kan ale lassen sich als PWM verwenden. Im OC7D wird eingestellt, welchen Zustand (High/Low) die einzelnen OC-Kan ale nach einem Output Compare am Kanal 7 haben sollen. Durch die Werte in den Timer Input Capture/Output Compare Registern 0-6 lassen sich die Pulsweiten regulieren. Wichtig ist dass die Timer Control Register 1/2 so eingestellt sind, dass sich der Zustand am Ausgang der PWM-Kan ale sich nach einem Output Compare andert.

Mit dem Output Compare l asst sich beim HC12 ein Pulsweitenmodulator realisieren, der ohne den Prozessor zu belasten, betrieben werden kann. Der Output Compare Kanal 7 hat gegen uber den anderen Kan alen eine Sonderstellung: Wird im Timer Interrupt Mask 2 Register das TCRE-Bit gesetzt ist, wird bei einem Output Compare am Kanal 7 das Timer Count Register auf 0 zur uckgestellt. Das bedeutet, dass mit dem Kanal 7 die Periodendauer des Rechtecksignales festgelegt wird, die an-

2.4

Pulse Accumulator
(PACLK) dauert beim Lemps12 also 8s. Der Pulse Accumulator kann als Vorteiler f ur den Timer Counter verwendet werden, damit lassen sich sehr lange Zeiten am Timer Counter generieren. Im Time Accumulation Mode z ahlt der Pulse Accumulator die Zeit, w ahrend der der Kanal 7 des Timer Counters auf High oder Low liegt. Im Event Counter Mode z ahlt der Pulse Accumulator bei jeder am Kanal 7 ankommenden fallenden oder ansteigenden Flanke um eins vorw arts.

Pulse Accumulator heisst auf Deutsch etwa soviel wie Impulsz ahler. Der HC12 Pulse Accumulator kann allerdings einiges mehr, als einfach Impulse zu z ahlen. Der Pulse Accumulator ist wie der Timer Counter ein 16-Bit Z ahler, der, falls im Time Accumulation Mode laufend, u ber den Timer Prescaler angesteuert wird. Die Einstellung dieses Teilers haben allerdings keinen Einuss, der Pulse Accumulator wird immer u ber einen Teiler durch 64 betrieben. Ein Takt des Pulse Accumulator Clocks

Wichtige Register fu r den Pulse Accumulator:


TSCR (Timer System Control Register): Ohne dass das Timer Enable Bit gesetzt ist, arbeitet der Pulse Accumulator nur im Event Counter Modus! PACTL (Pulse Accumulator Control Register): In diesem Register werden alle wichtigen Einstellungen f ur den Betrieb des Pulse Accumulators vorgenommen. PAFLG (Pulse Accumulator Flag Register): Nach eine Uberlauf des Pulse Accumulator Counters oder wenn die im PACTL eingestellte Flanke am Timerkanal 7 eingetroen ist, werden hier die entsprechenden Interrupt Flags gesetzt. PACNT (Pulse Accumulator Count Register): Der Z ahler des Pulse Accumulators. Im Gegensatz zum Timer Counter ist hier ein Schreibzugri jederzeit m oglich.

Timerregister des HC12


Capture Registers TC0: Variable = TC0;. Zu beachten sind vor allem die Besonderheiten beim Zugri, die nachfolgend erkl art sind. So werden beispielsweise die Bits im Timer Interrupt Flag gel oscht, wenn eine 1 in die betreenden Bits geschrieben wird.

Die Adressen der HC12 Timerregister sind im Header hc12.h deniert. Bei den nachfolgenden Erkl arungen zu den Registern ist die Adresse rechts vom Titel angegeben. Angesprochen werden die Register mit ihrem Namen, wie dies bei den Variablen der Fall ist. Zum Beispiel das Auslesen des Timer Input

Lemps12-Timerfunktionen

3.1

Timer Input Capture/Output Compare Select (TIOS)

0x0080

Im Timer Input Capture/Output Compare Register wird festgelegt, welche PINs des PORTT als Input Capture beziehungsweise als Output Compare verwendet werden sollen. Dieses Register kann jederBit 7 IOS7 0 6 IOS6 0 5 IOS5 0

zeit ausgelesen oder neu beschrieben werden. Alle Kan ale, deren Bits 0 gesetzt sind, werden als Input Capture genutzt, alle anderen Kan ale als Output Compare. 3 IOS3 0 2 IOS2 0 1 IOS1 0 0 IOS0 0

RESET:

4 IOS4 0

IOS[0..7]: Input Capture oder Output Compare Kanalbezeichner

3.2

Timer Compare Force Register (CFORC)

0x0081

Uber dieses Register kann jederzeit u ber die Software ein sofortiger Output Compare ausgel ost werden. Das heisst, es passiert dasselbe, wie wenn sich am betreenden Kanal ein Output Compare (Wert von TCn ist gleich gross, wie der Wert des Timer Counter Registers). Das Interrupt Flag f ur dieBit 7 FOC7 0 6 FOC6 0 5 FOC5 0

sen Kanal wird aber nicht gesetzt! In dieses Register kann jederzeit geschrieben, das heisst, am betreenden Kanal ein Output Compare ausgel ost werden. Beim Lesen gibt das Timer Compare Force Register immer den Wert 0x00 zur uck, der Wert 1 ist uchtig. 3 FOC3 0 2 FOC2 0 1 FOC1 0 0 FOC0 0

RESET:

4 FOC4 0

FOC[7..0:] Force Output Compare Action f ur Kanal 7-0

3.3

Output Compare 7 Mask Register (OC7M)

0x0082

Diesem Register kommt f ur die Kan ale, die als Output Compare geschaltet sind, eine Funktion zu, wie sie die Datenrichtungsregister f ur die normalen digitalen I/0-Ports erf ullen. F ur jeden Kanal, der als Ausgang gebraucht werden soll, was vor allem bei der Verwendung des Pulsweitenmodulators der Bit 7 OC7M7 RESET: 0 6 OC7M6 0 5 OC7M5 0

Fall ist, muss dass entsprechende Bit im Output Compare 7 Mask Register gesetzt werden. Die Einstellung dieses Registers ver andern die Einstellungen des Datenrichtungsregister DDRT nicht. Lesen und schreiben in dieses Register ist jederzeit m oglich. 3 OC7M3 0 2 OC7M2 0 1 OC7M1 0 0 OC7M0 0

4 OC7M4 0

OC7M[7..0:] Output Compare 7 Mask f ur Kanal 7-0

3.4

Output Compare 7 Data Register (OC7D)

0x0083

Im Output Compare 7 Data Register wird f ur jeden Kanal festgelegt, welcher Zustand (High oder Low) nach einem Output Compare an Kanal 7 der Kanal am Ausgang (PORTT) haben soll. Dieses Register ist, wie das Output Compare 7 Mask Register vor allem f ur den Pulsweitenmodulator von

Bedeutung. Diese Funktion ist nur wirksam, wenn der Kanal im OC7M als Ausgang festgelegt wurde. Bei gleichzeitigem Auftreten eines Output Compare am Kanal 7 und einem der Kan ale 0-6 wird der Ausgang des betreenden Kanals auf den im OC7D festgelegten Zustand gesetzt. Der Output Compare

Lemps12-Timerfunktionen

am Kanal 7 hat also h ohere Priorit at, als ein Out- dieses Registers kann jederzeit ge andert oder ausput Compare an einem anderen Kanal. Der Inhalt gelesen werden. Bit 7 OC7D7 0 6 OC7D6 0 5 OC7D5 0 4 OC7D4 0 3 OC7D3 0 2 OC7D2 0 1 OC7D1 0 0 OC7D0 0

RESET:

OC7D[7..0:] Output Compare 7 Data Register f ur Kanal 7-0

3.5

Timer Count Register (TCNT)

0x0084/85

oglich (SMODN = 0). Auslesen des Dieses Register enth alt den Inhalt des 16-Bit Z ah- Betriebsarten m ahlerinhaltes in C: Variable = TCNT. Integervalers. Der Inhalt dieses Z ahlers kann jederzeit ausge- Z lesen werden. Schreibzugrie sind nur bei speziellen riable verwenden! Bit 7 Bit 15 Bit 7 0 6 14 6 0 5 13 5 0 4 12 4 0 3 11 3 0 2 10 2 0 1 9 1 0 0 8 0 0

RESET:

3.6

Timer System Control Register (TSCR)

0x0086

ahler ausser Betrieb Uber dieses Register wird der Timer ein und ausge- bedeutet dies, dass der 16-Bit Z schaltet. Das Ein und Ausschalten des Timers ist je- gesetzt ist. Normalerweise muss nur das Timer Enaderzeit m oglich. Wenn der Timer ausgeschaltet ist, ble Bit gesetzt werden. Bit 7 TEN 0 6 TSWAI 0 5 TSBCK 0 4 TFFCA 0 3 0 0 2 0 0 1 0 0 0 0 0

RESET:

TEN - Timer Enable 0: Deaktiviert den Timer und den Z ahler. Der Stromverbrauch des Prozessors kann dadurch reduziert werden. 1: Aktiviert den Timer. TSWAI - Timer Stopps While Wait 0: Timer l auft weiter, wenn sich der Prozessor im Wait-Modus bendet. 1: Stoppt dem Timer, wenn sich der Prozessor im Wait-Modus bendet. Timerinterrupts k onnen nicht benutzt werden, um den Wait-Modus zu beenden. TSBCK - Timer Stops while in Background Mode 0: Timer l auft weiter, wenn sich der Prozessor im Background-Modus bendet. 1: Stoppt den Timer, wenn sich der Prozessor im Background-Modus bendet, TFFCA - Timer Fast Flag Clear All 0: Erlaubt manuelles l oschen der Timerags (Normaler Zustand).

Lemps12-Timerfunktionen

1: Ein Lese oder Schreibzugri auf das Timer Input Capture/Output Compare Register eines Kanals hat zur Folge, dass das zugeh orige Timer Interrupt Flag im TFLG1 gel oscht wird. Ein Zugri auf das Timer Count Register hat zur Folge, dass dass Timer Overow Flag im TFLG2 gel oscht wird. Jeder Zugri auf die Bits CLK1 und CLK2 des PACNT hat zur Folge, dass das PAOVF- und das PAIF-Flag im PAFLG gel oscht werden. Diese Funktion bietet den Vorteil, dass die Flags nicht mehr von der Software gel oscht werden muss (weniger Code). Daf ur muss darauf geachtet werden, dass notwendige Flags nicht durch nicht gewollte Zugrie gel oscht werden.

3.7

Timer Control Register 1/2 (TCTL1/2)

0x0088/89

In diesen acht paarweise vorhandenen Kontrollbits wird f ur jeden Kanal einzeln festgelegt, was bei einem Output Compare am Ausgang des betreenden Kanals passieren soll. Der Inhalt dieses Registers kann jederzeit ge andert und gelesen werTCTL1: RESET: TCTL2: RESET: Bit 7 OM7 0 Bit 7 OM3 0 6 OL7 0 6 OL3 0 5 OM6 0 5 OM2 0

den. Die Einstellungen des Datenrichtungsregisters DDRT haben keine Bedeutung, wenn mindestens eines der beiden Bit gesetzt ist. Die betreenden Kan ale m ussen aber im OC7M als Ausg ange gesetzt sein. 3 OM5 0 3 OM1 0 2 OL5 0 2 OL1 0 1 OM4 0 1 OM0 0 0 OL4 0 0 OL0 0

4 LO6 0 4 OL2 0

OMn: Output Modus OLn: Output Level (High/Low) Die folgende Tabelle gibt Auskunft u ber die Verwendung dieser beiden Bits: OMn 0 0 1 1 OLn 0 1 0 1 Wirkung am Ausgang keine Wirkung am Ausgang OCn Invertiert den Ausgang OCn setzt den Ausgang OCn auf Low setzt den Ausgang OCn auf High

3.8

Timer Control Register 3/4 (TCTL3/4)

0x008A/8B

In diesen paarweise vorhandenen Kontrollbits wird le reagieren sollen. Das TCTL3 ist f ur die Kan ale festgelegt, auf welche Flanken des Eingangssignals 4-7 und das TCTL4 f ur die Kan ale 0-3 zust andig. die einzelnen als Input Capture geschalteten Kan a- Zugrie auf dieses Register sind immer m oglich. TCTL3: Bit 7 EDG7B RESET: 0 Bit 7 EDG3B RESET: 0 6 EDG7A 0 6 EDG3A 0 5 EDG6B 0 5 EDG2B 0 4 EDG6A 0 4 EDG2A 0 3 EDG5B 0 3 EDG1B 0 2 EDG5A 0 2 EDG1A 0 1 EDG4B 0 1 EDG0B 0 0 EDG4A 0 0 EDG0A 0

TCTL4:

EDGnB, EDGnA: Input Capture Edge Control. Die folgende Tabelle gibt Auskunft u ber die Verwendung dieser Bits:

Lemps12-Timerfunktionen

10

EDGnB 0 0 1 1

EDGnA 0 1 0 1

Konguration Keine Erfassung Erfassung der ansteigenden Flanke Erfassung der abfallenden Flanke Erfassung beider Flanken

3.9

Timer Interrupt Mask 1 (TMSK1)

0x008C

Im Timer Interrupt Mask wird f ur jeden einzelnen Timerkanal festgelegt, ob, nachdem das Timer Interrupt Flag gesetzt worden ist, ein Interrupt ausgel ost werden soll, oder nicht. Nach einem Reset sind diese Bit alle auf 0 gesetzt, das heisst, das Bit 7 C7I 0 6 C6I 0 5 C5I 0

Ausl osen eines Interrupts ist deaktiviert. Um die Interruptfunktion zu aktivieren, m ussen die Bits der betreenden Kan ale 1 gesetzt werden. Leseund Schreibzugrie auf dieses Register sind jederzeit m oglich. 3 C3I 0 2 C2I 0 1 C1I 0 0 C0I 0

RESET:

4 C4I 0

CnI: Timer Input Capture/Output Compare x Interrupt Enable

3.10

Timer Interrupt Mask 2 (TMSK2)

0x008D

Im Timer Interrupt Mask 2 werden verschiedene Einstellungen, die f ur den Betrieb des Timers von Bedeutung sind, vorgenommen. Hier kann der fest gelegt werden, ob bei einem Uberlauf des Timers (von 65535 nach 0) ein Interrupt ausgel ost werden Bit 7 TOI 0 6 0 0 5 TPU 1

soll. Ebenfalls in diesem Register wird der Timer Prescaler, der Vorteiler f ur den Timer Counter eingestellt. Die folgenden Beschreibungen und die Tabelle geben Auskunft u ber die verschiedenen Einstellungsm oglichkeiten dieses Registers. 3 TCRE 0 2 PR2 0 1 PR1 0 0 PR0 0

RESET:

4 TDRB 1

TOI - Timer Overow Interrupt Enable 0: Interrupt deaktiviert 1: Beim setzen des Timer Overow Flags wird ein Interrupt ausgel ost. TPU Timer Pull-Up Resistor Enable Dieses Bit schaltet f ur alle als Eing ange denierten Pins des Timer Ports Pull-Up Widerst ande zu. 1: Pull-Up Widerst ande werden zugeschaltet (Standard). 0: Pull-Up Widerst ande werden abgeschaltet. TDRB - Timer Drive Reduction Wird dieses Bit gesetzt, so begrenzt der HC12 den maximalen Ausgangsstrom an den Timerkan alen. 1: Strombegrenzung ist aktiviert (Standard). 0: Strombegrenzung ist deaktiviert.

Lemps12-Timerfunktionen

11

TCRE - Timer Counter Reset Enable Wenn dieses Bit gesetzt wird, wird nach einem Output Compare am Timerkanal 7 der Timer Counter auf 0 zur uckgestellt. Ben otigt wird diese Funktion vor allem f ur die Pulsweitenmodulation. Wenn TC7 auf 0x0000 und TCRE auf 1 gesetzt ist, bleibt der Timer Counter immer auf 0x0000 stehen, ist TC7 auf 0xFFFF und TCRE auf 1 gesetzt, z ahlt der Counter immer von 0x0000 bis 0xFFFF, aber das Timer Overow Flag wird nie gesetzt werden. 0: Counter Reset Funktion ist deaktiviert, der Timer z ahlt immer bis zum Maximalwert. 1: Counter Reset nach Output Compare an Kanal 7. PR2, PR1, PR0 - Timer Prescaler select Uber diese drei Bits wird der Vorteiler-Divisor des Timer Count Registers festgelegt. Die m oglichen Konguration sind in der folgenden Tabelle aufgelistet: PR2 0 0 0 0 1 1 1 1 PR1 0 0 1 1 0 0 1 1 PR0 0 1 0 1 0 1 0 1 Faktor 1 2 4 8 16 32 Reserviert Reserviert Dauer eines Taktes 125ns 250ns 500ns 1s 2s 4s -

3.11

Timer Interrupt Flag 1 (TFLG1)

0x008E
Auswirkungen. Zugrie auf dieses Register sind jederzeit m oglich. Falls das TFFCA-Bit im Timer System Control Register gesetzt ist, wird bei einem Lese- oder Schreibzugri auf das Output Compare Register (TC0..9) das zugeh orige Bit im TFLG1 automatisch gel oscht. 3 C3F 0 2 C2F 0 1 C1F 0 0 C0F 0

Die Bits im Interrupt Flag Register werden gesetzt, wenn sich an dem zum entsprechenden Bit geh orenden Kanal eine Interruptbedingung erf ullt hat, das Eintreen der im TCTL3/4 festgelegten Flanke oder ein Output Compare. Um das Flag zu l oschen, muss eine 1 in das entsprechende Bit geschrieben werden, das Schreiben einer 0 hat keine Bit 7 C7F 0 6 C6F 0 5 C5F 0

RESET:

4 C4F 0

CnF: Input Capture/Output Compare Kanal n Flag

3.12

Timer Interrupt Flag 2 (TFLG2)

0x008F
lich. Falls im Timer System Control Register das TFFCA-Bit gesetzt ist, wird Timer Overow Flag (Bit 7) nach jedem Zugri auf das Timer Count Register automatisch gel oscht.

Das Bit 7 des Timer Interrupt Flag 2 wird bei Uberlauf des 16-Bit Z ahlers von 0xFFFF nach 0x0000 gesetzt. Um das Flag zu l oschen, muss eine 1 ins Bit 7 geschrieben werden. Der Zugri ist immer m ogBit 7 TOF 0 6 0 0 5 0 0 4 0 0

RESET:

3 0 0

2 0 0

1 0 0

0 0 0

TOF: Timer Overow Flag

Lemps12-Timerfunktionen

12

3.13

Timer Input Capture/Output Compare Register 0..7 (TC0..7) 0x0090..9F


lers gesichert. Wird der zugeh orige Kanal als Output Compare verwendet, wird in das TCn der Z ahlerwert geschrieben, bei dem ein Output Compare ausgel ost werden soll. Zugrie sind jederzeit m oglich. 3 11 3 0 2 10 2 0 1 9 1 0 0 8 0 0

Wenn der zugeh orige Timerkanal im TIOS als Input Compare gesetzt ist, wird im entsprechenden Timer Input Compare/Output Compare Register beim Eintreen der im TCTL3/4-Register f ur den Kanal festgelegte Flanke der Inhalt des 16-Bit Z ahBit 7 Bit 15 Bit 7 0 6 14 6 0 5 13 5 0 4 12 4 0

RESET:

3.14

Pulse Accumulator Control Register (PACTL)

0x00A0

Im Pulse Accumulator Control Register werden alle f ur den Betrieb des Pulse Accumulators notwendigen Einstellungen vorgenommen. Der Pulse Accumulator funktioniert zwar unabh angig vom Timer, Bit 7 0 0 6 PAEN 0

der Time Accumulation Mode ist aber nicht m oglich, wenn das Timer Enable Bit im Timer System Control Register nicht gesetzt ist, da kein Z ahlertakt vorhanden ist. 3 CLK1 0 2 CLK0 0 1 PAOVI 0 0 PAI 0

RESET:

5 4 PAMOD PEDGE 0 0

PAEN: Pulse Accumulator System Enable 0: Pulse Accumulator System ausgeschaltet 1: Pulse Accumulator System eingeschaltet PAMOD: Pulse Accumulator Mode 0: Event Counter Mode 1: Gated Time Accumulation Mode PEDGE: Pulse Accumulator Edge Control Im Event Counter Modus: 0: Nach jeder abfallenden Flanke am Timerkanal 7 z ahlt der PACNT eins Vorw arts. 1: Nach jeder ansteigenden Flanke am Timerkanal 7 z ahlt der PACNT eins Vorw arts. Im Gated Time Accumulation Modus: 0: W ahrend der Kanal 7 auf High liegt, z ahlt der Pulse Accumulator Counter vorw arts. Die darauolgende abfallende Flanke setzt das Pulse Accumulator Interrupt Flag. 1: W ahrend der Kanal 7 auf Low liegt, z ahlt der Pulse Accumulator Counter vorw arts. Die darauolgende ansteigende Flanke setzt das Pulse Accumulator Interrupt Flag. CLK1,CLK0: Clock Select Register Uber diese zwei Bit kann der Pulse Accumulator als Vorteiler f ur den Timer Counter genutzt werden. Damit k onnen extrem lange Z ahlintervalle f ur den Timer generiert werden. Wenn der Pulse Accumulator ausgeschaltet ist, wird immer der Timer Prescaler als Clock f ur den Timer Counter verwendet. Der Wechsel von einem Clock zum Anderen erfolgt unmittelbar nach dem setzten der erforderlichen Bits. Die folgende Tabelle gibt Auskunft u oglichber die verschiedenen Einstellungsm keiten:

Lemps12-Timerfunktionen

13

CLK1 0 0 1 1

CLK0 0 1 0 1 Der Der Der Der

Ausgew ahlter Takt Timer Prescaler wird als Timer Counter Clock verwendet PACLK wird als Timer Counter Clock verwendet PACLK wird u ber einen Teiler durch 256 verwendet PACLK wird u ber einen Teiler durch 65536 verwendet

PAOVI: Pulse Accumulator Overow Interrupt Enable 0: Kein Interrupt nach einem Uberlauf des Pulse Accumulator Counters von 0xFFFF nach 0x0000. 1: Nach einem Uberlauf des Pulse Accumulator Counters von 0xFFFF nach 0x0000 wird ein Interrupt ausgel ost. PAI: Pulse Accumulator Interrupt Enable 0: Nach dem Setzen des PAIF-Flags wird kein Interrupt ausgel ost. 1: Nach dem Setzen des PAIF-Flags wird ein Interrupt ausgel ost.

3.15

Pulse Accumulator Interrupt Flag Register (PAFLG)

0x00A1

Nach einem Uberlauf des Pulse Accumulator Counters oder wenn im Gated Time Accumulation Mode die gew unschte Flanke am Kanal 7 eingetroen ist, werden im Pulse Accumulator Flag Register die entsprechenden Flags gesetzt. Durch schreiben eiBit 7 0 0 6 0 0 5 0 0 4 0 0

ner 1 ins entsprechende Bit wird das Flag wieder gel oscht. Wenn das TFFCA-Bit im TSCR gesetzt ist, werden die beiden Flags nach einem Zugri auf das Pulse Accumulator Counter Register sofort gel oscht. 3 0 0 2 0 0 1 PAOVF 0 0 PAIF 0

RESET:

PAOVF: Pulse Accumulator Overow Flag Dieses Flag wird nach einem Uberlauf des Pulse Accumulator Counters von 0xFFFF nach 0x0000 gesetzt. PAIF: Pulse Accumulator Input Edge Flag Im Event Counter Mode wird dieses Flag jedesmal beim Eintreen der im PEDGE-Bit eingestellten Flanke gesetzt. Beim Gated Time Accumulation Mode wird dieses Flag beim Eintreen der nachfolgenden Flanke gesetzt.

3.16

Pulse Accumulator Count Register (PACNT)

0x00A2/A3

Der Pulse Accumulator Counter z ahlt je nach Einstellung im PACTL die Flanken am Timerkanal 7 oder die Zeit, w ahrend der der Kanal 7 High oder Low ist. Schreib und Lesezugrie auf dieses RegisBit 7 Bit 15 Bit 7 0 6 14 6 0 5 13 5 0 4 12 4 0

ter sind jederzeit m oglich. Zu beachten ist, dass bei der Zeitz ahlung der Systemclock u ber einen Vorteiler durch 64 verwendet wird. Es gibt keine Einstellm oglichkeiten. 3 11 3 0 2 10 2 0 1 9 1 0 0 8 0 0

RESET:

Lemps12-Timerfunktionen

14

Anwendungsbeispiele
liegt am Ende dieser Dokumentation bei, es empehlt sich aber, zuerst die L osung der Aufgaben selbst zu versuchen. Der Lerneekt ist so gr osser, als wenn man einfach den Quelltext abschreibt. Viel Spass mit dem HC12 Timer!

Die folgenden Anwendungsbeispiele sollen einen Einblick in die Verwendung der HC12 Timerfunktionen geben. Die M oglichkeiten, die der HC12 bietet sind damit nat urlich bei weitem noch nicht ersch opft. Der Quellcode zu den Beispielprogrammen

4.1

Temperaturmessung mit dem Sensor SMT160-30

Die meisten Sensoren wandeln die Messwerte in analoge Signale um, die nachher mit dem A/DWandler wieder digitalisiert werden m ussen. Leider ist dies oft eine fehlertr achtige Angelegenheit und auch die Kalibrierung ist nicht ganz einfach. Die Senoren der Serie SMT160-30 sind bereits kalibriert und geben ein Rechtecksignal aus. Die Temperaturinformation ist im Verh altnis Einschaltzeit zur Periodendauer enthalten und kann mit dem HC12 Timer problemlos ausgewertet werden.

sultat habe ich mit dem Hundertfachen des Subtrahenden 68.086 subtrahiert. Das Ergebnis ist das Hundertfache der eektiven Temperatur. Anschliessend habe ich dieses zweimal durch 10 dividiert, das erste Mal um eine nicht relevante Stelle loszuwerden, das zweite Mal um den Wert vor dem Punkt (Grad) und den hinter dem Punkt (1/10 Grad) zu erhalten. Zu beachten ist, dass bei Werten unter 0 Grad negative Werte vorhanden sind, die zwar ausgegeAuswertung des Signals: ben werden k onnen, aber in einem komischen ForF ur die Auswertung des Signals eignet sich die In- mat erscheinen (z.B. -7.5 C wird als -7.-5 C ausgeput Capture Funktion. Die Temperatur kann mit geben). Aus diesem Grund habe ich alle negativen der Formel in der folgenden Darstellung bestimmt Werten in positive umgewandelt und das Vorzeichen werden: entsprechend gesetzt.

Wichtige Daten des SMT160-30:


Speisespannung Stromaufnahme Temperaturbereich Genauigkeit (-30..100 C) Unlinearit at Frequenz Impedanz 4,75-7V max. 200A -40 bis +130 C 1.2 C 0.4 C 1..4kHz 200

Die H urde dieser Aufgabe besteht darin, dass wir es mit Fliesskommawerten zu tun haben. Bei der Programmierung mit Assembler ist der Umgang mit solchen Zahlen weit dornenreicher als in Hochsprachen wie C. Im Beispielprogramm habe ich allerdings darauf verzichtet, die gr osstm ogliche Genauigkeit zu verwenden. Ich habe zuerst die Einschaltdauer mit dem Hundertfachen des Faktors 212.766 multipliziert und anschliessend die Division durch die gesamte Periodendauer vorgenommen. Das Re-

Aufgabe:
Erstellen sie ein Programm, welches die Temperatur eines Sensors am Bildschirm oder an der LCDAnzeige ausgibt. Im Beispielprogramm wurde f ur die Ausgabe die LCD-Anzeige verwendet.

Lemps12-Timerfunktionen

15

4.2

Lemps12-Stoppuhr
Der Interrupthandler ist eine ganz normale Funktion, die alle Anweisungen beinhaltet, die nach dem entsprechenden Interrupt abgearbeitet werden m ussen. Zu beachten ist, dass der Interrupthandler nicht, wie normale Funktionen mit dem Befehl rts, sondern mit dem Befehl rti (Return from Interrupt) beendet wird. Damit wird der Prozessor angewiesen, die vor dem Interrupt vorhandenen Register und Akkumulatoreninhalte aus dem Stack zur uckzuholen. Schliesslich muss der Interrupt noch initialisiert, das heisst, dem System bekannt gemacht werden. Zuerst wird der Interruptvektor1 angepasst, der Interruptvektor enth alt einen jmp-Befehl und anschliessend die Adresse des Interrupthandlers. Mit movw #Label Handler,Bezeichnung Vektor +1 wird die Adresse des Interrupthandlers im Interruptvektor eingetragen. Durch das +1 am Ende wird die Adresse des Interruptvektors inkrementiert, damit die Adresse des Interrupthandlers hinter dem notwendigen jmpBefehl steht, sonst funktioniert die ganze Sache nicht. Wichtig ist der Befehl cli am Ende der Funktion. Dieser Befehl l oscht das Interrupt Mask Bit im Condition Code Register (CCR) und erm oglicht damit Interrupts.

Mit der Output Compare Funktion l asst sich mit relativ geringem Aufwand eine Stoppuhr programmieren. Den Output Compare ben utzt man, um m oglichst pr azise Zeitimpulse zu erhalten. Dazu stellt man mit Vorteil den Prescaler des Timer Counters so ein, dass er jede s eins vorw arts z ahlt. Nun lassen sich mit dem Output Compare leicht 10 ms Impulse generieren. Nach jedem 10s-Impuls wird ein Interrupt ausgel ost, der die Z ahlung vornimmt. Die Ausgabe der Zeit erfolgt u ber die LCDAnzeige. Die Ausgabe soll in Hundertstelsekunden, Sekunden, Minuten und Stunden unterteilt sein. Wird f ur die Ausgabe im char-Format (%u) vorgenommen, so hat man mit dem Handorgel-Eekt zu k ampfen, da hier bei Zahlen unter zehn keine 0 vorangestellt wird. Im Beispiel habe ich f ur jede einzelne Stelle eine Zahl verwendet. Der Timer l asst sich f ur diese Aufgabe auf zwei verschiedene Arten verwenden: Setzt man das Timer Reset Enable-Bit, so wird der Timer Counter nach einem Output Compare an Kanal 7 auf 0x0000 zur uckgestellt. So braucht man als einziges den Wert 10000 ins Register TC7 zu schreiben und die Sache ist geritzt. Der Haken dabei: will man den Timer gleichzeitig noch anderweitig verwenden, haut das leider nicht. Verwendet man den Kanal 7 ohne des Timer Reset Enable Bit zu setzen oder eine der anderen Kan ale, so schreibt man als erstes den Wert 10000 in das TCn. Nach jedem Output Compare muss man jetzt aber den im TCn enthaltenen Wert um 10000 erh ohen. Dies hat den Vorteil, das die anderen Kan ale ohne Einschr ankungen verwendet werden k onnen. Die H urden dieser Stoppuhr liegen aber weniger in der Verwendung des Timers selbst, sondern bei den Interruptfunktionen, die f ur dieses Programm (leider?) notwendig sind. Auf die Interruptfunktionen gehe ich hier nicht n aher ein, ich beschr anke mich hier darauf, soviel zu erkl aren, damit das Stoppuhrprogramm geschrieben werden kann:

Aufgabe:
Programmieren Sie eine Stoppuhr, die u ber eine dauernde Ausgabe der Zeit an die LCDAnzeige verf ugt. Die Ausgabe soll in Stunden:Minuten:Sekunden.Hundertstelsekunden unterteilt sein. Die Ausgabe soll alle Nullen ausgeben (z.B. 5 Sekunden als 05), damit das Hin- und Herspringen der Ausgabe verhindert wird. Uber die Taste 0 soll die Zeitmessung gestartet, angehalten und auch wieder gestartet werden k onnen. Die Taste 1 soll die Zwischenzeit ausgeben, der Z ahler muss aber weiterz ahlen. Die Messung soll mit der Taste 2 abgebrochen werden k onnen, dies soll aber nur m oglich sein, nachdem die Messung mit der Taste 0 gestoppt wurde.

4.3

LED-Dimmer mit PWM

Mit dem Pulsweitenmodulator l asst sich mit sehr riodendauer wird im Timer Input Capture/Output geringem Aufwand ein Dimmer realisieren. Die Pe- Compare Register 7 (TC7) festgelegt. Das Timer
1 Die Bezeichnungen der Interruptvektoren und deren Adressen ndet man im Lemps12-Usermanual oder in den MotorolaHandb uchern

Lemps12-Timerfunktionen

16

Counter Reset-Bit muss unbedingt gesetzt werden, damit der Timer Counter nach jeder Periode wieder zur uckgestellt wird. Das L oschen von Interrupt Flags ist nicht notwendig, das TFFCA-Bit muss auch nicht gesetzt werden.

Mit der Taste 0 soll die Leuchtst arke vermindert und mit der Taste 1 erh oht werden k onnen. W ahrend dem Dr ucken der Taste soll die LED langsam heller oder dunkler werden. Die Au osung soll 5060 Schritte betragen. Der LED-Anschluss muss mit Aufgabe: dem PORTT verbunden werden. Dehnen Sie den Programmieren Sie einen Dimmer f ur die LED 0. Versuch auf weitere LEDs aus.

4.4

Prellen die Tasten wirklich?


tergrund alle Impulse, die durch das Dr ucken der Tasten und durch das Prellen verursacht werden. Der Tasteranschluss muss mit dem PORTT verbunden sein. Mit einem Druck auf die Taste 0 soll die Anzahl Impulse und die Anzahl der Tastendr ucke am Terminal ausgegeben werden. F ur diese Anwendung ist es nicht notwendig, das Timer Enable-Bit zu setzen. Dr ucken Sie die Taste einige Male und vergleichen Sie, wieviele Impulse der Event Counter festgestellt hat und wieviele Tastendr ucke Sie eektiv gemacht haben, das Ergebnis wird auf jeden Fall interessant sein!

Viele werden sich schon gefragt haben, ob die Tasten wirklich nachprellen, wie da immer behauptet wird. Mit dem Event Counter des Pulse Accumulators l asst sich das zumindest f ur die Taste 7 leicht nachpr ufen. Der Event Counter z ahlt je nach Einstellung die ansteigenden oder abfallenden Flanken am Timerkanal 7.

Aufgabe:
Programmieren Sie einen Z ahler, der die Impulse der Taste 7 z ahlt. Entprellen Sie die Taste, nachdem Sie gedr uckt wurde und z ahlen Sie die eektiven Bet atigungen, der Event Counter z ahlt im Hin-

4.5

Wie lange dauert ein Tastendruck?


Das Setzen des Timer Enable-Bits ist notwendig, da sonst der Counter nicht l auft.

Nach 20ms gilt ein Taste als gedr uckt, wie lange dauert aber ein normaler Tastendruck? Mit dem Gated Time Accumulation Mode des Pulse Accumulators l asst sich dies leicht f ur die Taste 7 feststellen. In diesem Modus z ahlt der Pulse Accumulator im 8s-Takt die Zeit, w ahrend der der Timerkanal 7 je nach Einstellung High oder Low ist. Wechselt der Eingang auf den Zustand, in dem der Counter nicht z ahlt, wird das PAIF-Flag gesetzt.

Aufgabe:
Erstellen Sie eine Anwendung, die, nachdem das PAIF-Flag gesetzt wurde, die Dauer des Tastendrucks in ms am Terminal ausgibt. Beachten Sie aber, dass die maximal m ogliche Zeit, bedingt durch die Grenzen des Pulse Accumulator Counters, bei 500ms liegt.

Lemps12-Timerfunktionen

17

5
5.1

Quelltexte zu den Beispielen


Temperaturmessung

;-----------------------------------------------------------------------; Titel: Temperaturmessung mit Lemps12 ; File: temp.asc ; Funktion: Misst mit Sensoren die Temperatur und gibt ; sie an die LCD-Anzeige aus ; Hardware: Lemps12 und Temperatursensoren SMT 160-30 ; Verfasser: Hans Kottmann ; Datum: 07.03.02 ;-----------------------------------------------------------------------cpu 68hc12 padding off Include "MyInc12.Inc" org $2000 ;Programm Startadresse

;Hauptprogramm ---------------------------------------------------------main ldx ldy jsr jsr ldaa jsr ldx jsr ldaa jsr ldy jsr ldx ldy jsr ldab jsr ldaa jsr ldx ldy jsr ldx ldy iny jsr ldab jsr ldaa jsr #PORTJ #DDRJ LcdInit LcdCursOff #$80 LcdCursSet #Hallo LcdWrite #$C0 LcdCursSet #Zeit TimeGet #ZOut #Zeit LcdWrite #$01 Messung #$94 LcdCursSet #Ausg1 #Temp1 LcdWrite #Ausg11 #Temp1 LcdWrite #$02 Messung #$D4 LcdCursSet ;Adresse von PORTJ in Reg. X ;Adresse von DDRJ in Reg. Y ;Funktion LcdInit aufrufen ;Cursor unsichtbar ;Cursoradresse in Akku A laden ;Cursor setzen ;Adresse von Hallo in Reg. X ;Begr ussung ausgeben ;Cursorposition in Akku A ;Cursor setzen ;Adresse von Zeit in Reg. Y ;Zeit aus RTC auslesen ;Adresse von ZOut in Reg. X ;Adresse von Zeit in Reg. Y ;Zeit ausgeben ;Messungsnummer in Akku B ;Funktion Messung aufrufen ;Cursorposition in Akku A laden ;Cursor setzen ;Adresse von Ausg1 in Reg. X ;Adresse von Temp1 in Reg. X ;Vorzeichen von Temperatur 1 ausgeben ;Adresse von Ausg11 in Reg. X ;Adresse von Temp1 in Reg. Y ;Adresse von Temp1 incrementieren ;Temperatur 1 ausgeben ;Messungsnummer in Akku B ;Funktion Messung aufrufen ;Cursorposition in Akku A laden ;Cursor setzen

loop

Lemps12-Timerfunktionen

18

ldx ldy jsr ldx ldy iny jsr ldx jsr lbra

#Ausg1 #Temp1 LcdWrite #Ausg11 #Temp1 LcdWrite #1000 DelayXms loop

;Adresse von Ausg1 in Reg. X ;Adresse von Temp1 in Reg. X ;Vorzeichen von Temperatur 1 ausgeben ;Adresse von Ausg11 in Reg. X ;Adresse von Temp1 in Reg. Y ;Adresse von Temp1 incrementieren ;Temperatur 1 ausgeben ;1s Verz. laden ;warten ;Wieder von vorne

;Unterprogramme --------------------------------------------------------Messung bset cmpb lbeq bset movb brclr movw movb movb brclr movw movb movb brclr movw lbra bset movb brclr movw movb movb brclr movw movb movb brclr movw ldd subd ldy emul pshd ldd subd tfr puld ediv tfr subd ldx TSCR,#$80 #$02 Messung2 TCTL4,#$01 #$01,TFLG1 TFLG1,$01,Mess1 TC0,Time1 #$02,TCTL4 #$01,TFLG1 TFLG1,$01,Mess2 TC0,Time2 #$01,TCTL4 #$01,TFLG1 TFLG1,$01,Mess3 TC0,Time3 Auswert TCTL4,#$04 #$02,TFLG1 TFLG1,$02,Mess4 TC1,Time1 #$08,TCTL4 #$02,TFLG1 TFLG1,$02,Mess5 TC1,Time2 #$04,TCTL4 #$02,TFLG1 TFLG1,$02,Mess6 TC1,Time3 Time2 Time1 #21277 ;Timer Enable ;Messung 2? ;Falls ja, nach Messung2 ;Kanal 0: Ansteigende Flanke ;Timerflag l oschen ;Warten, bis Timerflag gesetzt ;Timerwert in Time1 sichern ;Kanal 0: Fallende Flanke ;Timerflag l oschen ;Warten, bis Timerflag gesetzt ;Timerwert in Time2 sichern ;Kanal 0: Ansteigende Flanke ;Timerflag l oschen ;Warten, bis Timerflag gesetzt ;Timerwert in Time3 speichern ;Weiter nach Auswert ;Kanal 1: Ansteigende Flanke ;Timerflag l oschen ;Warten, bis Timerflag gesetzt ;Timerwert in Time1 sichern ;Kanal 1: Fallende Flanke ;Timerflag l oschen ;Warten, bis Timerflag gesetzt ;Timerwert in Time2 sichern ;Kanal 1: Ansteigende Flanke ;Timerflag l oschen ;Warten, bis Timerflag gesetzt ;Timerwert in Time3 speichern ;Wert von Time2 in Akku D ;D - Time1 --> D ;Faktor in Reg. Y laden ;D x Y --> Y:D ;Akku D auf den Stack werfen ;Wert von Time 3 in Akku D ;D - Time1 --> D ;Resultat in Reg. X ;Vorheriger Wert vom Stack holen ;(Y:D) / X --> Y ;Resultat in Akku D ;D - 6809 = Temp * 100 ;Teiler in Reg. X laden

Mess1

Mess2

Mess3

Messung2 Mess4

Mess5

Mess6 Auswert

Time3 Time1 D,X

Y,D #6809 #10

Lemps12-Timerfunktionen

19

Mess7 Mess8

Mess9

idivs tfr ldx idivs ldy cmpb lblo comb incb movb lbra movb stab tfr cmpb lblo comb incb movb stab bclr rts

X,D #10 #Temp1 #$80 Mess7

#$2D,0,Y Mess8 #$2B,0,Y 2,Y X,D #$80 Mess9

#$2D,0,Y 1,Y TSCR,#$80

;D / X --> X ;Resultat in Akku D ;Teiler in Reg. X ;D / X --> X ;Adresse von Temp1 in Reg. Y ;Negativer Wert? ;Falls nicht, nach Mess4 ;Komplement bilden ;und incrementieren ;Negatives Vorzeichen setzen ;Weiter nach Mess5 ;Positives Vorzeichen setzen ;Wert hinter Komma speichern ;Ganzzahliger Wert in Akku D ;Negativer Wert? ;Falls nicht, nach Mess6 ;Komplement bilden ;und incrementieren ;Negatives Vorzeichen setzen ;Ganzzahliger Wert speichern ;Timer Disable ;zur uck zum Aufruf

;Definition der Variablen (RAM) ----------------------------------------org Hallo ZOut Ausg1 Ausg11 Zeit Time1 Time2 Time3 Temp1 Temp2 fcb fcb fcb fcb rmb rmb rmb rmb rmb rmb $5000 "Lemps12 Temperatur ",0 "Zeit: %bx:%bx:%bx",0 "Temp. 1: %c",0 "%bd.%bd C ",0 3 2 2 2 3 3

Lemps12-Timerfunktionen

20

5.2

HC12-Stoppuhr

;-----------------------------------------------------------------------; Titel: Lemps12 Stoppuhr ; File: stopper.asc ; Funktion: Stoppuhr mit Zwischenzeit 1/100s ; Hardware: Lemps12 mit LCD-Anzeige ; Verfasser: Hans Kottmann ; Datum: 07.03.02 ;-----------------------------------------------------------------------cpu 68hc12 padding off Include "MyInc12.Inc" org $2000 ;Programm Startadresse

;Hauptprogramm ---------------------------------------------------------main jsr ldx ldy jsr jsr jsr ldaa jsr ldx jsr ldaa jsr ldx jsr clra ldx movb inca cmpa lbne brset lbra movb movb brset ldx jsr ldaa jsr ldx jsr ldaa OC7Init #PORTJ #DDRJ LcdInit LcdCursOff lcdClr #$80 LcdCursSet #Hallo LcdWrite #$94 LcdCursSet #Start LcdWrite #Zeit #$00,1,X+ #$08 loop2 PORTD,$01,Stopp loop3 #$80,CFORC #$01,Hold PORTD,$01,Stopp1 #20 DelayXms #$C0 LcdCursSet #Mess1 LcdWrite #$D4 ;Funktion OC7Init aufrufen ;Adresse von PORTJ in Reg. X ;Adresse von DDRJ in Reg. Y ;Funktion LcdInit aufrufen ;Cursor ausschalten ;LCD-Anzeige l oschen ;Cursoradresse in Akku A ;Cursor setzen ;Adresse von Hallo in Reg. X ;Begr ussung ausgeben ;Cursoradresse in Akku A ;Cursor setzen ;Adresse von Start in Reg. X ;Start ausgeben ;Akku A l oschen ;Adresse von Zeit in Reg. X ;Zeit l oschen ;Akku A inkrementieren ;Acht durchl aufe erreicht? ;Falls nicht, weiter l oschen ;Taste 0: Zeitmessung starten ;Nach loop3 verweigen ;OC7-Interrupt von Hand ausl osen ;Z ahler einschalten ;Warten, bis Taste gel ost ist ;20ms Verz ogerung laden ;Entprellen ;Cursoradresse in Akku A ;Cursor setzen ;Adresse von Mess1 in Reg. X ;Status ausgeben ;Cursoradresse in Akku A

loop

loop1 loop2

loop3

Stopp Stopp1

Stopp2

Lemps12-Timerfunktionen

21

Stopp3

jsr ldx jsr ldaa jsr ldx ldy jsr brset brset lbra movb brset ldx jsr ldaa jsr ldx jsr ldaa jsr ldx jsr brset brset lbra movb lbra brset ldx jsr ldaa jsr ldx jsr ldaa jsr ldx jsr brclr brset ldx jsr lbra

LcdCursSet #Mess3 LcdWrite #$94 LcdCursSet #Mess2 #Zeit LcdWrite PORTD,$01,Halt PORTD,$02,Zzeit Stopp3 #$00,Hold PORTD,$01,Halt1 #20 DelayXms #$C0 LcdCursSet #Mess4 LcdWrite #$D4 LcdCursSet #Mess5 LcdWrite PORTD,$01,Stopp PORTD,$04,Halt3 Halt2 #$00,Hold loop PORTD,$02,Zzeit #20 DelayXms #$C0 LcdCursSet #Mess6 LcdWrite #$D4 LcdCursSet #Mess7 LcdWrite PORTD,$02,Zzeit1 PORTD,$02,Zzeit2 #20 DelayXms Stopp2

;Cursor setzen ;Adresse von Mess3 in Reg. X ;Optionen Ausgeben ;Cursoradresse in Akku A ;Cursor setzen ;Adresse von Mess2 in Reg. X ;Adresse von Zeit in Reg. Y ;Zeit ausgeben ;Falls T0 gedr., nach Halt ;Falls T1 gedr., nach Zzeit ;Laufend Zeit ausgeben ;Z ahler blockieren ;Warten, bis Taste gel ost ;20ms Verz. laden ;Entprellen ;Cursoradresse in Akku A ;Cursor setzen ;Adresse von Mess4 in Reg. X ;Status ausgeben ;Cursoradresse in Akku A ;Cursor setzen ;Adresse von Mess5 in Reg. X ;Optionen ausgeben ;Taste 0: Zeit messen ;Taste 2: Messung beenden ;Warten, bis Option gew ahlt ;Z ahler blockieren ;zur uck zum Anfang ;Warten, bis Taste gel ost ;20 ms Verz. laden ;Entprellen ;Cursoradresse in Akku A ;Cursor setzen ;Adresse von Mess6 in Reg. X ;Status ausgeben ;Cursoradresse in Akku A laden ;Cursor setzen ;Adresse von Mess7 in Reg. X ;Optionen Ausgeben ;Warten, bis Zwischenzeit beendet ;Warten, bis Taste gel ost ;20 ms Verz. laden ;Entprellen ;Ausgabe Weiterfahren

Halt Halt1

Halt2

Halt3

Zzeit

Zzeit1 Zzeit2

;Unterprogramme --------------------------------------------------------OC7Init movw bset bset bset bset #OC7Hand,TC7I+1 TIOS,#$80 TSCR,#$80 TMSK2,#$3B TMSK1,#$80 ;Interruptadresse umleiten ;Timerkanal 7 als OC setzen ;Timer Enable ;Prescaler auf 1us, Counter Reset Enable ;OC7 Interrupt aktivieren

Lemps12-Timerfunktionen

22

movw movb cli rts

#10000,TC7 #$80,TFLG1

;Maximalwert des Z ahlers festlegen ;Timer Interrupt Flag l oschen ;Interrupts freigeben ;zur uck zum Aufruf

;Interrupthandler ------------------------------------------------------OC7Hand movb ldaa cmpa lbeq ldx inc ldaa cmpa lbne movb inc ldaa cmpa lbne movb inc ldaa cmpa lbne movb inc ldaa cmpa lbne movb inc ldaa cmpa lbne movb inc ldaa cmpa lbne movb inc ldaa cmpa lbeq cmpa lbne movb inc lbra ldaa cmpa lbne #$80,TFLG1 Hold #$00 Fin #Zeit 7,X 7,X #10 Fin #$00,7,X 6,X 6,X #10 Fin #$00,6,X 5,X 5,X #10 Fin #$00,5,X 4,X 4,X #6 Fin #$00,4,X 3,X 3,X #10 Fin #$00,3,X 2,X 2,X #6 Fin #$00,2,X 1,X 1,X #4 OC7Hand1 #10 Fin #$00,1,X 0,X Fin 0,X #2 Fin ;Timer Interrupt Flag l oschen ;Hold-Flag in Akku A laden ;Z ahler ausgeschaltet? ;Falls ja, nach Fin ;Adresse von Zeit in Reg. X ;Hundertstel incrementieren ;Hundertstel in Akku A laden ;Wert 10 erreicht? ;Falls nicht, nach Fin ;Hundertstel auf 0 setzen ;Zehntel incrementieren ;Zehntel in Akku A laden ;Wert 10 erreicht? ;Falls nicht, nach Fin ;Zehntel auf 0 setzen ;Sekunden incrementiern ;Sekunden in Akku A laden ;Wert 10 erreicht? ;Falls nicht, nach Fin ;Sekunden auf 0 setzen ;10-Sekunden incrementieren ;10-Sekunden in Akku A laden ;Wert 6 erreicht? ;Falls nicht, nach Fin ;10-Sekunden 0 setzen ;Minuten incrementieren ;Minuten in Akku A laden ;Wert 10 erreicht? ;Falls nicht, nach Fin ;Minuten auf 0 setzen ;10-Minuten incrementieren ;10-Minuten in Akku A laden ;Wert 6 erreicht? ;Falls nicht, nach Fin ;10-Minuten auf 0 setzen ;Stunden incrementieren ;Stunden in Akku A laden ;Wert 4 erreicht? ;Falls ja, nach OC7Hand1 ;Wert 10 erreicht? ;Falls nicht, nach Fin ;Stunden auf 0 setzen ;10-Stunden incrementieren ;weiter zum Ende des Interrupts ;10-Stunden in Akku A laden ;Wert 2 erreicht --> 24 Std. ;Falls nicht, nach Fin

OC7Hand1

Lemps12-Timerfunktionen

23

Fin

movw rti

#$0000,0,X

;Stunden 0 setzen ;zur uck vom Interrupt

;Definition der Variablen (RAM) ----------------------------------------org Hallo Start Mess1 Mess2 Mess3 Mess4 Mess5 Mess6 Mess7 Zeit Hold fcb fcb fcb fcb fcb fcb fcb fcb fcb rmb fcb $5000 ;Adresse f ur Variablen im RAM

"Stoppuhr: ",0 ;Startanzeige "Start: Taste 0 ",0 ;Startanzeige 2 "Messung laeuft ",0 ;Messungsstatus "Zeit: %bu%bu:%bu%bu:%bu%bu.%bu%bu",0 ;Zeitausgabestring "T0: Stopp T1: ZwZeit",0 ;Optionenstring "Messung gestoppt ",0 ;Statusanzeige 3 "T0: Start T2: Ende ",0 ;Optionenstring 2 "Zwischenzeit: ",0 ;Statusanzeige 4 "T1: Zeit anzeigen ",0 ;Optionenstring 3 8 ;Array f ur die Zeitwerte $00 ;Z ahler ein/aus

Lemps12-Timerfunktionen

24

5.3

LED-Dimmer mit PWM

;-----------------------------------------------------------------------; Titel: PWM-Demo ; File: pwmdemo.asc ; Funktion: 60-Schritt Dimmer f ur LED 0 ; Hardware: Lemps12 ; Verfasser: Hans Kottmann ; Datum: 07.03.02 ;-----------------------------------------------------------------------cpu 68hc12 padding off Include "MyInc12.Inc" org $2000 ;Programm Startadresse

;Hauptprogramm ---------------------------------------------------------main bset bset bset movb bset bset bset movw movw brclr ldd cpd lbeq subd std ldx jsr brclr ldd cpd lbeq addd std ldx jsr lbra TIOS,#$81 TSCR,#$80 TMSK2,#$1B #$81,TFLG1 OC7M,#$01 OC7D,#$01 TCTL2,#$02 #1,TC0 #602,TC7 PORTD,$01,loop1 TC0 #1 loop #10 TC0 #50 DelayXms PORTD,$02,loop TC0 #601 loop #10 TC0 #50 DelayXms loop ;Kan ale 0+7 als OC setzen ;Timer Enable ;Prescaler select + Counter Reset ;Timer Interrupt Flag l oschen ;Kanal 0 als Ausgang ;Kanal 0 nach OC7 auf High ;Kanal 0 nach OC0 auf Low ;Lampe aus (Pulsweite 1us) ;Impulsdauer 200us ;Falls Taste 0 nicht gedr. nach loop1 ;Wert von TC0 in Akku D ;Lampe aus? ;Falls ja, nach loop ;Pulsweite um 10us verringern ;und setzen ;50us Verz. laden ;Warten ;Falls Taste 1 nicht gedr. nach loop ;Wert von TC0 in Akku D ;Lampe ein? ;Falls ja, nach loop ;Pulsweite um 10us erh ohen ;und setzen ;50us Verz. laden ;Warten ;Wieder von vorn

loop

loop1

Lemps12-Timerfunktionen

25

5.4

Prellen die Tasten wirklich?

;-----------------------------------------------------------------------; Titel: Prellen von Tasten ; File: prell.asc ; Funktion: Stellt das Prellen von Tasten mit dem Event-Counter fest ; Ausgewertet wird Taste 7, Ausgabe an Terminal durch ; Taste 0 ; Hardware: Lemps12 ; Verfasser: Hans Kottmann ; Datum: 07.03.02 ;-----------------------------------------------------------------------cpu 68hc12 padding off Include "MyInc12.Inc" org $2000 ;Programm Startadresse

;Hauptprogramm ---------------------------------------------------------main loop loop1 bset movw brclr brset inc ldx jsr brclr ldx ldy jsr ldx ldy jsr movw movb brset ldx jsr lbra PACTL,#$50 #0,PACNT PORTT,$80,loop2 PORTT,$80,loop1 Tast #20 DelayXms PORTT,$01,loop #Message1 #Tast Write #Message2 #PACNT WriteLn #0,PACNT #0,Tast PORTT,$01,loop3 #50 DelayXms loop ;Pulse Accumulator initialisieren ;PA Count Register l oschen ;Falls Taste 7 nicht gedr, nach loop2 ;Warten, bis Taste gel ost ;Tast incrementieren ;20ms Verz. laden ;Entprellen ;Warten, bis Taste 0 gedr uckt ;Adresse von Message2 in Reg. X ;Adresse von Tast in Reg. Y ;Anzahl eff. Tastendr ucke ausgeben ;Adresse von Message2 in Reg. X ;Adresse von PACNT in Reg. Y ;Anzahl reg. Tastendr ucke ausgeben ;PA Count Register l oschen ;Tast l oschen ;Warten, bis Taste losgelassen ;50ms Verz. laden ;Entprellen ;Wieder von vorn

loop2

loop3

;Definition der Variablen (RAM) ----------------------------------------org Message1 Message2 Tast fcb fcb fcb $5000 "%bu effektive Tastendruecke, ",0 "%d Tastenbewegungen wurden registriert",0 $00

Lemps12-Timerfunktionen

26

5.5

Wie lange dauert ein Tastendruck?

;-----------------------------------------------------------------------; Titel: Wie lange dauert ein Tastendruck? (Max. 0.5s m oglich) ; File: Tdruck.asc ; Funktion: Misst die Zeit, w ahrend der eine Taste gedr uckt ist. ; Ausgewertet wird Taste 7 ; Hardware: Lemps12 ; Verfasser: Hans Kottmann ; Datum: 07.03.02 ;-----------------------------------------------------------------------cpu 68hc12 padding off Include "MyInc12.Inc" org $2000 ;Programm Startadresse

;Hauptprogramm ---------------------------------------------------------main bset bset movw movb brclr ldd ldx idiv stx ldx ldy jsr movb movw lbra TSCR,#$90 PACTL,#$60 #0,PACNT #$01,PAFLG PAFLG,$01,loop PACNT #125 Zeit #Message #Zeit WriteLn #$01,PAFLG #0,PACNT loop ;Timer Enable ;PA Enable, Time Accumulation Mode ;PA Counter l oschen ;PA Input Edge Flag auf 0 setzen ;Warten, bis PA Input Edge Flag gesetzt ;Zeit in Akku D laden ;Teiler in Reg. X laden ;D/X --> X ;Zeit in ms speichern ;Adresse von Message in Reg. X ;Adresse von Zeit in Reg. Y ;Wert an Terminal ausgeben ;PA Input Edge Flag auf 0 setzen ;PA Counter l oschen ;Wieder von vorn

loop

;Definition der Variablen (RAM) ----------------------------------------org Message Zeit fcb rmb $5000 "Die Taste wurde %dms gedrueckt",0 2

You might also like