Forum: Mikrocontroller und Digitale Elektronik init-Problem mit i2c von Fleury


von R. F. (inet_surfer88)


Lesenswert?

Hallo,

ich arbeite mich gerade in i2c ein und habe ein Problem mit der Funktion 
von Peter Fleury.

Bisher hab ich nur die ersten Bruchstücke von dem Programm, aber es 
kommt schon die erste Meldung.

Die Dateien von Fleury hab ich in das gleiche Verzeichnis kopiert, in 
der auch die .c-Datei von meinem Programm liegt. Allerdings ist da keine 
i2c_init dabei. Und wenn ich wie im Beispielprogramm angegeben die 
i2c_init aufrufe, kommt folgende Meldung:

D:\i2c_test\default/../i2c_test.c:73: undefined reference to `i2c_init'

Ist es überhaupt richtig, die Dateien von Fleury in mein Verzeichnis zu 
packen, oder müssen diese in das include-Verzeichnis vom Win-Avr?

1
#define F_CPU 8000000UL
2
#define output1    0x40
3
4
#include <avr/io.h>
5
#include <util/delay.h>
6
#include <avr/interrupt.h>
7
#include <avr/eeprom.h>
8
#include "i2cmaster.h"
9
10
11
12
/*   Interruptroutine Timer1
13
  */
14
  
15
ISR (TIMER1_OVF_vect)
16
17
{
18
  cli();
19
20
  TCNT1 = 60000;
21
  
22
  if (PINB &  (1 << 0))
23
  {
24
    PORTB &= ~(1 << 0);
25
  }
26
27
  else
28
  {
29
    PORTB |= (1 << 0);
30
  }
31
32
  sei();
33
}
34
35
36
37
/*  Hauptprogramm
38
  */
39
40
int main (void)
41
  
42
{
43
  DDRA = 0x00;    // Richtungsregister PortA: alle Pins als Eingänge
44
  DDRB = 0xFF;    // Richtungsregister PortB: alle Pins als Ausgänge
45
  DDRC = 0xFF;    // Richtungsregister PortC: alle Pins als Ausgänge
46
  DDRD = 0xFF;    // Richtungsregister PortD: alle Pins als Ausgänge
47
48
  PORTA = 0x00;    // Pull-Up-Widerstände ausschalten
49
  PORTB = 0b00000000;  // Alle Ausgänge ausschalten
50
  PORTC = 0x00;    // Alle Ausgänge auschalten
51
  PORTD = 0x00;    // Alle Ausgänge auschalten
52
53
  TIMSK |= (1 << TOIE1);      // Timer1 Interrupt freigeben
54
  TCCR1B |= (1 << CS10);      // Teiler Timer1 festlegen /1024
55
  TCCR1B |= (1 << CS12);      // Teiler Timer1 festlegen /1024
56
  TCNT1 = 60000;        ;  // Blinkgeschwindigkeit ins Timercounterregister laden
57
58
  sei();
59
60
  i2c_init();
61
62
  while (1)
63
  {
64
  }
65
}

von Karl H. (kbuchegg)


Lesenswert?

R. F. schrieb:

> Die Dateien von Fleury hab ich in das gleiche Verzeichnis kopiert, in
> der auch die .c-Datei von meinem Programm liegt. Allerdings ist da keine
> i2c_init dabei. Und wenn ich wie im Beispielprogramm angegeben die
> i2c_init aufrufe, kommt folgende Meldung:
>
> D:\i2c_test\default/../i2c_test.c:73: undefined reference to `i2c_init'
>

Das ist eine Meldung vom Linker, der versucht aus den vorübersetzten 
Einzelteilen das komplette Programm zusammenzustellen

> Ist es überhaupt richtig, die Dateien von Fleury in mein Verzeichnis zu
> packen, oder müssen diese in das include-Verzeichnis vom Win-Avr?

Das passt schon.
Aber du musst sie auch zum Projekt hinzufügen, damit sie compiliert und 
mitgelinkt werden.

http://www.mikrocontroller.net/articles/FAQ#Ich_hab_da_mehrere_.2A.c_und_.2A.h_Dateien._Was_mache_ich_damit.3F

von R. F. (inet_surfer88)


Lesenswert?

