PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CAN-Bus



Kampi
10.06.2012, 17:02
Hallo Forum,

ich möchte euch mal das zeigen woran ich im Moment und in naher Zukunft noch arbeiten möchte.
Und zwar handelt es sich um einen CAN-Bus mit einem Mega32, einem MCP2515 CAN-Controller und einem MCP2551 CAN Transreciever.
Das Internet gab leider nicht all zu viele Informationen her und dementsprechend ist sehr viel davon selbst erarbeitet (nochmals danke an den Verfasser dieses C-Tutorials http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515#receive).
Die erste Idee zu dem Projekt kam mir beim lesen eines Buchs über den CAN-Bus vom Elektorverlag.
Da ich mich etwas mit dem Bus beschäftigen wollte, habe ich dazu eine kleine Platine entworfen.
Leider hat die Version 0 meiner Platine zwei kleine Fehler (Testpin des FT232 ist nicht mit GND verbunden und deswegen ist es Glück ob der funktioniert. Aber das Problem lässt sich mit einer kleinen Lötbrücke lösen und die Rx und Tx LEDs sind falsch angeschlossen.
Den Schaltplan des CAN-Knotens habe ich mal als Anhang angehängt.
Der Bus sieht im Moment so aus, dass ich einen fertig bestückten CAN-Knoten habe und ein RN-Control + Steckbrettaufbau.
RN-Control + MCP2515 und MCP2551:
http://img442.imageshack.us/img442/169/dscf0328l.jpg (http://imageshack.us/photo/my-images/442/dscf0328l.jpg/)

CAN-Knoten (selbst entworfen und bestückt):
http://img839.imageshack.us/img839/457/dscf0329c.jpg (http://imageshack.us/photo/my-images/839/dscf0329c.jpg/)

Das RN-Control sendet im Sekundentakt eine sich ständig erhöhende Zahl und der CAN-Knoten empfängt diese und gibt die auf einem PC Terminal aus:
Sender:
http://img560.imageshack.us/img560/5489/unbenanntrsz.png (http://imageshack.us/photo/my-images/560/unbenanntrsz.png/)

Empfänger:
http://img12.imageshack.us/img12/7018/unbenanntykp.png (http://imageshack.us/photo/my-images/12/unbenanntykp.png/)

Das ganze läuft komplett Interruptgesteuert ab. Somit wird der Controller nicht zu stark ausgelastet. Als Spannungsversorgung für die CAN-Knoten habe ich solch ein Kabel:
http://img407.imageshack.us/img407/9721/netzteilcanknoten.jpg (http://imageshack.us/photo/my-images/407/netzteilcanknoten.jpg/)

Dabei handelt es sich um ein Netzteil, welches ich bei mir aus der Firma bekommen habe, weil es sonst im Müll landet würde ;)
Und um die Knoten miteinander zu verbinden, habe ich mir dieses Kabel hier gebaut:
http://img403.imageshack.us/img403/5264/kabelcankomplett.jpg (http://imageshack.us/photo/my-images/403/kabelcankomplett.jpg/)

http://img710.imageshack.us/img710/5808/kabelcansteckeroben.jpg (http://imageshack.us/photo/my-images/710/kabelcansteckeroben.jpg/)

Über das Kabel wird die 12V Spannungsversorgung der einzelnen Knoten gewährleistet und es wird das CANH und CANL Signal übertragen.
Durch die 12V Spannungsversorgung ist es möglich, dass nur ein Knoten am Stromnetz hängt und die anderen Knoten werden dann über die CAN-Kabel versorgt. Auf den Platinen befindet sich ein 7805 kompatibler Schaltregler, der bis zu 1,5A Strom bereitstellen kann.

Die nächsten Schritte werden dann sein, dass ich eine PC-Software dafür schreiben wollte (mit Visual Basic oder so) womit die Knoten ausgelesen werden können (z.B. Sensorwerte anderer Knoten).
Außerdem wollte ich gucken ob ich die Anbindung eines MCP2515 an mein Raspberry Pi hin bekomme. Dann würde das Pi den Job des "CAN Master" übernehmen. An die Knoten selber wollte ich verschiedene Sensoren anschließen und damit was aufbauen.
Zwei Sensoren habe ich hier schon rumliegen (einmal Luftdruck und Temperatur und einmal Feuchtigkeit). Den Feuchtigkeitssensor kann ich aber nicht ohne weiteres nehmen, da dieser eine von der Feuchtigkeit abhängige Frequenz angibt und ich bei meinem CAN-Knoten keine Interrupts rausgeführt habe.....
Mal schauen wie sich das Problem lösen lässt. Vielleicht steige ich auch auf eine I²C Variante um.
Vielleicht wandel ich die Frequenz auch in eine analoge Spannung um und messe diese einfach.
Wie dem auch sei. Ich werde schauen, dass ich diesen Thread hier nach und nach aktualisiere sobald es was neues gibt. Dies soll für die Leute sein, die selber mal mit dem Controller rumspielen möchten. Bei meiner Recherche habe ich gemerkt, dass es nicht all zu viel über CAN und Bascom im Internet gibt. Deswegen möchte ich hier gerne etwas für die Leute schaffen womit ihnen der Einstieg erleichtert wird.
Ich stehe auch gerne jedem zur Seite, der sich selber mit dem Controller beschäftigt und dabei Hilfe braucht :)

