Timer/Counter - Hochschule Mannheim

Timer/Counter - Hochschule Mannheim Timer/Counter - Hochschule Mannheim

informatik.hs.mannheim.de
von informatik.hs.mannheim.de Mehr von diesem Publisher

Microcomputing (MCP)<br />

06 <strong>Timer</strong>/<strong>Counter</strong><br />

PROF. DR. M. FÖLLER‐NORD<br />

INSTITUT EMBEDDED AND MOBILE COMPUTING


<strong>Timer</strong>/<strong>Counter</strong><br />

• Zeitgeberbasierte Einheiten<br />

◦ Wichtig für Echtzeitanwendungen Basis für viele<br />

Mikrocontroller‐Komponenten<br />

• Grundaufgaben von Zählern und Zeitgebern<br />

(<strong>Counter</strong> and <strong>Timer</strong>)<br />

◦ Zählen von Ereignissen<br />

◦ Messen von Zeiten<br />

◦ Wecken<br />

◦ Erzeugung von Impulsfolgen<br />

l<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong><br />

2


Prinzipieller Aufbau <strong>Timer</strong>/<strong>Counter</strong><br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 3


Zählen von Ereignissen<br />

• Bei jeder steigenden Flanke des externen Taktes<br />

wird der Zählerstand um 1 erhöht.<br />

• Bsp: Zählen von Gegenständen, die in einer<br />

Produktionsanlage eine Lichtschranke passieren<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 4


Messen von Zeiten<br />

• Zählen der steigenden Flanken des internen (oder externen) Taktes.<br />

• Multiplikation mit Taktzykluszeit<br />

• Maximaler Fehler: 2 Taktzyklen<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 5


Erzeugen einmaliger Pulse ‐ Wecken<br />

Underflow<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 6


Erzeugen mehrmaliger Impulse<br />

Underflow<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 8


Capture‐ and Compare‐Einheiten<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 9


<strong>Timer</strong>/<strong>Counter</strong><br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 11


General Purpose <strong>Timer</strong> 1 (GPT1)<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 12


Der Core‐<strong>Timer</strong><br />

T3<br />

<strong>Timer</strong>‐Funktion<br />

f CPU<br />

T3IN<br />

T3EUD<br />

2 n :1<br />

T3<br />

Mode<br />

Control<br />

U/D<br />

GPT1 <strong>Timer</strong> T3<br />

Toggle<br />

T3OTL<br />

Interrupt<br />

Request<br />

T3OUT<br />

<strong>Counter</strong>‐Funktion<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 13


Eigenschaften des Core‐<strong>Timer</strong>s<br />

T3<br />

• Steuerung über das Register T3CON<br />

• Eingangssignale<br />

◦ <strong>Timer</strong> 3 Input (T3IN)<br />

◦ <strong>Timer</strong> 3 External Up/Down Control (T3EUD)<br />

• 16 Bit‐Zähler<br />

• Als Aufwärts‐ oder Abwärtszähler programmierbar<br />

• Umschaltung der Zählrichtung<br />

◦ per Software<br />

◦ über Signal an T3EUD<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 14


Betriebsarten des <strong>Timer</strong> T3<br />

• <strong>Timer</strong><br />

◦ Tk Takt des <strong>Timer</strong>s wird idvom Systemtakt abgeleitet<br />

• Gated <strong>Timer</strong><br />

◦ negatives Gate<br />

• Starten des <strong>Timer</strong>s über ein negativen Gate‐Signal<br />

• Stoppen des <strong>Timer</strong>s mit einem positiven Gate‐Signal<br />

◦ positives Gate<br />

• Starten des <strong>Timer</strong>s über ein positives Gate‐Signal<br />

• Stoppen des <strong>Timer</strong>s mit einem negativen Gate‐Signal<br />

• <strong>Counter</strong><br />

◦ Taktsignal wird über T3IN angelegt.<br />

◦ Auslösen eines Taktimpulses bei positiver, negativer Flanke<br />

• Incremental Interface<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 15


Aufgabenstellung 1<br />

• Verwendung des Microcontrollers als Alarmgeber:<br />

• Der Microcontroller soll nach einer festgelegten<br />

Zeitspanne ein einziges Mal einen Alarm auslösen<br />

◦ Beispiel: ein Alarm soll 3 Sekunden nach einem Reset<br />

ausglöst werden<br />

◦ Das Alarmsignal wird dadurch erzeugt, das man alle Pins<br />

des Port 2 auf High‐Pegel setzt.<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 16


T3 in <strong>Timer</strong> Mode<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 17


Das Konfigurationsregister des <strong>Timer</strong>s T3<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 18


<strong>Timer</strong> Frequenzen und Auflösungen<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 19


