Timer2 für 1Sekundentakt

OP #4534593
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren