AT90CAN128 Interrupt OVRIT_vect funktioniert nicht.

Gast #3839207
Lesenswert?

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
#3839319
Lesenswert?

Was ist die Idee dahinter?
1
  // CAN Interrupts setzen
2
  CANGIE = (1<<ENIT)     // Generell Interrupts enable
3
       | (1<<ENRX)     // Receive Interrupt enable
4
       | (1<<ENTX)     // Transmit Interrupt enable
5
       | (1<<ENERR)   // MOb-Error Interrupt enable
6
       | (1<<ENERG);    // General Error Interrupt enable
7
       //| (1<<ENOVRT);  // CAN Timer Overflow Interrupt enable

du gibst alle möglichen INterrupts frei, für die du keinen Handler hast 
(was zu einem automatischen Prozessorreset durch den gcc-Default 
Interrupt Handler führt), und ausgerechnet den einen Interrupt 
(Overflow), für den du einen Handler hättest, den gibst du nicht frei?
Gast #3840414
Lesenswert?

Hallo,

Vielen Dank für den Hinweis mit dem fehlenden Handler. Nachdem ich 
einfach einen leeren Handler für die Interrupts eingebaut habe 
funktioniert es wie gewollt.
Das auskommentierte war ein Versehen, habe viel rumprobiert natürlich 
muss der eingeschaltet sein^^.

aber nochmal vielen vielen Dank :D.

MfG
Now

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