Forum: Mikrocontroller und Digitale Elektronik CAN-Bibliothek fans laufen bringen


von Alex (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgendes Problem. Ich würde gerne die CAN-Bibliothek von 
http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek die 
schon in mehreren Beiträgen erwähnt wurde ans laufen bringen. 
Normalerweise sollte dieses auch out of the Box gehen. Bei mir geht aber 
leider weder senden noch empfangen.

Zur Programmierung Verwende ich ein STK600 mit AT90CAN128. (P6->RX und 
PD5 an TX) Es kommen über den ATA6660 auch Daten zum uC. Zumindest sagt 
mir der Ozilator das. Auf der Gegenseite Benutze ich ein CanCase Modul 
der Firma Vector. Beide Seiten sind auf250 kBaud eingestellt.


In der config.h habe ich nur

#define  SUPPORT_MCP2515      0
#define  SUPPORT_AT90CAN      1
#define  SUPPORT_SJA1000      0

gesetzt. Außerdem in der can_private.h

#ifndef  CAN_RX_BUFFER_SIZE
  #define  CAN_RX_BUFFER_SIZE    200
#endif


gesetzt. Ich Benutze die mitgelieferte main demo, nur das ich anstelle 
von 125 kBaud mit 250 Baud initialisiere. Hat vielleicht einer von euch 
schon Erfahrung mit der Lib gesammelt? Oder sieht irgendwo nen Fehler? 
Würde mich freuen. Kann leider nicht erkennen ob sonst noch irgendwelche 
Einstellungen gesetzt werden müssen. Vielleicht muss ja das ckdiv8 Fuse 
gesetzt sein oder so? Benutze den externen Quarz auf dem STk600 von 16 
MHZ, sollte also auch gehen. Bin für jede Hilfe Dankbar.

Grüße
Alex

von Martin (Gast)


Lesenswert?

wenn ich zuhause bin kann ich dir vielleicht ein Beispiel hochladen...

von Martin (Gast)


Lesenswert?

du musst in den registern mal die Vorteiler für die frequenzen 
vergleichen, es kann sein , dass die Lib vom AT90 andere verwendet als 
der Baustein von Vector... War bei mir so.

Mit 125Kbaud sollte es aber gehen.... kannst du das bestätigen?

von Alex (Gast)


Lesenswert?

Hmm sollte CAN  nicht spezifiziert sein? Welche Frequenzen sollten den 
anders sein? Eignetlich sollte der ATA6660 auf dem STK600 das doch 
umwandeln. Nen Beispiel wäre Klasse. Kann das heute Abend nochmal testen 
mit 125 kBaud.  Danke dir schonmal!

Grüße
Alex

von peterguy (Gast)


Lesenswert?

Welche Transceiver verwendest du denn?
Gibt HighSpeed und LowSpeed, die sind meines Wissens nach nciht 
kompatibel

von Alex (Gast)


Lesenswert?

Zuhause ein Beispiel hochladen wäre klasse :). Geht leider immer noch 
nicht. Also bei mir gehen leider auch die 125 kBaud nicht.

Der Ata6660 auf dem STK600 verwendet Highspeed can und die CANcaseXL Box 
eigentlich auch. Das sollte eigentlich auch funktionieren.

Vielleicht hilft das weiter. Ich sende von einem CAN-Port des CANcaseXL 
jede Sekunde ein Datenpaket zu dem anderen Port. Die Daten kommen auch 
(grüne Leuchten) und werde mitgeloggt. Das STK600 ist ebenfalls an den 
Bus einfach durch anstecken angeschlossen. Als jumper habe ich nur den 
Term  Jumper gesetzt, um einen Widerstand zwischen CANH und CANL Leitung 
zu setzen. Habe mal das Programm ein weni Abgeändert:


