- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 5 von 5 ErsteErste ... 345
Ergebnis 41 bis 50 von 50

Thema: Atmega8 als I2C Slave

  1. #41
    Neuer Benutzer Öfters hier
    Registriert seit
    25.03.2007
    Beiträge
    6
    Anzeige

    Powerstation Test
    das hier geht noch:

    uint8_t x = 0x50;

    ohne fehler

    die stdint.h ist bereits includiert

    ich bin noch nicht so der C profi

    Gruß
    Mario

  2. #42
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Ich hoffe jetzt hab ich den Fehler:

    In C dürfen Befehle nur innerhalb von Funktionen stehen, also in main oder in einer anderen Funktion. Du hast den init-Befehl einfach so in die Landschaft gesetzt, was wohl diese seltsamen Fehler hervorruft. Das ist nur in Assembler erlaubt, dort wird der Code streng Zeile für Zeile ausgeführt. In Basic geht es auch so, aber in C nicht! Hier beginnt die Programmausführung immer am Anfang von main. Daher muss in jdem C-Programm die Funktion main vorhanden sein.
    AAußerhalb von Funktionen dürfen nur Deklarationen von globalen Variablen sowie Präprozessor-Anweisungen (alles was mit # anfängt stehen.


    Also
    Code:
    #include <avr/interrupt.h>
    #include <avr/io.h>
    #include "twislave.c"
    
    
    int main(void)
     {
    init_twi_slave(0x50);
    txbuffer[0]=255;
    txbuffer[1]=100;
    txbuffer[2]=33;
    }
    und es müsste laufen.

  3. #43
    Neuer Benutzer Öfters hier
    Registriert seit
    25.03.2007
    Beiträge
    6
    Hallo,

    Danke für die Hilfe, da hätte ich auch selbst draufkommen könne, jetzt geht es.

    viele Grüße
    Mario

  4. #44
    Neuer Benutzer Öfters hier
    Registriert seit
    10.04.2006
    Beiträge
    9
    Hallo,

    Ich versuch jetzt schon seit stunden das twislave.c file in mein avrstudio projekt einzubingen ohne erfolg, wie im Wiki beschrieben habe ich den code für twislave.c kopiert, im avrstudio eine twislave.c erstellet und den code eingefügt, jetzt bekomm ich immer diese fehlermeldung beim kompielieren :

    Build started 24.4.2007 at 12:14:44
    avr-gcc.exe -mmcu=atmega16 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT SlaveExample.o -MF dep/SlaveExample.o.d -c ../SlaveExample.c
    avr-gcc.exe -mmcu=atmega16 SlaveExample.o twislave.o -o SlaveExample.elf
    twislave.o: In function `init_twi_slave':
    ../twislave.c:44: multiple definition of `init_twi_slave'
    SlaveExample.o:../twislave.c:44: first defined here
    twislave.o: In function `__vector_17':
    ../twislave.c:70: multiple definition of `__vector_17'
    SlaveExample.o:../twislave.c:70: first defined here
    make: *** [SlaveExample.elf] Error 1
    Build succeeded with 0 Warnings...


    WAS IST FLASCH, hab es doch 1:1 kopiert

  5. #45
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Fängt deine twislave.c mit
    #ifndef _TWISLAVE_H
    #define _TWISLAVE_H
    an? Ansonsten hast du ne veraltete Version. Die Meldung riecht danach, dass die Datei mehrfach eingebunden wird. In der aktuellen Version wird das automatisch verhindert.

  6. #46
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.04.2006
    Ort
    Berlin
    Beiträge
    162
    Hallo!
    Ich versuche aus meinem Mega8 einen TWI Slave zu machen, mit der Lib von uwegw.
    Der Slave lässt sich vom Master aus erreichen, jedoch habe ich festgestellt, dass die ISR (TWI_vect) nie aufgerufen wird, wenn ich danach schreibe. Das ließ sich feststellen, da ich am Anfang der Funktion eine Led einschalte, die jedoch nicht angeht...

    Kann es sein, dass der Compiler nicht über die Bezeichnung meckert, aber trotzdem ab einer bestimmten WinAVR Version die Bezeichnung ISR nicht mehr funktioniert? Was müsste ich stattdessen schreiben?

    MfG rXenon

    Edit: Das Problem scheint sich erledigt zu haben. Jedenfalls wird die ISR jetzt aufgerufen! Ich habe einfach eine neue WinAVR Version installiert.

  7. #47
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Also lassen sich Daten im beiden Richtungen übertragen? Oder gibt der Slave bloß nen ACK aus, wenn er angesprochen wird?
    Wenn sich Daten übertragen lassen, wird die ISR definitiv korrekt aufgerufen.

    ISR ist die aktuelle Schreibweise. Welche winavr Version hast du?

  8. #48
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.04.2006
    Ort
    Berlin
    Beiträge
    162
    Ja ich hatte eine zu alte Version von WinAVR. Jetzt funktioniert zuminest die Übertragung von Master zu Slave und das ist auch erstmal alles was ich brauche. Aber danke für die Antwort!

    Dass ISR aktueller ist, habe ich verwundert entdeckt und deshalb gleich eine neue Version installiert.

    PS: Danke für die tolle Lib, die auch so gut kommentiert ist, dass man absolut alles nachgucken kann!

  9. #49

    Entschuldigt bitte das "Ausgraben"

    Hallo,
    ich weiß: "Du sollst keine Threads ausgraben!"
    Aber einen neuen aufmachen bringts auch nicht wirklich.

    Ich hoffe jemand kann mir hier weiterhelfen, denn es muss sich ja fast zwangsläufig um einen typischen Neulingsfehler handeln.

    Ich habe die Atmega8 mit SDA und SCK verbunden und die Leitungen mit zweimal 4,7k auf 5v gezogen.

    Dem einen Controller habe ich die testdatei geschickt, dem Anderen eine Modifizierte Version des Masterbeispiels.
    von hier.
    Ich nehme einmal an i2c-master.c ist im Beispiel anstat *.h gemeint.
    Allerdings geht die led trotzdem nicht an, was mache ich falsch?
    Könnte mir bitte jemand ein komplettes Beispiel für beide Controller zukommen lassen?

    Hier noch mein zusammengemixter code:



    Code:
    #include <avr/interrupt.h>
    #include <avr/io.h>
    #include "twislave.c"
    
    #define SLAVE_ADRESSE 0x50 //Die Slave-Adresse
    
    int main(void)
     {
    init_twi_slave(0x50);
    txbuffer[0]=0xFF;
    txbuffer[1]=0xFF;
    txbuffer[2]=0xFF;
    }
    Code:
    #include <avr/io.h>
    
    #include <util/delay.h>
    
    #include "i2cmaster.h"  //I2C-Master-Routinen von Peter Fleury verwenden (siehe http://homepage.hispeed.ch/peterfleu...ware.html#libs)
    #define SLAVE_ADRESSE 0x50
    
    
    void warte (int loop)  //loop: wartezeit in ms 
    {
    	int i;
    	for(i=0;i<loop;i++) _delay_ms(1);
    }
    
    
    int main (void)
    {
    uint8_t byte0;
    uint8_t byte1;
    uint8_t byte2;
    
    DDRB = 0xFF;
    PORTB = 0x00;
    
    while(1){
    		  if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
    		  {
    			 i2c_write(0x00); //Buffer Startadresse zum Auslesen
    			 i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen
    
    				byte0= i2c_readAck();
    				byte1= i2c_readAck();
    				byte2= i2c_readNak(); //letztes Byte lesen, darum kein ACK
    			 i2c_stop();
    	if(byte0==0xFF){
    	PORTB = 0xFF;
    	}
    	else{
    	PORTB = 0x00;
    	}
    		  }
    	
    	warte(200);
    }
    }//Ende main()
    Edit: Ich liefere auch gerne noch mehr Infos nach, weiß blos nicht so recht wo ich anfangen soll.
    Meine IDE ist WINAVR portable V.:20070525.
    oops fehler, da war statt 0x00 oben 0xff
    Ich schreib ab hier immer wieder etwas dazu wenn mir was einfällt:
    Die Atmegas laufen mit 4MHz internem Takt.

  10. #50
    Vielen Dank für die gute Biblothek:
    Das IC-Beinchen für SCL hatte im Steckbrett keinen Kontakt,
    die Verbindung zur Leiste war aber gegeben, so ein dummer Messfehler...
    Es funktioniert auf kurze Distanz!
    Jetzt muss ich nur noch irgendwie die Geschwindigkeit reduzieren, damit es auch auf einem langen Kabel geht.

Seite 5 von 5 ErsteErste ... 345

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress