Infineon C167 ( SAB 80C167CR-LM) Timer + Interrupt Beispiel
geschrieben von Andreas Amann.


Der Microcontroller besitzt diverse Timer / Counter, es sind 2 Genereal Purpose Timer Units ( GPT1 und GPT2) vorhanden. GPT1 besitzt 3 Timer / Counter mit einer maximalen Auflösung von fcpu / 8 und GPT2 besitzt 2 Timer / Counter mit einer maximalen Auflösung von fcpu / 4.


In diesem Konkreten Beispiel wollen wir auf dem Phytec Phycore 167CR -Board eine LED im Sekunden Rhytmus blinken zu lassen.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


Nun folgt die Initialisierung der LED, wie entnommen werden kann befindet sich die LED an Port 2, Bit 0.

/*    LED initialisieren */

sbit P2_0 = P2^0;
sbit DP2_0 = DP2^0;


Der Reload Wert ist ein Muliplikator mit dem die "Timer Resolution" Multipliziert wird. mit diesem Multiplikator erreichen wir einen Timerintervall von 1ms. Die genaue Ermittlung der Werte erfolgt weiter unten.

#define RELOAD 1250;


Die Funktion timer_tic wird durch den Timer-Interrupt aufgerufen. Aus dem Datasheet (Abs. 5-3, Tabelle5-2) entnehmen wir, dass der GPT Timer 3 die TrapNumber 23h bzw. 34d besitzt. Durch RELOAD laden wir den Timer wieder auf den entsprechenden Startwert (1250). Von diesem Wert wird dann in der Entsprechenden Periode herunter gezählt (in unserem Fall wird alle 800ns ein herunter gezählt, 800ns * 1250 = 1ms). Alle 1000 aufrufe (entspricht 1 sek , 1000*1ms) wird der Status der LED gewechselt.

void timer_tic(void) interrupt 0x23
{
T3 = RELOAD;
    i++;

    if (i==1000)
    {   
       if (led == 0)
        led = 1;
       else
        led = 0;
       
    i=0;
    }
    DP2_0 = led;
}


Dies ist die Hauptroutine, hier wird DP2_0 gesetzte, dies ist der Anfangswert der LED. T3 ist bekanntlich der Startwert des Timers. Mit dem Timer-Control-Register setzen wir spezielle Eigenschaften des Timers

T3CON (Abs 10-3 / 10-4, Tabelle 10-0 / 10-1)


Bit Function
T3I Timer 3 Input Selection
Depends on the operating mode, see respective section (untere Tabelle 10-2)
T3M Timer 3 Mode Control
000: Timer Mode
001: Counter Mode
010: Gated Timer with Gate active low
011: Gated Timer with Gate active high
100: Not for use
101: Not for use
110: Incremental Interface Mode
111: Not for use
T3R Timer 3 Run Bit
0: Timer/Counter 3 stops
1: Timer/Counter 3 runs
T3UD Timer 3 Up/Down Control (untere Tabelle)
T3UDE Timer 3 External Up/Down enable (untere Tabelle)
T3OE Alternate Output Function Enable
0: Alternate Output Function Disable
1: Alternate Output Function Enable
T3OTL Timer 3 Output Toggle Latch
Toggles on each overflow/underflow of T3. Can be set reset by software

Pin TxEUD Bit TxUDE Bit TxUD Count Direction
X 0 0 Count Up
X 0 1 Count Down
0 1 0 Count Up
1 1 0 Count Down
0 1 1 Count Down
1 1 1 Count Up
Durch diese 2 Tabellen erkennt man, weshalb in dem Beispiel C1 verwendet wird



T3I ist ein spezielles Register in dem die Auflösung / Frequenz des Timers entsprechend eingestellt wird (Abs 10-6, Tabelle 10-2). Diese
Tabelle gilt nur für die 20Mhz Chips, wird eine höhere Frequenz benutzt, so muss in diesem Abschnitt auf die anderen Tabellen verwiesen werden.


Das Register T3IC ist ein Interrupt Control Register für den Timter 3. Hierbei kann die Priorität und die Gruppenzugehörigkeit definiert werden.


void main (void) 
{
    DP2_0 = led;
 
    T3 = RELOAD;
    T3CON = 0x00C1;
    T3IC = 0x5E;
   
    IEN = 1;
    while (1){ };
}