int main(void)
{
  sei();
  uart_init();
  can_init(BITRATE_125_KBPS);

  can_t msg;
  msg.id = 0x123456;
  msg.flags.rtr = 0;
  msg.flags.extended = 1;
  msg.length = 4;
  msg.data[0] = 0xde;
  msg.data[1] = 0xad;
  msg.data[2] = 0xbe;
  msg.data[3] = 0xef;
  can_send_message(&msg);  // Send the message

  ausgabe("start");       // Serielle Ausgabe über USART0
  while (1)
  {
    _delay_ms(20);

    if (can_check_message())
    {
      ausgabe("nach check message!");
      can_t msg;
         }
        }

  return 0;
}

Also das erste Senden der Nachricht empfängt die CANCASE schon nicht und 
in das can_check_message() geht er nicht mehr rein.

Grüße
Alex

von Alex (Gast)


Lesenswert?

Ich meinte in die if schleife mit can_check_message() geht er nicht 
rein. sry

von NopNop (Gast)


Angehängte Dateien:

Lesenswert?

Warum definierst Du in der IF andauernd ein neues "gleiches" can_t msg; 
und verwendest es dann niergends ?
1
if (can_check_message())
2
    {
3
    ausgabe("nach check message!");
4
    can_t msg; //Erneutes definieren der gleichen Message???
5
    }


Also ich hab die Lib von Kreatives Chaos auch schon benutzt.
Lief eigentlich auf Anhieb mit 500_KBPS ohne jegliche Probleme.

Kannst mal das Zip im Anhang probieren...sollte eigentlich gehen.
Kann es aber gerade nicht testen.

Hast Du die libcan.a richtig erstellt wie auf Kreatives-Chaos 
beschrieben?
Also richtiger Controller angegeben, richtige F_CLK usw. und dann im 
Linker in deinem Projekt angegeben?

Grüße

P.S: Sendest Du auch was an den AT90CAN? Ansonsten ist klar dass er 
nicht in die IF-Schleife rein geht. Ach ja...du definierst auch 
niergends einen Filter...schau mal bei Kreatives-Chaos in den Fragen 
ganz unten...da erklärt er das nochmal, da hatte jemand das gleiche 
Problem.

von Alex (Gast)


Lesenswert?

copy paste fehler in der IF Schleife sry. Der erstellt msg aber auch nie 
weil er da nicht rein geht.

Hmm selbst mit deinem Quelltext kommt nix an, geht nix raus. Habe aber 
noch die Empfangspuffergröße in meinem Quelltext auf 0 gesetzt weil der 
sonst mekert und halt die Baudrate auf 125.. sollte sich aber eigentlich 
nicht viel ändern.

Habe auch die libcan.a so erstellt wie es auch kreatives chaos 
beschrieben hat und in die makefile eingetragen. FCPU,mpu...

Mit dem Filter das stimmt. Aber die standard-Main die mitgeliefert ist 
sollte etwas machen.

