Forum: Compiler & IDEs ISR wird nicht ausgeführt


von Lukas S. (irre)


Lesenswert?

Hallo,

ich richte im Moment ein CAN-Bus-System (MCP2515) in Kombination mit 
einem ATMega128 ein.
Senden funktioniert einwandfrei und der Empfang via pollen funktioniert 
auch.
Ich würde gerne Rx-Interrupts benutzen und hab den INT-Pin des MCP2515 
auf PE7.

der INT-Pin wird laut Datenblatt auf Low gezogen, wenn eine Nachricht 
erfolgreich angekommen ist.
Hab das nachgemessen, und sobald ich mit einer anderen MCU eine 
Nachricht verschicke geht der INT-Pin wie vorgeschrieben auf Low und die 
ISR müsste dann eigentlich ausgeführt werden oder nicht?
Habs mal zur Kontrolle in der ISR mit einer LED ausprobiert, aber auch 
die möchte nicht reagieren.

Vielleicht kann mir jemand erklären, warum die ISR nicht ausgeführt 
wird.

(Ja, in der ISR ist zu viel Code, dient nur zu Testzwecken, später wird 
kein UART mehr gebraucht)

[PE7 wird in mcp2515 als Eingang geschaltet]
1
#include <avr/io.h>
2
#define F_CPU 14318180UL
3
#define BAUD 19200UL
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
#include <stdlib.h>
7
#include "uart.h"
8
#include "spi.h"
9
#include "mcp2515.h"
10
tCAN message;
11
12
ISR (INT7_vect)
13
{
14
  /*DDRA|=_BV(PA1);*/
15
  if (mcp2515_check_message()) {
16
    uart1_puts("Lese Nachricht aus dem RxPuffer!\n\r");
17
    
18
    // read the message from the buffers
19
    if (mcp2515_get_message(&message)) {
20
      print_can_message(&message);
21
      uart1_puts("\n");
22
    }
23
    else {
24
      uart1_puts("Fehler: konnte die Nachricht nicht auslesen\n\r");
25
    }
26
  }
27
}
28
29
int main(void)
30
{
31
  DDRB = 0xF7;      // Port DIR für SPI
32
  PORTB |= (1<<PB5);
33
  DDRE |= (1<<PE7);
34
  /*EICRB|=(1<<ISC70);*/
35
  
36
  uart1_init(UART_BAUD_SELECT(BAUD,F_CPU));
37
  SPI_MasterInit();
38
  mcp2515_init();
39
  sei();
40
  uart1_puts("controler yellow online\n");
41
  DDRA|=_BV(PA0);
42
  
43
  // Message erzeugen
44
  tCAN nachricht;
45
  nachricht.id=0x01;
46
  nachricht.header.length=0x03;
47
  nachricht.header.rtr=0b0;
48
  nachricht.data[0]=0x34;
49
  nachricht.data[1]=0x74;
50
  nachricht.data[2]=0xa4;
51
  
52
  uart1_puts("normaler Modus\n\n");
53
  mcp2515_bit_modify(CANCTRL, (1<<REQOP2)|(1<<REQOP1)|(1<<REQOP0), 0);
54
  
55
  if (mcp2515_send_message(&nachricht))
56
    uart1_puts("Nachricht wurde in den Buffer geschrieben\n");
57
  else
58
    uart1_puts("Nachricht konnte nicht uebermittelt werden\n");
59
  sei();
60
    while(1)
61
    {
62
        
63
    }
64
}

Danke schonmal

von Karl H. (kbuchegg)


Lesenswert?

>   DDRE |= (1<<PE7);

Auf Ausgang?

>  /*EICRB|=(1<<ISC70);*/

muss natürlich entsprechend auf Flankentriggerung eingestellt werde

Ausserdem musst du den Interrupt in EIMSK noch freigeben. STeht doch im 
Datenblatt gleich bei der Beschreibung vom EICRB Register dabei! Das 
Datenblatt ist deine Bibel! Ohne die gehst du noch nicht mal aufs Klo 
während du deinen Mega programmierst.

1
• Bits 7..0 – ISC71, ISC70 - ISC41, ISC40: External Interrupt 7 - 4 Sense Control Bits
2
3
The External Interrupts 7 - 4 are activated by the external pins INT7:4
4
if the SREG I-flag and the corresponding interrupt mask in the EIMSK is
5
set. The level and edges on the external pins that activate the interrupts
6
are defined in Table 50. .....

von Lukas S. (irre)


Lesenswert?

Karl Heinz Buchegger schrieb:
>>   DDRE |= (1<<PE7);
>
> Auf Ausgang?

der wird in mcp2515_init() auf Eingang geschaltet.
Hab die abgespeckte Version mit der LED (die auf Masse geschaltet ist, 
also genau dann leuchtet, wenn der Ausgang auf Low ist) auskommentiert 
in der ISR. Aber auch das funktioniert nicht.

Der Level an PE7 geht wie vorgeschrieben von High auf Low.
Und da die ISR bei fallender Flanke ausgeführt werden soll, müsste 
theoretisch die ISR ausgeführt werden.


EDIT:

Karl Heinz Buchegger schrieb:
> Ausserdem musst du den Interrupt in EIMSK noch freigeben.

Das wars. Herzlichen Dank. Jip das Datenblatt. Da lernt man niemals aus 
:)

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.