Forum: Mikrocontroller und Digitale Elektronik Universelle CAN Bibliothek: undefined reference to `can_init'


von Markus (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?


: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rudolph (Gast)


Lesenswert?

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.

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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'

von Bülent C. (mirki)


Lesenswert?

Hast du in der config.h deinen Controller angepasst?

von Markus (Gast)


Lesenswert?

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

von Bülent C. (mirki)


Lesenswert?

Nimm die 1 beim Mcp2515 weg und setze da eine 0 hin

von Markus (Gast)


Lesenswert?

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.

von Bülent C. (mirki)


Lesenswert?

Jepp!

von Bülent C. (mirki)


Lesenswert?

Die config.h muss vor dem kompilieren angepasst werden.

von Markus (Gast)


Lesenswert?

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);
}

von Bülent C. (mirki)


Lesenswert?

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?

von Markus (Gast)


Lesenswert?

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