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