Habe auch nochmal nachgemesen mit dem Oscar, kommen auf jeden Fall Daten 
an (sende Daten mit der CANCASEXL Box darum kann ich senden und 
empfangen mit dem ATmega.

Danke für dein Bemühen!

Grüße
Alex

von NopNop (Gast)


Lesenswert?

Alex schrieb:
> Mit dem Filter das stimmt. Aber die standard-Main die mitgeliefert ist
> sollte etwas machen.

Die ist aber auch für einen ATMEGA32 mit F_CPU =  14745600 und einem 
externen MCP2515 !!!

von Alex (Gast)


Lesenswert?

Aber das sollte doch trotzdem gehen wenn ich mich nicht irre oder?
Beim AT90CAN128 ist als Quarz 16 Mhz vorgesehen.

Was mich auch ein wenig wundert ist, der Text:

Die Bibliothek braucht ca. 1500 Byte Flash mit allen Funktionen. 
Verwendet man keine dynamischen Filter sind es 370 Byte weniger.


Ich habe noch keine Einstellung gefunden wo ich dynamische Filter 
aktivieren/deaktivieren kann.

Ich benutze ebenfalls die serielle Schnittstelle zum verschicken von 
Daten zum PC. Wenn ich das nicht richtig umgesätzt hätte könnte ich dann 
Überhaupt den uC vernünftig konfigurieren und Daten senden?

Grüße
Alex

von NopNop (Gast)


Lesenswert?

Alex schrieb:
>Aber das sollte doch trotzdem gehen wenn ich mich nicht irre oder?
Hm, warum muss man dann im Makefile zur erzeugung der libcan.a den 
Controller und F_CPU angeben?

Alex schrieb:
> Verwendet man keine dynamischen Filter sind es 370 Byte weniger.
Zitat kreatives-chaos: Die AT90CANxxx kennen nur die dynamischen Filter.
Für den MCP2515 gibt es nämlich noch die Funktion
1
void can_static_filter(const prog_uint8_t * filter_array)

Alex schrieb:
> Ich benutze ebenfalls die serielle Schnittstelle zum verschicken von
> Daten zum PC. Wenn ich das nicht richtig umgesätzt hätte könnte ich dann
> Überhaupt den uC vernünftig konfigurieren und Daten senden?
Verstehe ich nicht ganz die Frage. Senden über CAN und RS232 ist 
natürlich möglich. Bei KC gibt es ja auch nen CAN-Logger wo CAN <--> 
RS232 macht.

Grüße

von Alex (Gast)


Lesenswert?

Wie ich das meine ist, das ich doch gar nicht ein Programm auf den 
At90can128 Flashen kann, wenn das für einen anderen uC gemacht ist. (Zum 
Beispiel die Kommunikation über die serielle Schnittstelle Funktioniert 
ja einwandfrei.

Es soll nachher schon so ne art Datenlogger werden allerdings ist bei 
mir die serielle Schnittstelle nur zum Testen gedacht, damit ich mir 
anschauen kann, wo was anliegt und wo die Fehler stecken können.


Ich habe jetzt versucht zu senden. Er geht genau 15 mal in die 
can_send_message(&msg)  rein und liefert true zurück, dannach immer 
false. Allerdings bin ich mir nicht sicher ob er nur die 15 Pakete in 
den internen Speicher packt und dann versucht die Nachrichtenzu senden 
oder ob sie gesendet werden. Die gegenüberliegende Seite zeigt nichts 
an. Empfangen habe ich leider auch noch nichts.

Grüße
Alex

von NopNop (Gast)


Lesenswert?

Alex schrieb:
> Er geht genau 15 mal in die
> can_send_message(&msg)  rein und liefert true zurück, dannach immer
> false.
Hast Du das hier schon gesehen?
http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek#c000482

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Deinen Link habe ich schon gelesen. Danke dir für deine Mühe. Ich muss 
mich wohl zu meinem allerersten Eintrag korrigieren. Daten die rausgehen 
gibt es zwar allerdings sehen die irgendwie komisch aus. Die Daten die 
vom AT90CAN128 über Pin PD5 zum ATA6660 gehen sehen so aus wie in der 
beigefügten Grafik. Egal welche Daten ich schickt die Informationen an 
dem Pin sehen immer so aus (und wenn man weiter reinzoomt kann man keine 
anderen Flanken erkennen). Dementsprechend sendet das ATA6660 Modul auch 
nichts raus.

Die Frage ist immernoch woran es liegt. Also habe schon den 2 AT90CAN128 
ausprobiert. Den hatte ich noch rumfliegen. Mit der gleichen Ausgabe.

Grüße
Alex

von cskulkw (Gast)


Lesenswert?

@Alex

Also, wenn Dein Picture einen CAN-Frame darstellt, der keine Daten 
enthält, könnten diese Peaks die Stuffingbits sein. Das sind Füllbits, 
weil CAN keine NonReturnZero-Code ist.

Versuche doch einmal zwei At90CAN mit einander zu verbinden. Der eine 
empfängt und der andere sendet. Wenn die sich verstehen, dann stimmt 
etwas mit der Einstellung der Konfiguration bzgl. des Timming nicht.

So habe ich auch angefangen. Erst einmal muß das Signal stimmen, dann 
kann man im Code weiter schauen.
Auf der Microchip-HP gibt es ein Tool mit dem man in Abhängigkeit der 
Quarzfrequenz und weitere Vorgaben sich die 
Configurationregister-inhalte ausrechnen lassen kann. (nennt sich 
Microchip CAN Bit Timing Calculator)

Darüber kannst Du dann herausfinden, ob das CAN-Case eine Chance hat 
etwas zu empfangen. Sollten die CAN-Timebase in der CAN-Case mit der aus 
Deinem Controler nicht übereinstimmen, dann wird die CAN-Case einen 
Errorframe senden. Der sollte allerdings in der Software von Vektor 
angezeigt werden.

Sag mal brauchst Du wirklich Extended Identifier? Ich würde erst einmal 
mit dem Standard anfangen. Wenns dann läuft kannst Du immer noch 
upgraden.

Übrigens, die Idee mit dem Datalogger ist gut. Ich habe aber den Atmel 
CAN-Chip verworfen, weil er immer indiziert auf die Register der CAN-MOB 
zugreift. Das mag man bei der Library nicht unbedingt mitbekommen, aber 
bei 0,5 MBaud mit 60% Buslast, war der Interrupt noch nicht 
abgearbeitet, obwohl die nächste Nachricht eingetroffen war.

Also mit dem MCP2515 kannst Du über SPI, die Botschaften so schnell 
auslesen, dass die nachfolgende Botschaft nicht die ausgelesen 
überschreibt. Außerdem funktioniert beim MCP das Rollover von der RXB0 
in die RXB1 recht zuverlässig.

Solltest Du überhaupt nicht weiter kommen und kannst Dir ev. einen 
LogiPort-Datenlogger beschaffen, hättest Du die Möglichkeit die Daten 
auf dem Bus sofort interpretiert angezeigt zu bekommen. Mit einem 
Osziloskop allein ist es schwierig.

Viel Erfolg

von Alex (Gast)


Lesenswert?

Super habs zum laufen gebracht. Habe die Baudrate auf 10 MBaud gestellt 
und nun geht es. Darauf lässt sich aufbauen :). Danke eucht allen für 
die Zahlreiche Hilfe. Das mit der Geschwindigkeit auf dem CAN Bus muss 
ich allerdings nochmal nachschauen.

Grüße
Alex

von NopNop (Gast)


Lesenswert?

>Habe die Baudrate auf 10 MBaud gestellt
Wo kann man das denn auf 10 MBaud stellen?

Bist Du sicher dass Du bei Deinem Projekt F_CPU richtig angegeben hast?
Hast Du in den Fuses den richtigen Clock ausgewählt?
Fuse CKDIV8 aktiv?

Grüße

von Alex (Gast)


Lesenswert?

Hey,

also immoment versuche ich Baudratentechnisch höher zu kommen. Meine 
Idee lag auch dadran, das der Quarz vielleicht kaputt ist. Habe dann 
nachgemessen und er Taktet mit 16 Mhz (sprich pro Periode 60 ns) also 
sollte OK sein. Die Fuse CHK8DIV ist auch nicht aktiviert. Also dadran 
liegt es nicht.

Bei dem CANCASEXL kann man das einfach über ne Hardware-konfig die 
Baudrate setzen. Bei der Lib die oben angegeben wurde kann man das ja 
einfach Über den Aufruf der Init mit Konfigurieren. Allerdings haben ich 
dazu nochmal ne Frage. Im Datenblatt des At90CAN128 sind immer 2 
Einstellungen für eine Baudrate vorgesehen. Allerdings sind die 
Time-quanten dann anders eingestellt. Was würde das den Bringen?Steig da 
nicht so ganz hinter.

Prinzipiell sollten aber beide Seiten bei der Baudrate 500 KBaud und 
sogar 1 MBaud miteinander kommunizieren können. Allerdings habe ich es 
nur bis 50 kBaud hinbekommen. Hat jemand noch eine Idee?

Grüße
Alex

von Jörg H. (dr_coolgood)


Lesenswert?

Alex,

ich benutze die CAN Lib von Fabian seit Jahren ohne Probleme.
Dein Fragen zeigen, dass Du auf einem löchrigen Wissen stehst.

Mein Vorschlag: Alles nochmal genau lesen und checken wie die Frequenzen 
stehen.
Die sind entscheidend wichtig.
Als nächstes setzt Du Dich mit den Filtern auseinander.

Wenn Du anfängst in den Tiefen der lib rumzufummeln, bist Du falsch 
unterwegs - die funktioniert. Garantiert.

von Alex (Gast)


Lesenswert?

Das Problem was ich gerade habe ist, dass ich nicht weiß wo ich noch 
genau nach dem Fehler nachsuchen soll. F_CPU ist mit 16 Mhz festgelegt. 
500 kBaud einzustellen geht auch recht easy bei der Initialisierung der 
Lib. Dann müsste der Fehler auf der Gegenüberliegenden Seite liegen. 
ALlerdings kann man hier die Baudrate fest einstellen. Das klappt ja bei 
10 kBaud, 25 kBaud und 50 kBaud auch, warum sollte es den dann nicht bei 
100 kBaud oder höher Funktionieren? Bei dem CANCase can man ausser der 
Baudrate keine extra Frequenz einstellen. 500 kBaud ist dort auch als 
Default angegeben, also vermute ich mal das diese auch unterstützt wird. 
Laut Datenblatt wird bis zu 1 MBaud alles unterstützt. Darum weiß ich 
nicht wirklich wie dort der Fehler liegen könnte. Aber ich suche noch:).

Grüße
Alex

von NopNop (Gast)


Lesenswert?

Wie gesagt...genau die gleich Konstellation hatte ich auch.
AT90CAN128 mit 16MHz (Can-Lib Fabian Greif 500kBaud) --> CANCaseXL.

Ging sofort ohne irgendwelche Probleme.

Wie lange sind Deine Leitungen? Verdrillt?
Abschlusswiderstände hast Du ja glaub ich dran, oder?

Grüße

von Alex (Gast)


Lesenswert?

Ich hatte vorher nen 2 Meter Kabel (vom CancaseXL zum CANcaseXL) + nen 
0.5 Meter Kabel das von dem 2 Meter Kabel zum STK600 geht. Ich habe 
sowohl mit nem externen Abschlusswiderstand als auch mit dem Jumper von 
STK600 zum setzen des Vorwiderstands Probiert (TERM-Jumper). Geht leider 
beides nicht. Dannach habe ich das 2 Meter lange Kabel mit einem 30 Cm 
Kabel ersetzt. Geht leider immer noch nicht.

Nur eine Komische Sache ist mir aufgefallen. Das CANcaseXl kann mit sich 
selber kommunizieren (bei 50 kBaud Port zu Port) auch wenn der 
AT90CAN128 nichts mitbekommt. Allerdings hat dann das zufügen des 
Abschlusswiderstands (Pin7 zu Pin 2 der Leitung) dazu geführt das der 
AT90CAN128 doch vom Bus lesen konnte.

