Hallo Ich arbeite mit einem AT90CAN128 (genau genommen mit dem Developer Board DVK90CAN1) und wollte die Bib von http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek einbinden. (Universelle CAN Bibliothek) Jedoch bekomme ich immer diesen Fehler für alle Funktionen die in der Bib enthalten sind undefined reference to `can_get_message' Makefile und config habe ich angepasst und dann die Bib erstellt sowie es in der Anleitung beschrieben ist Ich arbeite mit Atmel Studio 6 und habe die Dateien dann über den Solution Explorer eingebunden einmal mit Exsiting item und die Bib mit Add Library. Im Toolchain -> Linker ist dann auch der Ort der Bib angegeben. Hat jemand vielleicht eine Tipp für mich Danke
Ein Thread sollte reichen. Beitrag "Universelle CAN Bibliothek: undefined reference to `can_init'"
:
Bearbeitet durch User
Ja danke den hatte ich schon gefunden. Jedoch kam ich damit nicht weiter. Ich dachte ich hätte das so eingebunden wie es dort beschrieben ist
Markus schrieb: > Ja danke den hatte ich schon gefunden. Jedoch kam ich damit nicht > weiter. > Ich dachte ich hätte das so eingebunden wie es dort beschrieben ist Das mag schon sein, dass du das glaubst. Fakt ist aber, dass irgendwo eine Pfadangabe falsch ist oder die Library nicht mit ins Projekt aufgenommen wurde, sonst würde der Linker die Funktion finden.
Warum mit einer Lib rumschlagen wenn das direkt geht? Hier liegt auch schon genug Test-Code rum, man muss ihn nur finden, wie zum Beispiel dieses einfache Beispiel von mir für einen 16M1: http://www.mikrocontroller.net/attachment/216654/16M1_Test.c Ist nicht perfekt, tut aber was es soll. Und der 90CAN hat nur mehr Message-Boxen, nämlich 15.
Also meine main sieht folgendermaßen aus #include <avr/io.h> #include <avr/pgmspace.h> #include "can.h" ... und wie die Bib eingebunden ist habe ich im Bild angehängt
Nimm mal das ".a" beim Library Namen in den Einstellungen weg. Die "libm.a" unmmittelbar über deiner Lib ist ja auch nur mit 'libm' in der Liste und nicht mit 'libm.a'
Hast du in der config.h deinen Controller angepasst?
Also leider hat das mit dem a wegnehmen nicht funktioniert. in der config habe ich folgende Zeilen verändert gehabt bevor die bib erstellt worden ist // ------------------------------------------------------------------------ ----- /* Global settings for building the can-lib. * * Select ONE CAN controller for which you are building the can-lib. */ #define SUPPORT_MCP2515 1 #define SUPPORT_AT90CAN 1 #define SUPPORT_SJA1000 0
Nimm die 1 beim Mcp2515 weg und setze da eine 0 hin
Nach dem ich die Bib erstellt hatte und eingebunden hatte hatte ich das auch schon versucht mit der config. Ohne erfolg Ich kann höchstens die bib noch mal erstellen ohne das bei der config der mcp auf 1 sitzt.
Die config.h muss vor dem kompilieren angepasst werden.
Danke das hat funktioniert. Jedoch läuft der DVK90CAN1 mit 8mhz und nicht mit 16mhz. Ich denke deswegen bekomme ich es jetzt trotzdem nicht zum laufen. Ich hab das ganze jetzt geschafft mit der Atmel Bib zu realisieren. Allerdings kann ich dann keine IDs richtig Filtern. Das ganze hängt an dieser Funktion (unten angehängt). Vielleicht versteht ja einer was man damit machen kann. Ich steig nicht dahinter. Wäre cool. Das Problem liegt daran, wenn ich einen Mask setzte und eine falsche ID kommt sendet diese Funktion MOB_NOT_COMPLETED und ich häng damit in einer while Schleife fest. Leider kann ich diese while nicht verändern, denn selbst wenn die richtige ID kommt benötigt diese ein paar durchläufe bevor die unten stehende Funktion nicht MOB_NOT_COMPLETED zurückgibt. Ich verwende die Atmel bib. Bekommen von dieser Seite: https://bitbucket.org/m.kramis/canbootloader/src/784c7fc10a75/libraries/lib_mcu/can/ Jegliche Hilfe die mir eventuell auch nur Mobs besser verstehen lässt wäre toll. Vielleicht komm ich damit dann irgendwie weiter. U8 can_get_mob_status(void) { U8 mob_status, canstmob_copy; // Test if MOb ENABLE or DISABLE if ((CANCDMOB & 0xC0) == 0x00) {return(MOB_DISABLE);} canstmob_copy = CANSTMOB; // Copy for test integrity // If MOb is ENABLE, test if MOb is COMPLETED // - MOb Status = 0x20 then MOB_RX_COMPLETED // - MOb Status = 0x40 then MOB_TX_COMPLETED // - MOb Status = 0xA0 then MOB_RX_COMPLETED_DLCW mob_status = canstmob_copy & ((1<<DLCW)|(1<<TXOK)|(1<<RXOK)); if ( (mob_status==MOB_RX_COMPLETED) || \ (mob_status==MOB_TX_COMPLETED) || \ (mob_status==MOB_RX_COMPLETED_DLCW) ) { return(mob_status); } // If MOb is ENABLE & NOT_COMPLETED, test if MOb is in ERROR // - MOb Status bit_0 = MOB_ACK_ERROR // - MOb Status bit_1 = MOB_FORM_ERROR // - MOb Status bit_2 = MOB_CRC_ERROR // - MOb Status bit_3 = MOB_STUFF_ERROR // - MOb Status bit_4 = MOB_BIT_ERROR mob_status = canstmob_copy & ERR_MOB_MSK; if (mob_status != 0) { return(mob_status); } // If CANSTMOB = 0 then MOB_NOT_COMPLETED cmd->status = return(MOB_NOT_COMPLETED); }
Markus schrieb: > Danke das hat funktioniert. > > Jedoch läuft der DVK90CAN1 mit 8mhz und nicht mit 16mhz. Ich denke > deswegen bekomme ich es jetzt trotzdem nicht zum laufen. Woran hast Du es denn ausgemacht, das es nicht funktioniert, und warum es wegen der Taktung nicht funktionieren soll?
Also ich die Bib erstellt habe kam ein Error, dass nur die 16mhz unterstützt sind. Den Teil hab ich abgeändert, damit ich die Bib erstellen konnte.
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.