Forum: Mikrocontroller und Digitale Elektronik I2C Peripherie ansteuern


von Lutz (Gast)


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.

von holger (Gast)


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

von Lutz (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

Dann hast du vergessen die eine oder andere LIB dazu zu linken.

von Lutz (Gast)


Lesenswert?

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

von Chrisi (Gast)


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.

von Lutz (Gast)


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?

von Gast (Gast)


Lesenswert?


von Chrisi (Gast)


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.

von holger (Gast)


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.

von Lutz (Gast)


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.

von Tcf K. (tcfkat)


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...

von Lutz (Gast)


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.

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.