Verdrillt sind meine Kabel nicht. Bei 30 cm und 50 cm sollte das auch so 
gehen denke ich. Sind eigentlich nicht so risiege Elektrische Störungen, 
weil der CANcasexl kann ja auch über die Längere Leitung mit sich selbst 
kommunizieren (Port 1 zu Port 2 über das 0.5m Kabel)


Grüße
Alex

von NopNop (Gast)


Lesenswert?

Kann das CANCaseXL auch bei 500k Baud mit sich selber kommunizieren?
Vielleicht liegst ja auch am CANCase?

Ja, normalerweise müsste das auf die kurzen Entfernungen ohne 
Verdrillung (sogar ohne Abschlusswiderstände) gehen. Wobei es natürlich 
ohne, durch die Reflexionen, schlechter sein dürfte.

Grüße

von Werner B. (werner-b)


Lesenswert?

Zu 90% liegen solche Probleme an simplen Flüchtigkeitsfehlern.

Bist du dir sicher dass du richtigen Pins miteinander verbunden hast?

von Volker Z. (vza)


Lesenswert?

NopNop schrieb:
> Ja, normalerweise müsste das auf die kurzen Entfernungen ohne
> Verdrillung (sogar ohne Abschlusswiderstände) gehen. Wobei es natürlich
> ohne, durch die Reflexionen, schlechter sein dürfte.

