Hallo, ich bin gerade dabei den Timer1 des PIC16F1823 auszuprogrammieren. Ich möchte das er auch im Sleepmode arbeitet und verwende daher einen externen Crystal zum takten. Doch leider funktioniert er nicht. Zum testen will ich einfach mal eine LED im 1s-Takt blinken lassen.
1 | void interrupt() |
2 | {
|
3 | if(INTCON.TMR1IF == 1) //interrupt from Timer1? |
4 | {
|
5 | TMR1H = 0x60; //high byte |
6 | TMR1L = 0x02; //low byte |
7 | INTCON.TMR1IF = 0; //re-enabling the interrupt |
8 | |
9 | PORTC.B2 != PORTC.B2; |
10 | }
|
11 | }
|
12 | |
13 | void wait_ms(int time) |
14 | {
|
15 | for(i = 0; i<time; i++) |
16 | Delay_ms(1); |
17 | }
|
18 | |
19 | void init_Timer1() |
20 | {
|
21 | //Timer1 always on
|
22 | T1CON.TMR1ON = 1; |
23 | T1GCON.TMR1GE = 0; |
24 | |
25 | //Osc.Circuit On T1OSI/T1OSO Pins
|
26 | T1CON.TMR1CS1 = 1; |
27 | T1CON.TMR1CS0 = 0; |
28 | T1CON.T1OSCEN = 1; |
29 | wait_ms(50); //start-up and stabilization time |
30 | |
31 | //select Prescaler 1:8
|
32 | T1CON.T1CKPS1=1; |
33 | T1CON.T1CKPS0=1; |
34 | |
35 | //Asynchronous Counter
|
36 | T1CON.NOT_T1SYNC = 1; |
37 | |
38 | //TNR1H, TMR1L and TMR1IF should be cleared before enabling the interrupt
|
39 | TMR1H = 0x00; |
40 | TMR1L = 0x00; |
41 | PIR1.TMR1IF = 0; |
42 | |
43 | //enable overflow interrupt (0xFFFF -> 0x0000)
|
44 | PIE1.TMR1IE = 1; |
45 | INTCON.PEIE = 1; |
46 | INTCON.GIE = 1; |
47 | |
48 | //oszillator circuit : f=32,768 kHz
|
49 | //instruction periode = 1/f = 30,52 us = T
|
50 | //prescaller value = 1:8
|
51 | //timer0 rate = 8 * T = 8 * 30,52 us = 244,16 us (1 pulse)
|
52 | //16-bit-timer
|
53 | //interrupt intervall = 10 s
|
54 | //pulses to interrupt = 10 s / 244,16 us = 40956,7 = 40957
|
55 | //decimal: counter start = 65535-40957 = 24578 -> 0x6002
|
56 | //Interrupt after 10s
|
57 | |
58 | /*TMR1H = 0x60; //high byte
|
59 | TMR1L = 0x02; //low byte*/
|
60 | |
61 | // 1s
|
62 | TMR1H = 0xEF; //high byte |
63 | TMR1L = 0xFF; //low byte |
64 | }
|
65 | |
66 | void main() |
67 | {
|
68 | init_Timer1(); |
69 | TRISC = 0x00; //Define PORTC as output |
70 | PORTC = 0x00; |
71 | PORTC.B2 = 1; |
72 | |
73 | while(1) |
74 | {
|
75 | }
|
76 | }
|