Für weitere Infos usw. könnt ihr auch auf meine Page schauen:

http://kampis-elektroecke.de/?page_id=453

Kampi
12.06.2012, 06:28
So ein kleines Update.
Nachdem meine ersten Gehversuche am Wochenende erfolgreich waren und ich händlich den Rx-Buffer auslesen könnte, arbeite ich nun an dem Code um die komplette CAN-Nachricht zu empfangen und auszuwerten.
Sobald dies klappt werde ich es hier posten :)

TheDarkRose
12.06.2012, 09:56
Mit welchem CAN-Protokoll arbeitest du denn?

Kampi
12.06.2012, 10:17
Was meinst du mit Protokoll ;)?
Soweit ich weiß ist der Aufbau einer CAN-Nachricht festgelegt. Ich mache es erstmal recht einfach, indem ich einen 11Bit Identifier habe +1Byte als Datenpaket.

TheDarkRose
12.06.2012, 10:21
Nein, CAN als sich selbst definiert nur die Topologie und die den Aufbau der Messages. Das wären Layer 1 und 2 im OSI/ISO-Model. CAN-Geräte verwenden dann ein höheres Protokoll zur Kommunikation, z.B. CANopen oder DeviceNet

Kampi
12.06.2012, 10:32
Ahh ok.
Naja so weit bin ich noch nicht :)
Ich will erstmal eine vernünftige Kommunikation mit dem MCP2515 hinbekommen, sprich Nachricht + festgelegten Identifier versenden und richtig empfangen. Dabei Identifier berücksichtigen und dann die Daten richtig zusammensetzen.
Wenn das alles klappt wie ich es mir wünsche kommt ein Protokoll da rein :)
Ich stehe ja gerade noch am Anfang von dem ganzen und muss mich da erstmal vernünftig reindenken :)

Kampi
15.06.2012, 19:13
So wiedermal ein Update vom Bus:

Empfangsroutine ist nun auch fertig. Das Programm ließt die Daten einzelnt ein und setzt die ID zusammen (im moment nur Standard ID aber es ist auch geplant das die Extended ID verwendet werden kann). Anschließend ließt das Programm die Länge aus und ließt dann dementsprechend die Datenbytes.
In dem Sendeprogramm hat man eine Sendefunktion um eine ID vorzugeben und man kann entscheiden ob Extended oder Normal (wobei erst Normal implemetiert ist ;) ). Anschließend wird die ID zerlegt und passend verteilt. Die Daten werden in die richtigen Register geschrieben und der ganze Rummel wird abgesendet.

