- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 13 von 13

Thema: I2C und SAA1046

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Anzeige

    Praxistest und DIY Projekte
    @Dennis

    Es ist natürlich schwer, einen Code zu analysieren, der nur aus Calls in eine unbekannte Library besteht.

    Einiges kann man ahnen, anderes weniger.

    I2C_start() und I2C_stop() dürften die entsprechenden Signale auf den Bus legen und I2C_write(xx) ein Byte senden. Aber was macht I2C_clock()? Die Clock auf einen Wert einstellen kann nicht sein, es gibt ja keinen Parameter und die Clock starten kann auch nicht sein, vor einem Start gibt es bei I2C keine Clock. Und was macht I2C_ack()? Ein ACK senden kann es nicht sein, das ACK kommt immer von dem, der gerade Daten empfangen hat. Und eine Abfrage, ob ein ACK empfangen wurde, kann es eigentlich auch nicht sein, dann würde ja irgendwas wie ein if im Code vorkommen.

    Bevor das nicht wirklich geklärt ist, braucht man sich über Bitkombinationen keine Gedanken zu machen.

    Hier mal kurz den Anfang einer I2C Übertragung:

    Code:
    Start erzeugen
    Adressbyte senden
    empfangenes ACK bzw NAK auswerten
    wenn NAK
            Slave antwortet nicht, Übertragung abbrechen
            Stop erzeugen
       
    wenn ACK
    weiter senden
    .
    .
    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    29.12.2014
    Beiträge
    6
    Crazy Harry

    mit deinem Controllbyte für den Segment Test leuchten jetzt an Segment 1 a,c,e,g und punkt und an Segment 3 b,e,f und punkt

    Irgenwie passt das alles Absolut nicht zu einander wenn ich alle Segmente mit voller Helligkeit und komplett anhaben möchte muss ich beim Controllbyte 0b01111111 angeben das habe ich aber auch nur mit probieren heraus gefunden wenn ich 0b01111011 angebe leuchtet Segment 1/3 voll und bei ob01110111 leuchten Segment 2/4 voll

    - - - Aktualisiert - - -

    Das ist der Code der die Daten über den I2C Bus sendet

    Code:
    #define SDA T1                /* Set P3.5 = SDA */
    #define SCL T0                /* Set P3.4 = SCL */
    #define I2C_DELAY 0x0F  /* For delay I2C bus */
    
    void I2C_delay(void)
    {
            unsigned char i;
    
            for(i=0; i<I2C_DELAY; i++);
    }
    
    void I2C_clock(void)
    {
            I2C_delay();
    
            SCL = 1;                /* Start clock */
    
            I2C_delay();    
    
            SCL = 0;                /* Clear SCL */
    }
    
    void I2C_start(void)
    {
            if(SCL)
            SCL = 0;                /* Clear SCL */
    
            SDA = 1;        /* Set SDA */
            SCL = 1;                /* Set SCL */
    
            I2C_delay(); 
    
            SDA = 0;        /* Clear SDA */
    
            I2C_delay(); 
    
            SCL = 0;        /* Clear SCL */
    }
    
    void I2C_stop(void)
    {
            if(SCL) 
            SCL = 0;                        /* Clear SCL */
    
            SDA = 0;                        /* Clear SDA */
            I2C_delay();
    
            SCL = 1;                        /* Set SCL */
    
            I2C_delay();
    
            SDA = 1;                        /* Set SDA */
    }
    
    bit I2C_write(unsigned char dat)
    {
            bit data_bit;           
            unsigned char i;        
    
            for(i=0;i<8;i++)                                /* For loop 8 time(send data 1 byte) */
            {
                    data_bit = dat & 0x80;          /* Filter MSB bit keep to data_bit */
                    SDA = data_bit;                         /* Send data_bit to SDA */
    
                    I2C_clock();                            /* Call for send data to I2C bus */
    
                    dat = dat<<1;  
            }
    
            SDA = 1;                        /* Set SDA */
    
            I2C_delay();    
            
            SCL = 1;                        /* Set SCL */
    
            I2C_delay();    
    
            data_bit = SDA;         /* Check acknowledge */
            SCL = 0;                        /* Clear SCL */
    
            I2C_delay();
    
            return data_bit;        /* If send_bit = 0 I2C is valid */                      
    }
    
    unsigned char I2C_read(void)
    {
            bit rd_bit;     
            unsigned char i, dat;
    
            dat = 0x00;     
    
            for(i=0;i<8;i++)                /* For loop read data 1 byte */
            {
                    I2C_delay();
    
                    SCL = 1;                        /* Set SCL */
    
                    I2C_delay(); 
    
                    rd_bit = SDA;           /* Keep for check acknowledge   */
                    dat = dat<<1;           
                    dat = dat | rd_bit;     /* Keep bit data in dat */
    
                    SCL = 0;                        /* Clear SCL */
            }
    
            return dat;
    }
    
    void I2C_ack()
    {
            SDA = 0;                /* Clear SDA */
    
            I2C_delay();    
    
            I2C_clock();    /* Call for send data to I2C bus */
    
            SDA = 1;                /* Set SDA */
    }
    
    void I2C_noack()
    {
            SDA = 1;                /* Set SDA */
    
            I2C_delay();
    
            I2C_clock();    /* Call for send data to I2C bus */
    
            SCL = 1;                /* Set SCL */
    }

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    29.12.2014
    Beiträge
    6
    So ich habe den Fehler gefunden habe einfach nur das Datenblatt falsch interpretiert es hat bei mir klick gemacht als mir der hinweis gegeben wurde das ja das ACK bit vom Empfänger kommt und nicht vom sender nachdem ich das raus genommen habe funktionieren die Anzeigen wunder bar danke für eure schnelle und gute Hilfe

    gruß
    Dennis

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. PCF8574 und PC847 - I2C und Optokoppler
    Von saarelektrik im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 24.12.2013, 13:08
  2. RP6 Base mal als i2C Master und als I2C Slave
    Von Lurchi im Forum Robby RP6
    Antworten: 6
    Letzter Beitrag: 15.05.2009, 21:08
  3. I2C und Interrupteingänge
    Von liggi im Forum Asuro
    Antworten: 29
    Letzter Beitrag: 20.12.2007, 02:41
  4. ATmega8 und I2C
    Von xiaoma1980 im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 25.07.2006, 20:24
  5. Mega8 und I2C
    Von avrwalli im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 06.04.2005, 19:25

Berechtigungen

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

LiFePO4 Speicher Test