init-Problem mit i2c von Fleury

OP #1696493
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
}
#1696497
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
OP #1696533
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.
Gast #1696563
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
Persönliche Seite #1696583
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.
OP #1696594
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?
OP #1696750
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...

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