Hallo liebe Community, ich würde gerne mit einem ATmega328P eine CAN Kommunikation ermöglichen. Damit das klappt habe ich auf meinem Breadbord meinen µC um einen MCP2515 erweitert und die CAN-Lib vom Kreativen-Chaos eingebunden und vorher konfiguriert. Die Breadboardmontage habe ich als KiCad Zeichnung angehangen sowie die Main.c, Config.h und Can.h. Im Makefile habe ich die CPU Frequenz auf 8MHz gesetzt und in der Config MCP2515_CS auf B,1 und MCP2515_INT auf B,0 gesetzt. Leider kann ich bis auf einen 5V Pegel auf meinem INT Ausgang an Pin B0 des ATmegas nichts weiteres mit meinem Oszilloskop messen. Auch ein CLK Signal wird nicht ausgegeben. Ich Hoffe ihr könnt mir ein paar Tipps geben wie ich an meine CAN Kommunikation komme. Viele Grüße und danke im Voraus!
An RX und TX müsste eigentlich noch ein Transceiver hängen, wenn du einen echten CAN-Bus willst. Wahrscheinlich brauchst du einen Pull up oder Pull down an den Pins wenn du keinen Transceiver hast.
Die Beschaltung am Ausgang des MCP2515 habe ich erstmal vernachlässigt, da bevor dort etwas raus kommt ja erstmal etwas reinkommen müsste oder? Soweit ich weiß ist der Transceiver auch nur ein Pegelwandler der meine CAN Nachricht auf den richtigen Pegel bring oder?
Philipp V. schrieb: > Die Beschaltung am Ausgang des MCP2515 habe ich erstmal vernachlässigt, > da bevor dort etwas raus kommt ja erstmal etwas reinkommen müsste oder? > Soweit ich weiß ist der Transceiver auch nur ein Pegelwandler der meine > CAN Nachricht auf den richtigen Pegel bring oder? Nö. Er liefert auch einen definierten Pegel an den CAN-Controller. Andererseits kannst du den CAN-Controller in den Loop-Back-Modus setzen, wodurch keine weiteren CAN-Komponenten notwendig sind.
Wenn ich das richtig verstehe, hakt es ja schon bei der SPI-Kommunikation zwischen ATmega und MCP2515. Da müsste man schauen, was can_init so macht.
Also ich habe jetzt einen Transceiver (MCP2551) angeschlossen und habe noch das gleiche Ergebnis. Hat jemand schon einmal mit der Universellen CAN Bibliothek gearbeitet? Mich lässt das Gefühl nicht los, das meine Konfiguration des µCs nicht ganz korrekt ist...
1 | can_init(can_bitrate_t bitrate); |
Das ist in der can.h zu can_init zu finden, bzw. das habe ich bis jetzt gefunden. Scheinbar überträgt diese Funktion nur die angegebene Bitrate in can.h
:
Bearbeitet durch User
In der CAN.h steht bei can_init:
1 | * \return false falls das CAN Interface nicht initialisiert werden konnte, |
2 | * true ansonsten. |
Was gibt es denn zurück?
Philipp V. schrieb: > Die Breadboardmontage habe ich als KiCad Zeichnung angehangen Der MCP2515 hat in deiner Zeichnung gar keine Taktquelle. Die braucht er aber um überhaupt zu arbeiten.
Bevor man solche Schaltungen angeht, muss man sich in das Thema einarbeiten und das jeweilige Datenblatt der diversen Komponenten durchlesen. Mach das mal.
Jubel schrieb: > Bevor man solche Schaltungen angeht, muss man sich in das Thema > einarbeiten ... und ich gebe jetzt schon mal vorsorglich die Warnung aus: Wer Mikrokontroller-Schaltungen ohne Abblock-Kondensatoren aufbaut, nachmacht oder verfälscht, insbesondere bei existierenden Schaltungen die Abblock-Kondensatoren weglässt oder falsch verschaltet oder selbst solche Schaltungen entwirft, in Verkehr bringt und/oder aufbaut ohne Abblock-Kondensatoren nach Hersteller- Empfehlungen zu verwenden, wird mit Zugangs-Ausschluss vom Mikrokontroller-Forum nicht unter zwei Jahren bestraft.
Jubel schrieb: > Bevor man solche Schaltungen angeht, muss man sich in das Thema > einarbeiten und das jeweilige Datenblatt der diversen Komponenten > durchlesen. Offensichtlich sind da noch ein paar Wissenslücken zu füllen. Dann setz ich mich mal vor die gegebenen Datenblätter und werde diese studieren. Danke erstmal für eure Hilfe
Philipp V. schrieb: > Im Makefile habe ich die CPU Frequenz auf 8MHz gesetzt Dann solltest Du auch dafür sorgen, daß der MC 8MHz bekommt. Für CAN ist ein Quarz oder Quarzoszillator notwendig. Den MCP2515 kann man an CLKO anschließen.
Peter D. schrieb: > Dann solltest Du auch dafür sorgen, daß der MC 8MHz bekommt. Laut Datenblatt läuft der ATmega328 doch nach entfernen der entsprechenden fuse mit 8MHz oder?
Philipp V. schrieb: > Laut Datenblatt läuft der ATmega328 doch nach entfernen der > entsprechenden fuse mit 8MHz oder? Der RC allein reicht nicht. Quarz muss sein.
Auf die Gefahr hin, dass es ne dumme Frage ist: kann man die Taktfrequenz eines Quarzes bspw. halbieren? Ich habe hier noch ein paar 16MHz Quarze rumfliegen, der MCP2515 ist allerdings mit max. 10MHz angegeben, wenn ich mich nicht irre. Deshalb nehme ich mal an, dass ich mit meinen Quarzen nicht weit komme
Viel einfacher wäre es, einen Mikrocontroller zu verwenden, welcher den CAN-Controller mitgeliefert hat. Da fällt ein IC und das SPI weg und damit eine Reihe an Fehlerquellen. Dann kann man auch Mikrocontroller und CAN-Controller aus einem Quarz versorgen. In Form des STM32F103C8T6 kriegt man das nachgeworfen, in Form des STM32-Olimexino komplett fertig aufgebaut mit Transceiver, Schutzschaltung usw (aber etwas teurer). Nebenbei ist das Ganze debug-bar und man kann sich Schritt für Schritt im Programmcode anschauen wo es hapert. Der 120Ohm Terminierungswiderstand kommt an die CANH/CANL Leitungen, aber doch nicht an RX/TX; wenn die Treiber da drin zu schwach sind wäre es kein Wunder dass es so nicht klappt...
Philipp V. schrieb: > der MCP2515 ist allerdings mit max. 10MHz angegeben, Nein, den darfst du sogar mit 20MHz laufen lassen. Deine 16MHz sind also völlig okay.
Programmierer schrieb: > Viel einfacher wäre es, einen Mikrocontroller zu verwenden, welcher den > CAN-Controller mitgeliefert hat. An sowas habe ich auch schon mal gedacht, allerdings habe ich schon einiges an Code für den mega geschrieben und müsste das ganze ja dann irgendwie auf diese STM Plattform konvertieren > Der 120Ohm Terminierungswiderstand kommt an die CANH/CANL Leitungen, > aber doch nicht an RX/TX; Hab ich auch gesehen und sofort geädert.
Philipp V. schrieb: > Ich habe hier noch ein paar 16MHz Quarze rumfliegen, der MCP2515 ist > allerdings mit max. 10MHz angegeben Wo steht denn sowas? Ich lasse alle MCP2515 mit 16MHz Quarz laufen. Das ist die übliche Frequenz mit dem auch die meisten Softwarebibliotheken arbeiten. Ob du den Atmega328 mit Quarz oder internen Oszillator betreibst ist für deine Anwendung erst mal egal.
Thomas F. schrieb: > Wo steht denn sowas? > Ich lasse alle MCP2515 mit 16MHz Quarz laufen. Das ist die übliche > Frequenz mit dem auch die meisten Softwarebibliotheken arbeiten. Direkt auf Seite 1 im Datenblatt steht bei den Features: High-Speed SPI (10MHz). Später im Datenblatt findet mann dann unter dem Punkt Oszillator, dass bis zu 20MHz möglich sind. War auf den ersten Blick etwas irreführend für mich dargestellt.
Philipp V. schrieb: > An sowas habe ich auch schon mal gedacht, allerdings habe ich schon > einiges an Code für den mega geschrieben Es gibt den ATmega64M1-AU mit CAN. Auf DIP gibt es Adapter: https://www.amazon.de/SSOP32-Adapter-Converter-DIP-Adapterplatte-drehen/dp/B07JVRK6YQ
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.