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
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?
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
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
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_tmsg;//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.
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
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 !!!
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
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
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
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
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
@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
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
>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
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
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.
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
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
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
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
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
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
>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
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