www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C Peripherie ansteuern


Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich muß in meiner Diplomarbeit einen ARM7 Controller (Philips LPC2138) 
steuern. Dabei sollen mehrere Peripherieboards (A/D Wandler, 
Temperatursensoren, Relays, MMC-Cardreader, ...) über I2C angesteuert 
werden. Die Boards sind alle von Bipom, falls jemand das was sagt. Zum 
debuggen benutze ich den Tantino von Hitex, der über USB mit dem PC 
verbunden ist und über JTAG mit dem Board. Zum programmieren benutze ich 
HiTOP5.

Ich habe schon ein paar Beispielprogramme für alle Boards dabei. Diese 
muß ich allerdings erstmal in HiTOP einbinden. Ich habe erstmal probiert 
das Relayboard (PCF8574) zu testen, dabei kam es zu folgenden Problemen:

erstes Problem:
.\Obj\i2c.o: In function `I2C_Config':
.\src/i2c.c:41: undefined reference to `__udivsi3'

i2c.c (Auszug):
void I2C_Config(unsigned long clk_bus)
{
  CURRENT_I2C_CLK = clk_bus;
  /* Initialize I2C bus */
  PINSEL0 |= 0x50;            /* Configure SCL and SDA pins */
  I2CONCLR=0x6C;               /* Clear all flags */
  I2CONSET=0x40;               /* Enable I2C */
  I2SCLH = I2SCLL = I2C_CLK(clk_bus)/2;  /* Configure CLK of I2C BUS */
}

i2c.h(Auszug):
#define I2C_CLK(clk) (uint16_t)((FOSC*PLL_M/VPBDIV_VAL)/(clk))

zweites Problem:
.\Obj\main.o: In function `main':
.\Src/main.c:79: undefined reference to `siprintf'
.\Src/main.c:89: undefined reference to `siprintf'

main.c(Auszug):
uart0Puts("\n\rSwitch RELAYS ON...");
if (WritePCF8574(0,0x00) == I2C_SUCCESS)
  uart0Puts("PASSED");
else
  uart0Puts("FAILED");
SoftDelay(DELAY);
ec =  ReadPCF8574(0,&dataByte);
siprintf(string,"\n\rExpander = 0x%02X, ec = %d",dataByte,ec);
uart0Puts(string);
SoftDelay(DELAY);

Ich habe die "stdio.h" eingebunden, und er findet sie wohl auch, 
zumindet gibt es keine Fehlermeldung dass er sie nicht findet. Warum 
findet er diese Funktion nicht?
Zum ersten Fehler, ich habe mit der Varialben  "__udivsi3" garnichts zu 
tun und finde sie auch nirgends. Warum dann diese Fehlermeldung?

Ich bin noch recht neu im Bereich Mikrocontroller und I2C Bus, aber ich 
habe mich eingelesen, und es ich muß da jetzt irgendwie durch, ist ja 
eine Diplomarbeit ;-). Also bitte sagt mir nicht ich soll erstmal mit 
einem kleineren Projekt anfangen, oder die Finger davon lassen, diese 
Möglichkeit steht nicht zur Debatte. Ich weiß auch dass die Beispiele 
nicht sehr gut programmiert sind, aber ich dachte es ist einfach so ein 
Beispiel zu verstehen, als es komplett neu zu programmieren (falls es 
denn läuft).

Danke schon mal für die Hilfe.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>.\src/i2c.c:41: undefined reference to `__udivsi3'

Vieleicht mal #include "math.h"

>siprintf(string,"\n\rExpander = 0x%02X, ec = %d",dataByte,ec);

siprintf() kenn ich nicht. Könnte sprintf() sein ;)

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
siprintf macht fast das gleiche wie sprint. Aber ich habe es auch schon 
mit sprintf oder printf probiert, immer die gleiche Fehlermeldung.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann hast du vergessen die eine oder andere LIB dazu zu linken.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche brauche ich denn noch dafür? Eigentlich doch nur die stdio.h, 
oder?

Autor: Chrisi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Höhö, und sowas nennt sich Diplomand... ;) Es geht nicht um die 
Include-Dateien, sondern um die Dateien die gelinkt werden, schau mal 
beim Aufruf des Linkers nach. Ist das ein makefile? Wie Du sehen kannst, 
wurden Deine Quellen ja bereits in Objektdateien übersetzt.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich bin Diplomand, habe aber nie behauptet dass ich viel Ahnung von 
Mikrocontrollern habe, hoffe aber es kommt noch. Nächste Frage, was ist 
ein Makefile? Und kannst Du mir vielleicht auch sagen wie ich an den 
Linker rankomme? Weiß zwar was ein Linker ist und was er macht, aber 
diese (doofe) Programm ist total neu und auch nicht das Beste, aber es 
wurde mir halt vorgesetzt und jetzt muß ich mich da irgendwie 
durchbeißen.

Ja, ich habe bereits Objektdateien, aber was bedeutet das für mich?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Chrisi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also so wie es aussieht, fehlt die komplette Laufzeitbibliothek. Selbst 
die einzelne Division kann nicht gelinkt werden. Die Hitex-Tools kenne 
ich nicht, aber da wird scheinbar nicht mit einem Makefile gearbeitet. 
Das Linkerscript scheint die Datei mit der Endung .LD zu sein, aber ich 
schätze, da muss/sollte man auch nichts drin editieren.

Schaue Dir mal eines der Examples an. Insbesondere suche mal nach 
Optionen/Einstellungen für den Linker. Da muss irgendwo die 
Laufzeitbibliothek/Runtimelibrary angegeben/angeklickt werden. Wenn Du 
das Projekt von null weg erstellt hast, ist's gut möglich, dass diese 
eben noch fehlen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ja, ich habe bereits Objektdateien, aber was bedeutet das für mich?

Das der Compiler den Code übersetzen konnte.
Nur beim linken findet er dein siprintf() nicht
weil du die libc.a nicht dazugelinkt hast.

Normalerweise passiert das im makefile:

LDFLAGS += -lc

Das musst du bei deinem HiTOP auch irgendwo eintragen.
Wahrscheinlich musst du libc.a irgendwo bei den Libraries
eintragen die dazugelinkt werden sollen. Wo kann ich dir
leider nicht sagen.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, jetzt läuft es, naja, es kommen zumindest keine Fehlermeldungen 
mehr. Ich habe einfach jeweils einen Haken bei "use gcc library", "use c 
library" und "use math library".

Danke nochmal, alleine wäre ich da wohl nie drauf gekommen.

Autor: Tcf Kat (tcfkat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hat nichts mit Mikrocontrollern, oder I²C zu tun, sondern mit C... 
lege Dir mal ein gutes Grundlagenbuch zu (ist nicht böse gemeint). C hat 
einige Fallstricke...

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das weiß ich. Das ist das große Problem, habe zwar im Studium schon 
mal c++ gemacht, aber auch nur ein bisschen und beim Mikrocontrollern 
das gleiche, nur mit ARMs habe ich noch nie was zu tun gehabt. Aber 
Bücher hab ich genug, nur die helfen auch nicht immer.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.