PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C - WinAVR Problem



bart
25.10.2005, 20:30
Hallo,

wie include ich die files von i2cmaster (pfleury) in mein c programm?
Wenn ich das so mache:

#include <i2cmaster.h>

spuckt der compiler folgenden fehler aus:

main.o(.text+0x18): In function `main':
D:\HRP2\Progs/main.c:49: undefined reference to `i2c_init'
main.o(.text+0x1e):D:\HRP2\Progs/main.c:56: undefined reference to `i2c_start'
main.o(.text+0x24):D:\HRP2\Progs/main.c:57: undefined reference to `i2c_write'
main.o(.text+0x2a):D:\HRP2\Progs/main.c:58: undefined reference to `i2c_write'
main.o(.text+0x2e):D:\HRP2\Progs/main.c:59: undefined reference to `i2c_stop'
make.exe: *** [main.elf] Error 1

In welches Verzeichnis muss ich welche Files kopieren damit dies nicht passiert, oder include ich falsch?

luma
25.10.2005, 20:46
Hio. Also generell tut man eigene Headerdateien mit "..." (also Anführungszeichen) einbinden (also sozusagen "includen" :)). Wenn man das mit <...> macht, dann sucht der Compiler (so wie ich das verstanden habe) im Klassenpfad (also Classpath) nach der Datei. Das Programm sagt ja, er kann's nicht finden. Ich kenn die Bib nicht. Wenn das nur eine .h-Datei und eine .c-Datei ist, einfach im Projektordner speichern (also da, wo auch deine anderen Dateien liegen, die zum Projekt gehören) dann zu WinAvr mit Rechtsklick > Add files... und dann beide Dateien zum Projekt hinzufügen. Natürlich nicht im Makefile die Einbindung für die neue C-Datei nicht vergessen (im Programm MFile einfach Edit > Source files... (so heißt das glaub ich) und dann die C-Datei auswählen. ACHTUNG: Ich habe schon Probleme gehabt, wenn im angegebenen Pfad ein Leerzeichen ist! Der Compiler denkt dann das wären zwei Verzeichnisse. Also Leerzeichen aus dem Pfad fern halten!

Gruß
Lutz

bart
25.10.2005, 22:41
super jetzt kompiliert winavr fehlerfrei, es lag daran, dass ich twinmaster.c nicht in das makefile integriert hatte.

Danke
Mfg

bluebrother
26.10.2005, 09:28
spuckt der compiler folgenden fehler aus:

