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
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...
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 | }
|
kleine korrektur: am ende jedes einzelnen case muß natürlich noch ein "break;" rein
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???
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.
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.
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?
Thomas schrieb: > Wie könnte ich außer mit einem Oszilloskop überprüfen, ob überhaupt > gesendet bzw. empfangen wird? Logic Analyzer
Ü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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.