- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 3 von 3

Thema: Soft I²C HIGH Signal

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485

    Soft I²C HIGH Signal

    Anzeige

    Praxistest und DIY Projekte
    Hallo

    Ich hab im Internet eine Software I²C Implementierung gefunden (-> MAIN: i.c HEADER:i2c_software_master.h)
    Mein I²C Bus ist auf 3.3V ausgelegt und die Implementierung ist für den 5V Master. Hierfür hab ich externe Pull-Up Widerstände - somit muss ich die internen vom Master ja deaktivieren (auskommentieren):
    Code:
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    void sda_low()
    {
    	I2C_PORT 		&=  ~(1<<SDA);    			// internen Pull-Up aus
    	I2C_DDR 		|=   (1<<I2C_DDR_REG_BIT);  // Pin von SDA als Ausgang
    
    }
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    void sda_high()
    {
    	I2C_DDR 		&= ~(1<<I2C_DDR_REG_BIT);  	// Pin von SDA als Eingang 
    	//I2C_PORT 		|=  (1<<SDA);    			// internen Pull-Up an 
    } 
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    ////////////////////////////////////////////////////////////////////////////////////////////
    
    #define I2C_SCL_LOW		I2C_PORT &= ~(1 << SCL)	// Clock Low Output
    #define I2C_SCL_HIGH	        I2C_PORT |=  (1 << SCL)	// Clock High Output
    Ist das richtig so? Oder muss ich da im eigentlichen Programmcode noch ändern?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von robo_tom_24 Beitrag anzeigen
    Hallo

    Ich hab im Internet eine Software I²C Implementierung gefunden (-> MAIN: i.c HEADER:i2c_software_master.h)
    Mein I²C Bus ist auf 3.3V ausgelegt und die Implementierung ist für den 5V Master. Hierfür hab ich externe Pull-Up Widerstände - somit muss ich die internen vom Master ja deaktivieren (auskommentieren):
    Code:
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    void sda_low()
    {
    	I2C_PORT 		&=  ~(1<<SDA);    			// internen Pull-Up aus
    	I2C_DDR 		|=   (1<<I2C_DDR_REG_BIT);  // Pin von SDA als Ausgang
    
    }
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    void sda_high()
    {
    	I2C_DDR 		&= ~(1<<I2C_DDR_REG_BIT);  	// Pin von SDA als Eingang 
    	//I2C_PORT 		|=  (1<<SDA);    			// internen Pull-Up an 
    } 
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    ////////////////////////////////////////////////////////////////////////////////////////////
    
    #define I2C_SCL_LOW		I2C_PORT &= ~(1 << SCL)	// Clock Low Output
    #define I2C_SCL_HIGH	        I2C_PORT |=  (1 << SCL)	// Clock High Output
    Ist das richtig so? Oder muss ich da im eigentlichen Programmcode noch ändern?
    Ich kenne zwar den Prozessor nicht, im gezeigten Code kann ich aber nichts von Pullups erkennen. Ich sehe da nur Daten und Direction-Bits. Die Komentare scheinen mir falsch und machen auch keinen Sinn, die Pullups sind immer an, nur der Treiber wird an- und ausgeschaltet.

    Was ich aber sehe, ist daß SCL und SDA unterschiedlich behandelt werden. SCL wird nicht über das Direction-Bit als "quasi Opencollector Ausgang" gesteuert, sondern direkt. Während man mit externen Pullups von wenigen k Ohm gegen 3,3V die internen Pullups von mehren 10k gegen 5V noch neutralisieren könnte, geht das so garnicht.

    Was man aus diesen Macros aber sehen kann ist, das dieser Code in die Kategorie "works mostly" gehört. Sowohl SDA als auch SCL können und werden sowohl vom Master als auch vom Slave angesteuert. Bei SCL nennt man das Clock stretching. Wie das funktioniert, steht in der I2C Spec. Mit den gezeigten Macros für SCL läßt sich das nicht implementieren. Ich würde den Code daher nicht verwenden.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485
    Mahlzeit!

    Der µC ist ein Mega32 auf dem RN-Control....

    Gibt es sonst noch gute Soft I²C Master Lösungen? (Ja ich kenn Google, und die von Fleury ist teilweise in Assembler geschrieben von dem ich 0 Ahnung hab )

Ähnliche Themen

  1. Kein High Signal an Pin
    Von dekra54 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 17.05.2011, 16:14
  2. Antworten: 14
    Letzter Beitrag: 16.09.2008, 18:27
  3. Umwandlung von einem RS232-Signal in ein RJ45-Signal
    Von Einstein2312 im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 15.09.2007, 17:55
  4. Antworten: 0
    Letzter Beitrag: 04.07.2007, 17:10
  5. Musiksignal in high und low Signal umwandeln
    Von Mardisch im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 30.10.2005, 17:49

Stichworte

Berechtigungen

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

LiFePO4 Speicher Test