- Labornetzteil AliExpress         
Ergebnis 1 bis 8 von 8

Thema: I²C Bus Slave Routinen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.11.2003
    Ort
    Leipzig
    Alter
    37
    Beiträge
    578

    I²C Bus Slave Routinen

    Anzeige

    Praxistest und DIY Projekte
    Hallo!
    Da auf meinem Roboter bereits ein I²C Bus existiert (für SRF10), würde ich gerne auch darüber weitere Co-Controller anbinden.
    Da meine C-Control 2 als Master fungiert, müssten die Mega Controller als Slave arbeiten. Soweit ich weiß gibt es dafür aber keine fertigen Routinen.
    Wie sieht es aus, existiert so etwas schon?
    Wenn nicht, könnte man so etwas ja gemeinsam entwickeln und unter Open Source stellen, da ich denke, dass viele Andere auch an soetwas Interesse haben würden.

    MfG ACU
    http://www.roboterbastler.de
    endlich wieder online

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hi,
    ich hab nen Atmega32 Slave mit TWI zum laufen gebracht!! I2C = TWI *g*
    Ja da gibt es schon Routinen! Am besten Datenblatt lesen!! Da sind Beispiele für C und ASM drinne und da steht wie die Kommunikation ablaufen muss!
    Gruß Michi

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.11.2003
    Ort
    Leipzig
    Alter
    37
    Beiträge
    578
    Ok danke dir.
    Wenn es zufriedenstellend funktioniert und alles ok ist, werde ich die Routinen trotzdem mal veröffentlichen, man muß ja nicht das Rad neu erfinden.


    MfG ACU
    http://www.roboterbastler.de
    endlich wieder online

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hi ACU,
    Wenn es zufriedenstellend funktioniert und alles ok ist, werde ich die Routinen trotzdem mal veröffentlichen, man muß ja nicht das Rad neu erfinden.
    was meinst du damit? Soll ich meinen Code posten? Oder läuft bei dir das ganze schon?
    Gruß Michi

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    31.08.2005
    Beiträge
    6
    Ich würde es schön finden wenn du ihn Veröffentlichst.

    Sitz schon 4 Wochen dran und bekomm das einfach nicht gebacken

    Danke

    MfG
    Gamebeast

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    Verwende einfach mal die Forensuche, ich hab vor einiger Zeit mal funktionierenden Code für TWI-Kommunikation zwischen zwei AVRs gepostet (Master + Slave).

  7. #7
    Ich bekomm das auch nicht gebacken... auch nicht mit den Beispielen von dir, Pascal.

    Benutze zwei RNControl Boards... aber das zweite schickt kein ACK zurück.

    Sensoren (z.B. I2C Kompassmodul) kann ich ohne Probleme auslesen. Also an der MasterDatei oder an der Strippe usw. kann es schon mal nicht liegen.
    Es ist auch egal mit welchem Board ich die Masterfunktion betreibe, die Borads sind also in Ordnung.

    Wie gesagt, nur wenn ich beide verbinden möchte mit der Slave.c dann funzt es nicht mehr.

    Kann mir jemand helfen?


    Code:
    /********************************************************************
    
    	I2C-Slave-Routinen
    
    *********************************************************************
    
    
    void i2c_slave_init(void); Initialisieren des Slaves mit der Adresse 0xD0
    
    
    ********************************************************************/
    #include "i2c_slave.h"
    
    
    
    void i2c_slave_init(void)
    {
    
    	TWAR = 0xD0; //Slaveadresse
    	TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
    	sei();
    }
    
    
    
    ISR (TWI_vect)
    {
    	switch (TWSR)
    	{
    		case (0x60) :
    		{
    			TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
    			break;
    		}
    		
    		case (0x80) :
    		{
    			temp = TWDR;
    			
    			TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
    			break;
    		}
    		
    		case(0xA0) :
    		{   
    			TWCR=(1<<TWEN)|(1<<TWIE);
    			break;
    		}
    		
    		default:
    		{
    			TWCR=(1<<TWEN)|(1<<TWIE);
    		}
    	}
    
    }

    Gruß,

    Jan

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    schau dir mal folgende Zeilen an, die in meinem früheren post zu finden sind, vor allem die letzten Zeilen

    Code:
    //diese 6 Zeilen Code sind für das Initialisieren des TWI-Moduls zuständig, also kommt das Stück
    //Code am besten irgendwo in die Mainmethode vor die Endlosschleife
     
    //hier wird die Addresse des µC festgelegt(in den oberen 7 Bit, das LSB(niederwertigstes Bit) steht dafür, ob der µC auf einen general call //reagiert
    TWAR = 0xFE;
    //TWI Control Register, hier wird der TWI aktiviert, der Interrupt aktiviert und solche Sachen
    TWCR = 0b01000101;
    //TWI Bitrate Register, für die Frequenz des TWI wichtig
    TWBR = 0xC;
    //TWI Status Register, die 2 niederwertigsten sind für den Prescaler zur Taktberechnung, aus den
    //anderen kann man auslesen, was genau passiert, wenn ein Interrupt ausgelöst wird, es gibt nämlich
    //für den TWI nur einen
    TWSR &= 0b11111100;
    //hier werden Interrupts global aktiviert
    sei();
    //hier wird das TWI-Modul aktiv geschalten, ab hier man den µC per TWI ansteuern, den Befehl aber
    //auf jeden Fall hinter das "sei();", da es sonst nicht geht
    TWCR |= 0b10000000;
    [/quote]

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad