-         

Ergebnis 1 bis 10 von 10

Thema: I2C - WinAVR Problem

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.11.2004
    Beiträge
    123

    I2C - WinAVR Problem

    Anzeige

    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?

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2005
    Ort
    Stuttgart
    Beiträge
    260
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.11.2004
    Beiträge
    123
    super jetzt kompiliert winavr fehlerfrei, es lag daran, dass ich twinmaster.c nicht in das makefile integriert hatte.

    Danke
    Mfg

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2004
    Ort
    Karlsruhe
    Beiträge
    223

    Re: I2C - WinAVR Problem

    Zitat Zitat von bart
    spuckt der compiler folgenden fehler aus:

    main.o(.text+0x1: In function `main':
    D:\HRP2\Progs/main.c:49: undefined reference to `i2c_init'
    main.o(.text+0x1e):\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)

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.11.2004
    Beiträge
    123
    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:

    Code:
    // 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.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2005
    Ort
    Stuttgart
    Beiträge
    260
    Hio. Also diese Funktion ist doch mal abgedreht :
    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

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.11.2004
    Beiträge
    123
    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?

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2005
    Ort
    Stuttgart
    Beiträge
    260
    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 !

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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/pmw...orterweiterung

    Gruß Peter

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.11.2004
    Beiträge
    123
    hallo m.a.r.v.i.n,

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

    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.

    Code:
    #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;
    }

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •