MCP2515 Botschaften Empfangen

Gast #2125770
Lesenswert?

Hallo,

Ich möchte gerne über einen MCP2515 den Empfang einer Nachricht an einer 
LED anzeigen lassen.

Mit Hilfe von
http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
habe ich es bereits geschaft das eine Nachricht vom Controller zum 
PC(Vector CANalyzer) geschickt wird.

Die Anbindung des MCP2515 zum ATMega8 ist dem CAN Testboard 
nachempfunden.
http://www.kreatives-chaos.com/artikel/can-testboard
Siehe auch Anhang: schaltplan.png

Beim Empfangen einer Nachricht komme ich nun aber mit meinen 
bescheidenen Kenntnissen nicht mehr weiter. Ich glaube hier liegt auch 
ein prinzipielles Verständnisproblem vor.

Im Anhang: Test4.c mein Code (ich arbeite mit CodeVision)

Danke im Voraus für die Unterstützung.
mfg
Patrick
Angehängte Dateien:
#2125795
Lesenswert?

Da gibt es mehrere möglichkeiten. ich hab das damls per Software 
realiesiert, du könntest aber auch den interruptpin Nur für den Empfang 
einer Botschaft im CAN-Controller einstellen, und den Interruptpin Als 
Anschluss für eine LED nutzen. Oder die RXD Leitung zwischen dem 
CAN-Controller und der Endstufe. Ich würde dir aber eine Softwarelösung 
ans Herz legen

gruß Rene
#2125796
Lesenswert?

Nun, du hast bereits in der Initialisierung den Interrupt-Ausgang des 
MCP2515 eingeschalten:

mcp2515_write_register(CANINTE, (1<<RX1IE)|(1<<RX0IE));

Hat dieser eine komplette Botschaft empfangen, wird am Atmega der 
Interrupt 1 ausgelöst. Darauf musst du nun reagieren:

unsigned char mcp2515_read_rx_status(void)
unsigned char can_get_message(CANMessage *p_message)

Ob der Impuls lange genug ist, dass du an einer LED was siehts, weiß ich 
jetzt nicht.
Gast #2125802
Lesenswert?

Dies war vielleicht unglücklich ausgedrückt.
Die Anzeige einer LED sollte nur der erste Schritt sein.
Als weiteren Schritt möchte ich natürlich CAN-Botschaften empfangen und 
entsprechend darauf reagieren.

Leider scheitert es aber an der Softewarelösung.


So wie ich das verstanden habe kann ich über den Interupt-Pin den 
Empfang einer Nachricht ermitteln. Und jene Nachricht anschließend über 
SPI abholen.
Wenn man es halt richtig macht xD, aber wie?

mfg
Patrick
#2125818
Lesenswert?

Um die SPI musst du dich gar nicht mehr kümmern, das mach die fertige 
Routine
unsigned char can_get_message(CANMessage *p_message)
vom Creativen Chaos schon für dich.

Du musst diese nur noch aufrufen, wenn INT1 ausgelöst wurde und schon 
liegen die Daten vor. Was du dann damit machst ist natürlich noch offen.

Als erstes brauchst du aber erst mal eine Interrupt-Routine zu INT1.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts
#2125829
Lesenswert?

Also, erstmal legst du dir eine Variable an, die nur für den Empfang 
benutzt wird:

CANMessage Receive_msg;

Kommt dann der Interrupt des MCP, liest du die Botschaft aus:

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{can_get_message(&Receive_msg);
CAN_message_received=1;
}

Damit wird schon mal die gesamte Botschaft aus dem CAN-Controller 
gelesen und der Interupt zurückgesetzt.
In der main prüfst du nun, ob die Bitvariable CAN_message_received 
gesetzt ist.
Wenn nicht, ist auf CAN-Seite nichts zu tun.
Wenn doch:

if  (CAN_message_received)
       {CAN_message_received=0;
       #asm ("cli")
       ...tue was mit der Botschaft...
       #asm ("sei")
       }
Gast #2128824
Lesenswert?

Hallo,

habe heute wieder etwas Zeit gefunden mich mit dem Thema auseinander zu 
setzen.

Nach einiger Zeit konnte ich alle offenen Punkte umsetzten und einige 
kleine Fehler ausbessern.
Im Anhang noch mal der Code, falls mal wer vor den gleichen Problemen 
stehen sollte.

Recht herzlichen Danke für die freundliche Unterstützung.
Angehängte Dateien:
#2128877
Lesenswert?

Das blöde an solchen Testsachen: werden dann gerne vergessen, weil es ja 
funktioniert hat.
Sollte man sich gar nicht erst angewöhnen. Und da du auch noch die UART 
im polling verwendest, dauert die ISR tatsächlich so lange, wie das 
Senden des strings dauert. Interruptbetrieb und ausreichender 
Sendebuffer entschärfen das teilweise.
#2132172
Lesenswert?

Einen schönen Abend die Herren,

ich habe meinen Aufbau und das Programm erweitert.
2x MCP2515 welche Botschaften empfangen und auf den jeweils anderen 
ausgeben sollten.


Prinzipiell kann jeder MCP2515 Botschaften schicken, aber aus einen mir 
unerfindlichen Grund, wird der Interuptpin der MCP2515 nach dem Empfang 
einer Botschaft, nicht residiert.

Da mir auf den ersten, zweiten und dritten Blick nichts mehr auf und 
eingefallen ist wollte ich mal hier nachfragen ob wer einen Tipp hätte?

Danke im Voraus.

mfg
Patrick
Angehängte Dateien:

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