Karl heinz Buchegger schrieb:
> Das passt schon.
> Aber du musst sie auch zum Projekt hinzufügen, damit sie compiliert und
> mitgelinkt werden.


Ich habe jetzt folgendes gemacht:
Die Dateien i2cmaster.s und twimaster.c unter dem Punkt "Source Files" 
im AVR Studio hinzugefügt.
Die Datei i2cmaster.h unter dem Punkt "Header Files" hinzugefügt.

Jetzt erhalte ich die Meldung:
../twimaster.c:12:23: error: i2cmaster.h: No such file or directory

Obwohl die Datei vorhanden und im AVR Studio angegeben ist.

von Oliver (Gast)


Lesenswert?

R. F. schrieb:
> Die Dateien i2cmaster.s und twimaster.c unter dem Punkt "Source Files"
> im AVR Studio hinzugefügt.

Wenn man schon Software von anderen benutzt, sollte man doch zumindest 
mal die Doku dazu lesen.

R. F. schrieb:
> Die Datei i2cmaster.h unter dem Punkt "Header Files" hinzugefügt.

Das brauchst du nicht unbedingt, es geht auch ohne.

Wenn i2cmaster.h im selben Verzeichnis wie main.c deines Projekts steht, 
wird die normalerweise auch gefunden. Wenn nicht, dann nicht.

Oliver

von Stefan B. (stefan) Benutzerseite


Lesenswert?

R. F. schrieb:

> Jetzt erhalte ich die Meldung:
> ../twimaster.c:12:23: error: i2cmaster.h: No such file or directory

Schau dir den Inhalt von ../twimaster.c an und finde heraus, wie diese 
Datei versucht i2cmaster.h zu includen.

Das sollte einen Hinweis geben, wo diese Datei gesucht (und derzeit 
nicht gefunden) wird.

Korrigiere den Text beim #include oder kopiere die Datei an den 
richtigen Ort oder ergänze die Include-Suchpfade in den 
Projekteinstellungen.

Ich habe in meinen Projekten twimaster.c und i2cmaster.h als Kopie im 
gleichen Verzeichnis wie meine selbstgeschriebenen Quellcodes.

von R. F. (inet_surfer88)


Lesenswert?

Ich habe die i2cmaster.h jetzt einfach ins Programmverzeichnis vom AVR 
GCC kopiert. Jetzt scheint er sie zu finden.

Allerdings kommt jetzt die Meldung:
gcc plug-in: Error: Object file not found on expected location 
D:\i2c\default\i2c.elf

Bei meinen bisherigen Programmen habe ich eine solche Meldung nicht 
bekommen. Allerdings hab ich bisher auch noch keine Programme aus 
anderen Dateien eingebunden, bisher waren es immer nur kleine Projekte 
in einer Datei. Diese .elf-Dateien wurden immer automatisch erzeugt. 
Muss ich hier evtl. am AVR Studio noch was einstellen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?


von R. F. (inet_surfer88)


Lesenswert?

In dem Build-Fenster steht:

twimaster.o: In function `i2c_init':
D:\i2c\default/../twimaster.c:28: multiple definition of `i2c_init'
i2cmaster.o:(.text+0x10): first defined here

und so weiter..... Es werden alle Unterprogramme aufgezählt, die in 
Fleurys Datei stehen. Immer die gleichen 3 Zeilen.

Aber wo sollen die doppelten Definitionen herkommen?

Am Ende steht dann noch:

make: *** [i2c.elf] Error 1
Build succeeded with 0 Warnings...

von R. F. (inet_surfer88)


Lesenswert?

Zunächst mal vielen Dank für die Hilfe. Hab die Meldung jetzt weg 
bekommen. Hatte die i2cmaster.s mit eingebunden. Diese scheint aber nur 
für Software-I2C benötigt werden und darf nicht im AVR Studio angegeben 
werden.

von Oliver (Gast)


Lesenswert?

R. F. schrieb:
> Hatte die i2cmaster.s mit eingebunden. Diese scheint aber nur
> für Software-I2C benötigt werden und darf nicht im AVR Studio angegeben
> werden.

Dürfen darf die schon, dann aber nur die, und nicht twimaster.c. Aber 
wie ich schon schrieb: RTFM

Oliver

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.