Forum: Mikrocontroller und Digitale Elektronik AT90CAN128 Interrupt OVRIT_vect funktioniert nicht.


von Now (Gast)


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

von Karl H. (kbuchegg)


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?

von Now (Gast)


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

von Oliver (Gast)


Lesenswert?

Now schrieb:
> Nachdem ich
> einfach einen leeren Handler für die Interrupts eingebaut habe
> funktioniert es wie gewollt.

Je nun, einfach nur die Interrupts freigeben, die du tatsächlich nutzt, 
wäre zu kompliziert gewesen?

Oliver

von Now (Gast)


Lesenswert?

Ja wäre es, da die Funktion can_init() in einer can_lib steht die ich 
auch in den anderen Knoten des Netzes nutze und diese auch den OVRIT 
sowie die CANIT Interrupts nutzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.