www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CAN-Bus Sorgen


Autor: Steffen Kleinert (fenert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe ein Paar Fragen zum Thema Can-Bus:

Zunächst einmal...ich habe eine Steuerung die via Can mit anderen 
Busteilnehmern kommunizieren soll. Zunächst ist hierfür ein laptop mit 
angeschlossenen CANinterface vorgesehen.
Ich verwende einen AT90CAN128 und als Tranciver einen PCA82C250 mit den 
Anschlüssen bin ich mir eigentlich sicher... (TXD an TXCAN und RXD an 
RXCAN, RS an GND und GND und Vcc ist ja klar) als Ausgänge für den 
Can-BUS geht dann CAN_H und CA_L, sowie einmal GND mit 120 Ohm 
terminierung an beiden enden.

Zu testzwecken habe ich einfach einmal volgendes Programm aufgespielt:
#define F_CPU 16000000

#include <avr/io.h>
#include <stdint.h>
#include <stdio.h>
#include <util/delay.h>

#include "can.h"

int main () {

  int8_t i;

  CAN_message msg;
  
  msg.id = 1;
  msg.idm = 0;
  for (i=0;i<=7;i++) msg.data[i] = 0xAA;

  CAN_init(500, NONE);

  CAN_enableMOB(0, TRANSMIT_DATA, msg);

  while (1){
    CAN_sendData(0, msg.data);
    }
  return 0;
}

Die CAN-Bibliothek habe ich von hier: 
Beitrag "CAN-Bibliothek für den at90CAN128 und das AVRStudio"

Leider bekomme ich keinerlei Reaktion des CANs darauf ich habe die 
Ausgänge am Controller und am Tranciver genessen und es kommt zu keiner 
Pegelwandelung. RXCAN bleibt auf Lowlevel und TXCAN geht auf Highlevel 
nach dem Programmstart. Am Tranciver liegen dann bei CAN_H und CAN_L 
gleiche Pegel an. Ich habe dieses Programm ohne angeschlossene 
Gegenstelle getestet. Weiß jemand wo der Fehler zu suchen ist?

Gruß
Steffen

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst mindestens eine Gegenstation (z. B. CAN-Interface des Notebook) 
anschliessen, sonst geht nichts.

Otto

Autor: Steffen Kleinert (fenert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber würde dan nicht wenigstens eine Anfrage auf den CAN geschickt 
werden. Das Interface arbeitet genauso, wenn es alleine ist schickt es 
kontinuierlich eine Nachricht raus.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Terminierung?

Autor: Steffen Kleinert (fenert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Terminierung hab ich, 2x 120 Ohm an beiden Enden zwischen CAN_H und 
CAN_L.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber würde dan nicht wenigstens eine Anfrage auf den CAN geschickt
> werden.

Kommt darauf an, wie das Programm gestricj´kt ist.

Normalerweise gibt der Betrieb ohne Gegenstation sofort einen Bus-Error.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Normalerweise gibt der Betrieb ohne Gegenstation sofort einen Bus-Error.

Warum? Wieso sollte es nicht möglich sein, eine Nachricht zu versenden. 
Und am Bus hängt ausser dem Sender nur zwei Abschlusswiderstände...

Wieso sollte die Nacricht nicht versendet werden? Es hört nur keiner 
drauf...

Autor: Steffen Kleinert (fenert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss ich bei der Gegenstation irgeneinen Speziellen betriebsmodus 
einstellen? Oder reicht euch "listen only mode"?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, bei "Listen only" bekommst Du kei ACK - diese Betriebsart ist nur 
sinnvoll, um auf einem bestehenden Bus mitzulauschen.

Autor: Steffen Kleinert (fenert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, ich versuch´s gleich mal!

Autor: JoLe64 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- Hat die Gegenstelle auch 500kB eingestellt?
- "Listen only" muss ausgeschaltet sein bei der Gegenstation!
- beliebt auch: CAN-H / CAN-L vertauscht
- Im Code vermisse ich ich Einstellung der Messagelänge (msg.len) und ob 
es eine RemoteRequest message ist (sollte keine sein, msg.rtr = 0)
- Übrigens wartet "Can_sendData()" nicht unbedingt ab, ob der inhalt vom 
Sendepuffer auch wirklich gesendet wurde

Autor: JoLe64 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch was:  Manchmal wird beim "CAN_Init()" die Baudrate in Hz angegeben, 
also 500000 statt 500.

Autor: Steffen Kleinert (fenert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es jetzt nochmal versucht, aber ohne Erfolg.
Ich verwende ein USBCANmodul1 von SysTec (siehe Anhang).
Die Baudrate stimmt bei beiden mit 500KBps, auch in der Ini des 
Programms wird die Baudrate in KHz angegeben.

@JoLe64: Kennst du dich mit der von mir verwendeten Bibliothek aus?
Die Länge wird in der Funktion nicht abgefragt und Remote Request wird 
über einen eigenen Funktionsaufruf realisiert.

Die Fkt. CAN_sendData wartet auf den Sendepuffer:
// Warten bis die Datenübertragung beendet ist (TXOK-Flag von CAN-Controller gesetzt)
  while (!getbit(CANSTMOB, TXOK));


Wenn ich das CANinterface anschließe, meldet es sich wie gewünscht an 
und wartet auf befehle. Wenn ich dann versuche etwas zu senden, wird 
kontinuierlich eine Nachricht versendet und eine "CAN Error" durch 
Blinken einer LED signalisiert.

Meine Steuerung macht gar keiene Anstalten irgendetwas zu senden, weder 
zeigt sich suf dem Oszilloskop etwas noch würde das Interface etwas 
empfangen.

Die Daten vom Bus werden allerdings korrekt auf die Eingänge des 
Controllers übermittelt.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit welcher VCC betreibst Du den PCA82C250?

Autor: Steffen Kleinert (fenert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Anschlüsse sind auch nicht vertauscht, das habe ich gerade nochmal 
überprüft, CAN_H und CAN_L sind richtig verbunden.

Den Tranciver betreibe ich bei 5V, gleiche versorgung, wie µC und andere 
IC´s auf dem Board. Und wie gesagt, die Nachricht vom Interface, wenn es 
einen Error meldet wird korrekt vom Tranciver weiter gegeben.

Autor: Otto (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Den PCA250 schliesse ich so an....

Autor: Steffen Kleinert (fenert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt bei mir auch so hin die 100n müsste ich zwar erstmal suchen, wo 
der sich versteckt. RS habe ich direkt auf GND gelegt, so wie in der 
anleitung vorgeschlagen. Ansonsten genau wie bei dir.

Autor: JoLe64 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also,
mit deiner speziellen bibliothek kenn ich mich nicht aus, aber irgendwie 
sind sich die Bibliotheken ähnlich, und irgendwie sind es auch immer die 
gleichen Fehler wenn der CAN nicht geht. Allerdings hab ich bis jetzt 
immer fertige Hardware benutzt, musste also nur Software Fehler suchen.

Elektrisch ist es so, das im Ruhezustand CAN-L und CA-H gleiche Pegel 
haben. Beim Senden eines Bits geht das Potential von CAN-H ungefähr 1V 
rauf (Differentiell zu CAN-L). Dabei werden "High" und "Low" auf dem Bus 
als "Dominant" und "Rezessiv" übertragen. Dominante Bits überschreiben 
Rezessive Bits, wenn gleichzeitig gesendet. Ziemlich am Ende der Message 
schickt der Sender das "ACK", das ist ein rezessives Bit, und da müssen 
alle, die ihn hören, dieses Bit dominant überschreiben. Sonst geht der 
Sender in bus-error und sendet gar nicht mehr (ist beleidigt weil ihm 
keiner zuhört).

Du müsstest also mit einem Oszi im One-Shot zumindest diese erste 
Message nach der Initialisierung einfangen können.

Im übrigen müsste dein Laptop eine Message senden können, und wenn dein 
Controller lebt, wird er auf ACK antworten. Wenn nicht, geht dein Laptop 
in "BusError".

Autor: Steffen Kleinert (fenert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
JAaaaaaaaaa!!!!

Es funktioniert! Keine Ahnung warum oder wo der Fehler lag! Aber ich 
hab´s nochmal mit einer anderen beispieldatei(selber Beitrag wie oben, 
nur später im Verlauf) Beitrag "CAN-Bibliothek für den at90CAN128 und das AVRStudio" 
und es hat sofort funktioniert!

Ich verstehe es zwar nicht, aber bin froh das zumindest keine Hardware 
defekt ist und ich jetzt etwas habe auf dem ich aufbauen kann!

Danke für die Unterstützung.

Steffen

Autor: JoLe64 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

erst mal Glückwunsch, und poste doch noch mal wenn du rausgefunden hast 
was dein Problem war.

Auf die Schnelle sind mir 2 sachen aufgefallen:

- In dem anderen Beitrag wird die MOB 0 auf RECEIVE gesetzt
  (anstatt TRANSMIT wie bei dir)

- CAN_sendData() steht nicht in einer Endlosschleife

vielleicht hat's ja damit zu tun.

Autor: Steffen Kleinert (fenert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte ich auf den maßgeblichen Unterschied zwischen beiden Programmen 
stoßen werde ich ihn posten.

Das einmal TRANSMIT oder RECEIVE eingestellt wird ist sicher richtig. 
allerdings habe ich auch bei meinem Programm alle verfügbaren 
Operationsmodi durchprobiert, ebenso wie alle möglichen Baudraten (diese 
unterscheiden sich auch). Das eine for-Schleife eine andere Reaktion 
auslöst wie eine while-Schleife an dieser Stelle sollte meinem 
C-Verständnis nach nicht passieren. Dann schon eher die fehlende 
Wartefunktion for dem senden der Msg.
Ich werde sicherlich nach dem Wochenende einiges mehr ausprobieren. Bis 
dahin bin ich froh dass die Hardware funktioniert und es sich "nur" um 
eine Softwarefehler handelt!

Bis Dann,
Genießt das Wetter
Steffen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.