Zählrichtung von T3<br />

Kein externes<br />

Umschalten der<br />

Zählrichtung<br />

Umschalten der<br />

Zählrichtung<br />

durch externes<br />

Signal möglich<br />

Bit<br />

T3UDE<br />

Pin<br />

T3EUD<br />

Bit T3UD<br />

XOR<br />

(T3EUD, T3UD)<br />

0 ‐ 0 ‐ Up<br />

0 ‐ 1 ‐ Down<br />

1 0 (o (Low) 0 0 Up<br />

1 1(High) 0 1 Down<br />

1 0 (Low) 1 1 Down<br />

1 1(High) 1 0 Up<br />

Zählrichtung<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 20


<strong>Timer</strong> T3 als <strong>Timer</strong> – Einmalauslösung<br />

/* <strong>Timer</strong> T3 Einmalauslösung nach ca. 3 s */<br />

#include <br />

void main()<br />

{<br />

DP2 = 0xFFFF; // Port P2 als Ausgabe<br />

P2=0;<br />

// Ausgabe löschen<br />

IEN=1;<br />

// alle Interrupts enabled<br />

T3=58593;<br />

// Startwert des <strong>Timer</strong>s<br />

T3CON= 0x287; // 00000 1 0 1 0 000 111<br />

T3IC= 0x44; // 01 0001 00<br />

T3R=1;<br />

// Starte <strong>Timer</strong><br />

while(1);<br />

// Programm läuft in Endlosschleife<br />

}<br />

void zahl (void) interrupt 0x23<br />

{<br />

P2=0xFFFF;<br />

//Ausgabe auf highh<br />

IEN=0;<br />

//Interrupts sperren<br />

T3R=0;<br />

//<strong>Timer</strong> sperren<br />

}<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 21


Aufgabenstellung 2<br />

• An den Mikrocontroller ist ein Taster angeschlossen<br />

• Es soll ausgemessen werden, wie lange dieser Taster<br />

gedrückt wird.<br />

• Man kann davon ausgehen dass der Taster maximal 3<br />

Sekunden gedrückt wird<br />

+5V<br />

10k<br />

C167CR-LM<br />

Ta<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 22


T3 in Gated <strong>Timer</strong> Mode<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 23


<strong>Timer</strong> T3 als Gated <strong>Timer</strong><br />

/* Bestimme Länge eines Tastendrucks */<br />

#include <br />

void main()<br />

{<br />

T3=0;<br />

// Startwert des <strong>Timer</strong>s<br />

T3CON= 0x57; // 00000 0 0 0 1 010 111<br />

while(1)<br />

{<br />

while (T3IN==1){} // warten, solange HIGH-Pegel<br />

while (T3IN==0){} // warten, solange LOW-Pegel<br />

calc_time();<br />

// Zeit berechnen<br />

print_time(); // Zeit ausgeben<br />

}<br />

}<br />

void calc_time()<br />

{<br />

unsigned long TIME;<br />

TIME=T3*51.2E-6;<br />

T3=0;<br />

}<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 24


Aufgabenstellung 3<br />

• An den Mikrocontroller ist ein Taster angeschlossen<br />

• Es soll mitgezählt werden, wie oft der Taster<br />

gedrückt wird.<br />

+5V<br />

10k<br />

C167CR-LM<br />

Ta<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 25


T3 in <strong>Counter</strong>‐Mode<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 26


T3 als <strong>Counter</strong>: Selektion der Flanke<br />

• T3IN an P3.6<br />

• => P3.6 muss als Input konfiguriert sein<br />

• Maximale Zählfrequenz ist f CPU /16.<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 27


<strong>Timer</strong> T3 als <strong>Counter</strong><br />

/* <strong>Timer</strong> T3 als <strong>Counter</strong>: Zählt fallende Flanken an P3.6<br />

und gibt T3 an P2 aus */<br />

#include <br />

sbit DP3_6=DP3^6;<br />

void main()<br />

{<br />

DP2 = 0xFFFF; // Port P2 als Ausgabe<br />

DP3_6=0;<br />

// Pin P3^6 als Input<br />

P2=0;<br />

// Ausgabe löschen<br />

T3=0;<br />

// Startwert des <strong>Counter</strong>s<br />

T3CON= 0x24a; // 00000 0 1 0 0 1 001 010<br />

while(1)<br />

// Programm läuft in Endlosschleife<br />

{<br />

P2=T3;<br />

}<br />

}<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 28


Aufgabenstellung 4<br />

• An den Mikrocontroller ist ein Taster angeschlossen<br />

• Es soll ausgemessen werden, wie lange dieser Taster<br />

gedrückt wird.<br />

• Man muss davon ausgehen dass der Taster länger als<br />

3 Sekunden gedrückt werden kann<br />

+5V<br />

10k<br />

C167CR-LM<br />

Ta<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 29


Aufbau von GPT1<br />

Auxiliary-<br />

<strong>Timer</strong><br />

Core-<br />

<strong>Timer</strong><br />

Auxiliary-<br />

<strong>Timer</strong><br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 30


Auxiliary‐<strong>Timer</strong> T2 und T4<br />

• T2 und T4 sind „Hilfszähler“ für T3<br />

• Sie besitzen kein Ausgangssignal TxOUT<br />

• Steuerung über T2CON bzw. T4CON<br />

• Eingangssignale T2IN, T4IN<br />

• External Up/Down Control T2EUD, T4EUD<br />

• Betriebsarten:<br />

◦ <strong>Timer</strong><br />

◦ <strong>Counter</strong><br />

◦ Gated <strong>Timer</strong><br />

◦ Reload Mode<br />

◦ Capture Mode<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 31


Auxiliary‐<strong>Timer</strong> T2 und T4<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 32


Auxiliary‐<strong>Timer</strong> T2 und T4<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 33


T2/T4 in <strong>Counter</strong> Mode<br />

T3OTL<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 34


T2/T4 in <strong>Counter</strong> Mode<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 35


<strong>Timer</strong>‐Kaskadierung<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 36


<strong>Timer</strong>‐Kaskadierung<br />

/* Bestimme Länge eines Tastendrucks */<br />

#include <br />

void main()<br />

{<br />

T3=0;<br />

// Startwert des <strong>Timer</strong>s<br />

T3CON= 0x57; // 000000 0 0 0 1 010 111<br />

T2=0;<br />

T2CON=0x000f; // 000000 0 0 0 0 001 111<br />

T2R=1;<br />

while(1)<br />

{<br />

while (T3IN==1){} // warten, solange HIGH-Pegel<br />

while (T3IN==0){} // warten, solange LOW-Pegel<br />

calc_time();<br />

// Zeit berechnen<br />

print_time(); // Zeit ausgeben<br />

}<br />

}<br />

void calc_time()<br />

{<br />

unsigned long TIME;<br />

TIME=(T3+T2*65536)*51.2e-6;<br />

T3=0;<br />

T2=0;<br />

}<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 37


Aufgabenstellung 5<br />

• Mit dem Mikrocontroller soll ein Rechtecksignal mit<br />

der Frequenz von 50 Hz erzeugt werden<br />

U<br />

T/2<br />

T<br />

t<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 38


Auxiliary‐<strong>Timer</strong> in Reload Mode<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 40


Reload Mode<br />

• T3 kann aufgrund eines Reload‐Taktimpulses<br />

nachgeladen werden und zwar<br />

◦ mit einem Reload‐Register‐Wert des <strong>Timer</strong>s T2 oder<br />

◦ mit einem Reload‐Register‐Wert des <strong>Timer</strong>s T4<br />

• Reload‐Taktimpuls wird ausgelöst von:<br />

◦ positiver und/oder negativer Flanke von Pin TxIN<br />

◦ positiver/negativer Flanke von T3OTL<br />

• <strong>Timer</strong> T2 und T4 sind hierbei von einer Taktquelle<br />

abgeschaltet –zählen selber also nicht – sondern<br />

dienen nur als Register zum Nachladen eines<br />

Wertes.<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 41


<strong>Timer</strong> T3 im Reload‐Modus<br />

/* <strong>Timer</strong> T3 nachgeladen von T2 */<br />

/* Realisiert einen Frequenzgenarator mit f=50 Hz */<br />

#include <br />

sbit DP3_3=DP3^3;<br />

sbit P3_3=P3^3;<br />

void main()<br />

{<br />

DP3_3=1;<br />

// Pin P3^36 als Output<br />

P3_3=1;<br />

// P3^3 auf high<br />

T2CON=0x27; // 00000 0 0 0 0 0 100 111<br />

T2=25000;<br />

// Nachladewert<br />

T3=0;<br />

// Startwert des <strong>Counter</strong>s<br />

T3CON= 0x2c0; // 00000 0 1 0 1 1 000 000<br />

while(1);<br />

// Programm läuft in Endlosschleife<br />

}<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 42


Aufgabenstellung 6: Übungsaufgabe<br />

• Mit dem Mikrocontroller soll ein PWM‐Signal mit<br />

unten dargestellten Tastverhältnis erzeugt werden.<br />

U<br />

200 s<br />

800 s<br />

T<br />

t<br />

Prof. Dr. M. Föller-Nord, Institut EMC, <strong>Hochschule</strong> <strong>Mannheim</strong> 43

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!