Nein, ohne Abschlusswiderstände geht es so gut wie nie.
Bei kurzen Leitungen spielt zwar die Reflektion keine Rolle, aber die 
Widerstände werden auch zum (schnellem) erreichen des rezessiven Pegels 
benötigt (im Gegensatz zu RS485).

Also auch bei Laboraufbauten mindestens ein Abschlusswiderstand 
einbauen.

Volker

von NopNop (Gast)


Lesenswert?

Volker Zabe schrieb:
> Nein, ohne Abschlusswiderstände geht es so gut wie nie.
> Bei kurzen Leitungen spielt zwar die Reflektion keine Rolle, aber die
> Widerstände werden auch zum (schnellem) erreichen des rezessiven Pegels
> benötigt (im Gegensatz zu RS485).

Ok...gut zu wissen, werd ich mir merken danke.

Bei mir hatte das damals mit 500kBaud und 2x 50cm ohne Probleme auch 
ohne Abschlusswiderstände funktioniert. Und das in einer von 
Leistungselektronik verseuchten Umgebung.

Werner B. schrieb:
> Bist du dir sicher dass du richtigen Pins miteinander verbunden hast?

Wenn er das nicht hätte, würde er ja bei 50 kBaud keine Verbindung 
bekommen.

Grüße

von Alex (Gast)


Lesenswert?

>Kann das CANCaseXL auch bei 500k Baud mit sich selber kommunizieren?
>Vielleicht liegst ja auch am CANCase?

Ja, das CANCaseXL kann sowohl bei 500 kBaud als auch bei 1 MBaud mit 
sich selber kommunizieren. Nur leider empfängt der AT90CAN128 nix.


>Zu 90% liegen solche Probleme an simplen Flüchtigkeitsfehlern.
> Bist du dir sicher dass du richtigen Pins miteinander verbunden hast?

Kann sein, aber das ganze Setup läuft ja bei 10 kBaud, 20 kBaud und 50 
kBaud.Also sollten TXD, RXD zumindest Richtig Verbunden sein.

> Nein, ohne Abschlusswiderstände geht es so gut wie nie.
> Bei kurzen Leitungen spielt zwar die Reflektion keine Rolle, aber die
> Widerstände werden auch zum (schnellem) erreichen des rezessiven Pegels
> benötigt (im Gegensatz zu RS485).

Also ein Abschlusswiderstand (120 Ohm )ist zwischen Pin 2 und Pin 7 der 
CAN Leitung fest gelötet. Das sollten die High-pegel und die Low-pegel 
sein. Zusätzlich hierzu ist auch noch der schon auf dem STK600 
untergebrachte 120 Ohm  Widerstand aktiviert indem ich Jumper Term 
gebrückt habe ( vgl.
http://support.atmel.no/knowledgebase/avrstudiohelp/mergedProjects/STK600/stk600_hardware_can.html 
) Also Widerstände sollten genug vorhanden sein denke ich oder?

Grüße
Alex

von Alex (Gast)


Lesenswert?

OK es läuft. Mir ist zwar noch nicht wirklich klar wieso aber das 
brücken des SLOPE CTRL Jumpers (Pin1 zu Pin2) hat den Trick getan. 
Eigentlich habe ich gedacht das der dann weniger schnell in den Standby 
Modus geht und dass das für mich eigentlich unerheblich ist aber gut... 
Danke euch allen für die Hilfe! Jetzt muss ich mal schauen ob ich damit 
auch auf ein echtes Auto zugreifen kann :). Aber nur lesend. Will ja 
nicht das ich mein Auto direkt abschießen. Danke!

Grüße
Alex

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
Noch kein Account? Hier anmelden.