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
wenn ich zuhause bin kann ich dir vielleicht ein Beispiel hochladen...
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
Welche Transceiver verwendest du denn? Gibt HighSpeed und LowSpeed, die sind meines Wissens nach nciht kompatibel
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
Ich meinte in die if schleife mit can_check_message() geht er nicht rein. sry
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.
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
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
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
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
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
Zu 90% liegen solche Probleme an simplen Flüchtigkeitsfehlern. Bist du dir sicher dass du richtigen Pins miteinander verbunden hast?
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
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.