main.o(.text+0x18): In function `main':
D:\HRP2\Progs/main.c:49: undefined reference to `i2c_init'
main.o(.text+0x1e):D:\HRP2\Progs/main.c:56: undefined reference to `i2c_start'


der Fehler stammt übrigens nicht vom Compiler sondern vom Linker. Der kann das nicht linken, weil -- wie du ja schon rausgefunden hast -- die entsprechende Datei nicht kompiliert worden ist (weil nicht im Makefile als notwendig gekennzeichnet)

bart
26.10.2005, 19:15
Nun eigendlich möchte ich mit Hilfe dieser Bibliothek die PCF-Bausteine auf dem rnbfra ansprechen. Jedoch klappt dies nicht.

Habe folgende Einstellungen vorgenommen.

In der i2cmaster.S

#define SDA 1
#define SCL 0
#define SDA_PORT PORTC
#define SCL_PORT PORTC

In der twinmaster.c

#define F_CPU 8000000UL
#define SCL_CLOCK 100000L

und die i2cmaster.h unverändert gelassen.

nun mein Programm:



// Bibliotheken *********************************************

#include <avr/io.h>
#include <stdint.h>
#include <avr/delay.h>

#include "i2cmaster.h"

// Definitionen *********************************************

#define PCF1 0x72
#define PCF2 0x7E
#define PCF3 0x74

#define SYSCLK 8000000

// Funktionen **********************************************

void warten(int t) //ermöglicht Pausen
{
_delay_ms(1000);
}

// main Funktion *******************************************

int main(void)
{
uint8_t i2cdaten; //Datenbyte für I2C

i2c_init(); // I2C Peripherie einschalten

i2cdaten = 1;

i2c_start(PCF4+I2C_WRITE); // I2C Start
i2c_write(0x02); // Peripherie einschalten
i2c_stop();

while (1) //Endlosschleife
{
if(i2cdaten > 16){
i2cdaten=1;
}
else
{
i2c_start(PCF3+I2C_WRITE); // I2C Start
i2c_write(i2cdaten); // write value 0x02 to EEPROM
i2c_stop(); // I2C Stop = BUS frei

warten(10);

i2cdaten = i2cdaten*2;
}
}

}



Aber irgendwo ist der Wurm drin. Soll so ein Lauflicht wie das erste Bascombeispiel werden.

luma
27.10.2005, 18:28
Hio. Also diese Funktion ist doch mal abgedreht 8):


void warten(int t) //ermöglicht Pausen
{
_delay_ms(1000);
}

Man kann ihr eine Integer t übergeben (ich nehme an t steht für t, in welcher Einheit weiß ich nich) aber in der Funktion selber wird dann nur 1000 ms geschalfen. Ich hab mal in der in der Beschreibung zu der _delay_ms gelesen, dass man ihr max. einen Wert von 256 ms übergeben kann. Ganz so sicher bin ich mir nicht. Also ich würd die warten-Funkition auf jeden Fall mal überarbeiten. Was sind denn die PCF-Bausteine? Vielleicht kann ich dir dann noch weiterhelfen...


Gruß
Lutz

bart
27.10.2005, 18:58
Hallo,

die Funktion werde ich nochmal überarbeiten :-) ist durch mehrfahes modifizieren etwas verstümmelt worden.

Bei den Bausteinen handelt es sich um die Porterweiterungsbausteine PCF8574.

Sind die Einstellungen in den i2cmaster Dateien richtig?

luma
29.10.2005, 18:34
Sind die Einstellungen in den i2cmaster Dateien richtig?


Kann ich dir leider nicht sagen, weil ich null Erfahrung mit I²C habe. Probier doch einfach aus 8)!

m.a.r.v.i.n
31.10.2005, 11:07
Hallo bart,

wenn du den I²C Bus mit der Mega Hardware (TWI) verwendest, brauchst du die Datei i2cmaster.S überhaupt nicht. Die ist nur für die Software I²C Emulation notwendig, wenn man kein TWI benutzen kann.

Verwendest du wirklich den PCF8574A (I²C Basis Adressen 0x70) wie ich deinem Programm entnehme, oder doch vielleicht den PCF8574 (I²C Basis Adresse 0x40)? Dann mußt du die Adresse PCFx in deinem Programm anpassen. Du verwendest außerdem mal PCF4 und dann wieder PCF3 in deinem Code. Welche Adresse ist denn nun eingestellt?

Für meinen Asuro habe ich den PCF8574 verwendet. Im I²C Emulations Mode, da die TWI Ports beim Asuro belegt sind.
Programmbeispiel gibt es unter:
http://asuro.pytalhost.de/pmwiki/pmwiki.php/Main/I2CPorterweiterung

Gruß Peter

bart
03.11.2005, 12:28
hallo m.a.r.v.i.n,

danke für deinen tollen Beitrag, habe es mit dem I2C Programmbeispiel des Asuro hinbekommen. \:D/

Hier nochmal der Code um dem Thread einen schönen Abschluss zu geben (zwar kein Lauflicht aber eine einzelne Led des PCF1 blinkt und eine des PCF3 leuchtet).

Ebenfalls sind die Energiesparfunktionen des RNBFRA implementiert.


#include <avr/io.h>
#include <stdint.h>
#include <avr/delay.h>
#include "i2cmaster.h"


#define PCF1 0x72
#define PCF2 0x7E
#define PCF3 0x74

void warten(int t) //ermöglicht Pausen
{
//_delay_ms(200);
int h;
for (;t>0;t--)
{
for (h=1600;h>0;h--) {}
}
return;
}

int main(void)
{
unsigned char ret;
uint8_t i2cdaten; //Datenbyte für I2C

i2c_init(); // init I2C interface

/************************************************** ****
Für Energiesparfunktionen des RNBFRA (ab Version 1.2)*/

ret = i2c_start(PCF3+I2C_WRITE);
i2cdaten=0xC2;
i2c_write(i2cdaten);
i2c_stop();
_delay_ms(10);

/************************************************** *****/


while(1)
{
ret = i2c_start(PCF1+I2C_WRITE); // set device address and write mode
if ( ret )
{
/* failed to issue start condition, possibly no device found */
i2c_stop();
warten(10);
}
else
{
/* issuing start condition ok, device accessible */
i2cdaten=0x08;
i2c_write(i2cdaten); // write data
i2c_stop();
warten(2000);

ret = i2c_start(PCF1+I2C_WRITE); // set device address and write mode
i2cdaten=0x00;
i2c_write(i2cdaten); // write data
i2c_stop();
warten(2000); // set stop conditon = release bus
}
}
return 0;
}