Hallo,
Wie ich in einem Anderen Thread schonmal geschrieben habe arbeite ich an
TTC über den AT90CAN128.
Mittlerweile komme ich gut voran, nur hänge ich jetzt an einem ganz
blöden Problem und hoffe ihr wisst Rat.
Also ich möchte periodisch eine Nachricht senden. Dies hatte ich mit dem
Timer0 realisiert und das klappte hervorragend. Nun habe ich jedoch
festgestellt, dass es den CAN-Timer gibt, der ja nichts anderes als der
Timer1 ist. Nun Versuche ich mit diesem CAN-Timer CANTIM ebenfalls
periodisch eine Nachricht zu senden.
Nur komme ich nie in meine Interruptroutine ISR(OVRIT_vect).
1 |
|
2 |
|
3 | #include "can_lib.h"
|
4 | #include <avr/io.h>
|
5 | #include <avr/interrupt.h>
|
6 | #include <util/delay.h>
|
7 | #include <stdint.h>
|
8 |
|
9 | /Zaehler für den Referenztimer
|
10 | int timer_zaehler = 0;
|
11 |
|
12 |
|
13 | /***********************************************************************************
|
14 | *
|
15 | * Hauptprogramm
|
16 | *
|
17 | ***********************************************************************************/
|
18 | void main()
|
19 | {
|
20 |
|
21 |
|
22 | // Initialisiere CAN-Controller mit 250 KB/s Baudrate
|
23 | can_init ( 250 );
|
24 |
|
25 | sei();
|
26 |
|
27 | //Endlosschleife
|
28 | while(1)
|
29 | {}
|
30 |
|
31 | }
|
32 |
|
33 | /********************************
|
34 | *
|
35 | * CAN-INIT
|
36 | *
|
37 | *********************************/
|
38 | uint8_t can_init (uint16_t baud)
|
39 | {
|
40 | uint8_t mob;
|
41 |
|
42 | // Software Reset des CAN-Controllers
|
43 | CAN_RESET;
|
44 |
|
45 | //Timer CANTIM zum periodischen Senden der Referenznachricht
|
46 | // CANTIM erhält seinen Prescaler vom Register CANTCON
|
47 | //Prescaler 199 einstellen ergibt 10kHz bei 16Mhz
|
48 | CANTCON = 199;
|
49 |
|
50 | // Setze Baudrate (empfohlen = 250 KB/s)
|
51 | if (set_baud (baud) == FALSE)
|
52 | return FALSE;
|
53 |
|
54 | // Alle MOb-Register leeren
|
55 | for (mob = 0; mob < MAX_MOB; mob++)
|
56 | {
|
57 | clear_mob (mob);
|
58 | }
|
59 |
|
60 | //Reset MOb Interrupt
|
61 | CANIE1 = 0x00;
|
62 | CANIE2 = 0x00;
|
63 | CANGIE = 0x00;
|
64 |
|
65 | // CAN Interrupts setzen
|
66 | CANGIE = (1<<ENIT) // Generell Interrupts enable
|
67 | | (1<<ENRX) // Receive Interrupt enable
|
68 | | (1<<ENTX) // Transmit Interrupt enable
|
69 | | (1<<ENERR) // MOb-Error Interrupt enable
|
70 | | (1<<ENERG); // General Error Interrupt enable
|
71 | //| (1<<ENOVRT); // CAN Timer Overflow Interrupt enable
|
72 |
|
73 | //TTC enable
|
74 | CANGCON = (1<<TTC);
|
75 |
|
76 | //enable CAN
|
77 | CAN_ENABLE;
|
78 |
|
79 |
|
80 |
|
81 | // Warte auf EnableFlag
|
82 | while (!(CANGSTA & (1<<ENFG)));
|
83 |
|
84 | return TRUE;
|
85 | }
|
86 |
|
87 | ISR(OVRIT_vect)
|
88 | {
|
89 |
|
90 | // Zähler erhöhen um zu bestimmen wann eine Sekunde um ist.
|
91 | timer_zaehler++;
|
92 |
|
93 | //LED aus
|
94 | if(timer_zaehler == 1)
|
95 | PORTE = PORTE | 0b00010000;
|
96 |
|
97 | if(timer_zaehler == 2)
|
98 | {
|
99 | timer_zaehler = 0;
|
100 |
|
101 | //LED an
|
102 | PORTE = PORTE & 0b11101111;
|
103 | }
|
104 |
|
105 | }
|
Vll könnt ihr mir helfen. Schonmal vielen Dank fürs lesen :)
MfG
Now