Forum: Mikrocontroller und Digitale Elektronik CAN Kommunikation


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

bin gerade dabei mich ein wenig in das Thema CAN einzuarbeiten.

Habe dafür einen kleinen Versuchsaufbau für die Kommunikation zwischen 2 
CAN Knoten aufgebaut, bestehend aus jeweils 2 ATmega 328p, MCP 2515 und 
MCP 2551.
Verwendet wird das AVR Studio mit der CANlib von Kreatives Chaos und der 
UART Lib von P. Fleury.
Habe mich beim Versuchsaufbau an dem CAN Testboard von Kreatives Chaos 
corientiert. Es wurde lediglich der ATmega 8 durch einen 328p ersetzt. 
Da die Pinbelegung allerdings identisch ist und ich mittlerweile zum X. 
Mal die Verbindungen kontrolliert habe, sollten Fehler beim Aufbau 
auszuschließen sein.

Im ersten Schritt wollte ich eine einfache CAN Nachricht verschicken und 
diese vom Empfänger über die UART Schnittstelle(Funktioniert!)ausgeben 
lassen.

Leider funktioniert der Aufbau noch nicht wie gewünscht.

Habe im Anhang mal meinen Quellcode eingefügt.
Wäre sehr dankbar wenn jemand mal drüberschauen könnte, um evtuelle 
Fehler von der Seite ausschließen zu können.

Danke

von ?!? (Gast)


Lesenswert?

den quellcode habe ich nicht gelesen, aber eine frage an dich: hast du 
die can-bibliothek auf deinen µc angepasst und dann neu übersetzt?
die quelltexte bitte in zukunft nicht als txt, sondern als *.c 
anhängen...

von Thomas (Gast)


Lesenswert?

Ja, die Bibliothek wurde angepasst.
Makefile und Config.h wurden geändert.

von ?!? (Gast)


Lesenswert?

beim überfliegen ist mir aufgefallen

mach das senden mal so:
1
if(can_check_free_buffer())
2
{
3
    can_send_message(&msg);
4
}

und beim empfangen wäre es besser so:
1
// Überprüfen ob eine neue Nachricht empfangen wurde
2
if (can_check_message())
3
{
4
// versuchen die Nachricht auszulesen
5
    if (can_get_message(&msg))
6
    {
7
        // falls das auslesen geklappt hat,
8
        // kommt die Auswertung
9
        switch (msg.id)
10
        {
11
            // erste ID
12
            case 0x250:
13
            {
14
                variable_a = (msg.data[0] << 8) + msg.data[1];
15
                variable_b = (msg.data[2] << 8) + msg.data[3];
16
            }
17
            // zweite ID
18
            case 0x260:
19
            {
20
                variable_x = (msg.data[0] << 8) + msg.data[1];
21
                variable_y = (msg.data[2] << 8) + msg.data[3];
22
            }
23
24
        }
25
    }
26
}

von ?!? (Gast)


Lesenswert?

kleine korrektur:
am ende jedes einzelnen case muß natürlich noch ein "break;" rein

von Thomas (Gast)


Lesenswert?

Vielleicht liegt ja auch bei der Erstellung der CANlib der Hund 
begraben.
Um von Anfang an die möglichen Fehlerquellen zu eliminieren hier mal die 
Änderungen die ich vorgenommen habe.

Im makefile habe ich MCU auf atmega328p und F_CPU auf 16000000 geändert.


In der config.h habe ich folgendes eingestellt:

#define  SUPPORT_EXTENDED_CANID          1
#define  SUPPORT_TIMESTAMPS    0
#define  SUPPORT_MCP2515      1

#define  MCP2515_CS      B,2
#define  MCP2515_INT      D,2

Nur um Missverständnisse auszuräumen, da ich bei "Setting for MCP2515" 
nicht ganz sicher war.
Hier gebe ich doch die Ports an, mit denen CS und INT vom MCP 2515 mit 
meinem Mikrocontroller verbunden sind???

von ?!? (Gast)


Lesenswert?

kleine korrektur:
am ende jedes einzelnen case muß natürlich noch ein "break;" rein

Thomas schrieb:
> Hier gebe ich doch die Ports an, mit denen CS und INT vom MCP 2515 mit
> meinem Mikrocontroller verbunden sind???

richtig, so ist es.

von ?!? (Gast)


Lesenswert?

kleine korrektur:
am ende jedes einzelnen case muß natürlich noch ein "break;" rein

Thomas schrieb:
> Hier gebe ich doch die Ports an, mit denen CS und INT vom MCP 2515 mit
> meinem Mikrocontroller verbunden sind???

richtig, so ist es.

von ?!? (Gast)


Lesenswert?

sri wegen doppeltem post, die forensoftware hat irgendwie gezickt.

von Thomas (Gast)


Lesenswert?

Habe die Bibliothek sicherheitshalber erneut erstellt, den Quellcode und 
die Verbindungen auf dem Steckbrett erneut überprüft.
Leider mit demselben Ergebnis, dass nichts ausgegeben wird.

Wie könnte ich außer mit einem Oszilloskop überprüfen, ob überhaupt 
gesendet bzw. empfangen wird?

Hat evtl. jemand einen einfachen Quellcode, mit dem ich meinen Aufbau 
testen kann?

von 132 (Gast)


Lesenswert?

Thomas schrieb:
> Wie könnte ich außer mit einem Oszilloskop überprüfen, ob überhaupt
> gesendet bzw. empfangen wird?

Logic Analyzer

von ?!? (Gast)


Lesenswert?

Überprüfe doch sicherheitshalber nochmal ob der µC wirklich mit 16MHz 
läuft. Fuses kontrollieren, ob die richtige taktquelle eingestellt ist 
und auch das clkdiv8 nicht gesetzt ist.
zur not mach ein kleines programm wo du mit einem timer einen pin 
toggelst im sekundenrhythmus. wenn der takt nicht stimmt, wird der pin 
im falschen rhythmus toggeln.
sonst habe ich keinen fehler weiter entdecken können. die ausschnitte 
von gestern sind aus einem lauffähigen programm von mir.

von Hörnchen (Gast)


Lesenswert?

Meiner Meinung nach muss das if-Konstrukt beim Empfangen noch in eine 
while-Schleife, sonst wird nur einmal nach neuen Nachrichten geguckt und 
das wars dann.

von ?!? (Gast)


Lesenswert?

Hörnchen schrieb:
> Meiner Meinung nach muss das if-Konstrukt beim Empfangen noch in
> eine
> while-Schleife, sonst wird nur einmal nach neuen Nachrichten geguckt und
> das wars dann.

Falls du das beispiel von mir meinst, hast du recht. das ist in der 
hauptschleife drin und wird bei jedem durchlauf einmal abgefragt.

von Häh? (Gast)


Lesenswert?

Thomas schrieb:
> Leider funktioniert der Aufbau noch nicht wie gewünscht.

Und was genau bitte funktioniert nicht wie gewünscht und äußert sich 
exakt wie?

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.