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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.