I2C Peripherie ansteuern

Gast #638482
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.
Gast #639746
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?
Gast #639771
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.
Gast #639773
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren