Forum: Mikrocontroller und Digitale Elektronik Timer2 für 1Sekundentakt


von Markus T. (1lc)


Lesenswert?

Hallo, ich hatte vor einer Zeit mal einen Beitrag über einen 
Sekundentakt mit dem PIC erstellt, damals mit der einfachen delay 
Funktion, dann wurde mir empfohlen ich soll es mal mit Timern 
ausprobieren.
Ich verstehe die Timer nur nicht so ganz.
Ich benutze den PIC18F14K22 und den Timer2.

Das Prinzip habe ich schon verstanden von Timern, bei einer steigenden 
Flanke des Taktes erhöht sich der Wert um 1. Wenn der PR2 Wert erreicht 
wurde wird das InterruptFlag (PIR1bits.TMR2IF) auf 1 gesetzt.
Somit lässt sich eine Zeitbassis erstellen.
Durch Pre und Postscaler kann man das ganze noch einstellen.

Nur das bei den PICS immer ein viertel des Taktes genutzt wird und alles 
verwirrt mich ziemlich.

Genug geschwafelt, hier mein Programm( ohne Interrupt)
1
#include <xc.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#define _XTAL_FREQ 4000000UL
5
6
#pragma config FOSC = IRC    // Oscillator Selection bits (Internal RC 
7
8
#pragma config PWRTEN = OFF     // Power-up Timer Enable bit (PWRT 
9
10
#pragma config BOREN = OFF      // Brown-out Reset Enable bits 
11
12
#pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT is 
13
14
15
 Timer2(void)
16
{
17
    // Timer2 generates 1ms tick
18
    T2CONbits.T2OUTPS = 0;              // = 1:1 Postscaler
19
    T2CONbits.T2CKPS = 0b10;            // = Prescaler is 16
20
    PR2=  61;                          // fosc/4 / 16 / 62 = 1008Hz ungefähr 1000hz
21
    
22
    PIE1bits.TMR2IE = 0;                // polling TMR2IF in main-loop
23
    PIR1bits.TMR2IF = 0;
24
 
25
    T2CONbits.TMR2ON = 0b1;
26
    
27
}
28
void main(void)
29
{
30
        Timer2();
31
    int g_tick1ms=0;
32
    int trigger=0;
33
    int toggle;
34
35
   TRISB = 0x00; //setz B als Ausgang
36
    // main loop
37
    do
38
    {
39
        //generate 1ms tick
40
        if(PIR1bits.TMR2IF ==1)
41
        {
42
            PIR1bits.TMR2IF=0;
43
            g_tick1ms++;
44
        }//do every second
45
        if (trigger == g_tick1ms)
46
        {
47
            trigger = g_tick1ms + 1000;   // rearm
48
            if (toggle)
49
                LATBbits.LATB7 = 0; // LED aus
50
            else
51
                LATBbits.LATB7 = 1; // LED an
52
            toggle = !toggle;
53
        }
54
55
    } while (1);
56
}

Die LED die im 1 Sekundentakt blinken soll, bleibt aber deutlich länger 
(3-4) Sekunden an.

von W.A. (Gast)


Lesenswert?

Markus L. schrieb:
> Nur das bei den PICS immer ein viertel des Taktes genutzt wird und alles
> verwirrt mich ziemlich.

Nimm es hin. Du wirst es nicht ändern können.

von Markus T. (1lc)


Lesenswert?

und wieso blinkt die LED nicht im 1 Sekundentakt? die Frequenz ist doch 
c.a 1000hz

von Markus T. (1lc)


Lesenswert?

ok habs hingekriegt, hab vergessen die Frequenz des Mikrokontrollers 
hochzuschrauben, das #define XTALFREQ ist natürlich überflüssig ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.