CAN Kommunikation

Gast #3761785
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
Angehängte Dateien:
Gast #3761800
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...
Gast #3761820
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
}
Gast #3761830
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???
Gast #3762587
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?
Gast #3762672
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.
Gast #3762786
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.

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