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.