Kampi
24.06.2012, 23:31
Ein neues Update zum Bus:

Das Wochenende habe ich mal damit verbracht um schonmal ein wenig an der PC Software zu arbeiten.
Der erste Entwurf sieht so aus:

http://img827.imageshack.us/img827/4852/unbenanntawy.png (http://imageshack.us/photo/my-images/827/unbenanntawy.png/)

Im Grunde erstmal nur ein "Terminal" aber die eigentlichen Funktionen werden noch dazukommen :D
Gedacht ist, dass es ein Feld für den Identifier gibt, ein Feld für 1-8 Datenbytes und das die Filter noch über die Software eingestellt werden können.
Zudem dachte ich, dass vielleicht auch eine Möglichkeit kommt angeschlossene I²C Devices auszulesen.

Kampi
13.11.2012, 21:25
Heyho,

ich wollte den Thread mal ein wenig Updaten.....die letzten freien Tage habe ich mal wieder dazu genutzt um an dem Bus weiter zu arbeiten (wird auch demnächst auf meiner Homepage aktualisiert usw.).
Herausgekommen ist, dass ich das Programm etwas umdesignt habe. Außerdem habe ich noch ein kleines Userinterface für eine einfache Konsole entwickelt (der UART soll später über Interrupts arbeiten.....nicht wie in der aktuellen Version über "Input". Damit wird das ganze Programm Interruptgesteuert und ich habe die Mainloop frei):

http://img94.imageshack.us/img94/6937/userinterfaces.jpg (http://imageshack.us/photo/my-images/94/userinterfaces.jpg/)


Die Befehle die das Interface verwendet, wollte ich dann (irgendwann) auch für eine PC-Software verwenden.
Im Gegensatz zu meinem ersten Programmentwurf ist dieses Programm etwas variabler, sprich durch den Aufruf der "Data" Funktion werden nicht wie beim ersten Entwurf permanent 8 Byte gesendet sondern dies ist unterschiedlich (je nachdem wie viel gesendet werden soll).
Ein Wechsel des Controllers in den "Loopback" Modus + Senden und Empfangen von Daten sieht dann z.B. so aus:

http://img801.imageshack.us/img801/9683/sendenf.jpg (http://imageshack.us/photo/my-images/801/sendenf.jpg/)


Der Befehl "Data,7,8,15,7,12,78,16,1,144,179" ist dabei wie folgt aufgebaut:
1. Data -> Wählt die Funktion zum Senden von Daten aus
2. 7 -> der Identifier (0-2047)
3. 8 -> Anzahl der zu übertragenden Bytes
4. Die 8 Werte die übertragen werden soll.

Eine ähnliche Funktion gibt es für den Remoteframe. Hier jetzt im Nomalmode und als Antwort kommen 8 Bytes von einem zweiten Knoten zurück wo ein LM75 angeschlossen ist, der die Temperatur meines Wohnzimmers ausgibt (der Knoten hat noch die aller erste Softwareversion drauf, deswegen 8 Bytes die gesendet werden obwohl er nur ein Wert ermittelt ;) ):

http://img849.imageshack.us/img849/3628/remotex.jpg (http://imageshack.us/photo/my-images/849/remotex.jpg/)


An der Funktion zum einstellen der Filter arbeite ich noch....irgendwie verwirft der Controller die Einstellungen beim verlassen des Unterprogramms.....
Ebenso suche ich noch einen Weg einen Mega32 als I²C Slave zu betreiben.....ich habe gesehen, dass es da sogar eine Bascomfunktion für gibt aber die ist bei mir wohl irgendwie nicht drin, sprich ich muss es händisch machen.
Im Anhang ist mal der (aktuelle) Quellcode. Falls irgendjemand was dazu sagen möchte....nur zu :)
Posten tue ich den mal nicht, weil das über 1000 Zeilen sind und das ist glaube ich zuviel für einen Beitrag.