- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Twi, wie liest der Master vom Bus?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2004
    Beiträge
    275

    Twi, wie liest der Master vom Bus?

    Anzeige

    Powerstation Test
    Hi!
    Ich baue gerade einen I2C Bus auf, dank der vielen wirklich guten Tutorials scheint das sehr einfach zu sein. Allerdings habe ich noch nichts gefunden wo ein Master vom Bus liest.

    Ich habe mal angefangen mir die wichtigsten Funktionen zu bauen,
    aber gerade bei der lese-Funktion bin ich mir doch sehr sehr unsicher...

    Würde mich sehr freuen wenn sich jemand das mal ansieht, und mich vll. berichtigt, oder mir vll. ne gute Seite empfielt...


    Gruss
    Bastian

    Code:
    #include <avr/twi.h>
    #include <avr/io.h>
    
    void i2cStart()
    {
        // TWINT = Enables the TWI Interrupt Flag
        // TWSTA = Writes the TWI Start Condition Bit into the Bus (Master)
        // TWEN = Enables the TWI Hardware
        TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
        while (!(TWCR & (1<<TWINT)));              //wait until the Bus is not ready
    }
    
    void i2cStop()
    {
        // TWINT = Enables the TWI Interrupt Flag
        // TWSTO = Writes the TWI Stop Condition Bit into the Bus (nolonger Master)
        // TWEN = Enables the TWI Hardware
        TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);   //Send Stop
    }
    
    void i2cSendData(unsigned char address,unsigned char data)
    {
        TWDR = address << 1;                        //load Slave Address + Write in TWDR
        TWCR = (1<<TWINT)|(1<<TWEN);     //clear Bits to start transmission
        while (! (TWCR & (1<<TWINT)));         //wait until the Bus is not ready
        TWDR = data;                                         //load data in TWDR
        TWCR = (1<<TWINT)|(1<<TWEN);    //clear Bits to start transmission
        while (! (TWCR & (1<<TWINT)));        //wait until the Bus is not ready
    }
    
    //????????????????????????????????????????????
    unsigned char i2cReadData(unsigned char address)
    {
        TWDR = (address << 1) + 1;              //load Slave Address + Read in TWDR
        TWCR = (1<<TWINT)|(1<<TWEN);     //clear Bits to start transmission
        while (! (TWCR & (1<<TWINT)));         //wait until the Bus is not ready
        TWCR = (1<<TWINT)|(1<<TWEN);     //clear Bits to start transmission
        while (! (TWCR & (1<<TWINT)));         //wait until the Bus is not ready
        return TWDR;                                          //return TWDR
    }

  2. #2
    Gast
    Der Master erzeugt Lesezyklen, übernimmt die Daten und stellt sie dann im Datenregister der Anwendersoftware zur Verfügung.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    hast du schonmal ins Datenblatt des ATMEGA8/16 usw. geschaut, da steht das ganze sehr ausführlich und verständlich drin

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2004
    Beiträge
    275
    Nun gut, werde das wohl so hinbekommen.
    Scheitere jetzt nur an einem anderen Problem.

    Sobald ich meine Funktion i2cStart() aufrufe
    und TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); ausgeführt wurde
    läuft das Programm in die Endlosschleife da das TWINT-Bit nicht gesetzt wurde.

    Nach der schlauen Literatur bedeutet dies doch das kein "START" gesendet werden konnte, dass also der Bus nicht bereit war.
    Dies deutet dann doch auf einen Hardware-Fehler, wenn mein Bus nur einen Master enthält (im "Bus" sind nur der Atmega32 und ein PCF8574).

    Grundsetzlich müsste aber doch auch ein "Start" gesendet werden können, wenn gar keine Slaves im Bus existieren, oder?
    Denn auch dieses funktioniert nicht.

    Ich fürchte an dieser Stelle hilft mir kein Tutorial weiter...

    Gruss

    Bastian

  5. #5
    Gast
    Hast du Pull-UpWiderstände ordentlich an die Busleitungen geschalten?
    Falls du Interrupts freigegeben hast (sei()), existiert für das TWI eine ISR?

    Ansonsten schau mal hier: www.mc-project.de unter der Rubrik ICs&Co ist der von dir verwendete Baustein samt Code beschrieben.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2004
    Beiträge
    275
    ja, ich hab Interrupts freigegeben.
    Aber diese sind doch unabhängig von den Interrupts des µC wenn ich bei diesem das Interrupt Enable Flag nicht gesetzt habe.

    Als Pullups nutze ich zwei 10k Ohm Widerstände.
    Danke für den Link!
    Dort scheint es alles zu geben, was ich so brauchte.

    MfG
    Bastian

  7. #7
    Gast
    10K sollte ok sein (ich verwende meist 4,7K), welche Datenrate verwendest du?

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2004
    Beiträge
    275
    Woran kann es liegen, das ich kein Start senden kann???
    bekomme das TWINT-Bit nicht gesetzt.
    Im Bus existieren nur ein PCF8574 und ein PCF8591.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2004
    Beiträge
    275
    setze den TWBR auf 15 ( TWBR = 0x10 )

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.05.2004
    Beiträge
    275
    ach ja, und der µC läuft mit 16Mhz

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen