-
        

Ergebnis 1 bis 4 von 4

Thema: TWI multimaster implementieren

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2007
    Beiträge
    27

    TWI multimaster implementieren

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo ,zusammen

    Ich will eine Multimaster Bus mit TWI (I2C) aufbauen.Ich habe schon bei Mikrokontroller.net und in dieser Forum durchgesucht aber ich habe nur die Implementierung in Bascom gefunden.
    http://www.rn-wissen.de/index.php/TW...is_Multimaster

    Die Vorgehenweise in Quellecode habe ich nicht wirklich verstanden. Hast jemand von euch schon in C Multimaster für I2C Bus implementiert ?Könnt ihr mir einen Hinweis geben ?
    (Wie muss man implementieren ?
    Wie kann man die Konflikte auf dem Bus handeln wenn 2 Master gleichzeitig Daten senden ? mit Kontrollvariable über Statusbus ?)

    Jeder Tips ist für mich zurzeit sehr hilfreich weil ich seit Tage im Intenetz gesucht habe.

    Ich danke euch im Vorraus.

    Mit freundlichen Grüssen

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    09.12.2004
    Ort
    Berlin -Spandau
    Alter
    33
    Beiträge
    15
    Du hast leider nicht geschrieben, mit welcher Hardware du auf den I²C-Bus zugreifst.

    Auf dem Bus existieren nur TriState- und Low-Zustände.
    1. Startbedingung zum senden von SCL: SCL muss frei sein.
    2. Sollten zwei Master Taktgleich anfangen zu senden, so gibt es eine Abbruchbedingung (Arbitration = Schiedsverfahren).
    Abbrechen muss der Master, der zuerst ein Low-Signal auf SDA feststellt, dass nicht von ihm beim Senden kommt.

    siehe dazu "www.nxp.com/.../design_con_2003_tecforum_i2c_bus_overview.pdf" Seiten 31/38/39


    Solltest du dies mit einem AVR tun, so findest du unter dem Stichwort USI (Universal Serial Interface) im Datenblatt die Data-, Status- und Controlregister.

    Statusregister (USISR):
    • Bit 7 – USISIF: Start Condition Interrupt Flag
    • Bit 6 – USIOIF: Counter Overflow Interrupt Flag
    • Bit 5 – USIPF: Stop Condition Flag
    • Bit 4 – USIDC: Data Output Collision
    • Bits 3..0 – USICNT3..0: Counter Value

    Control Register (USICR):
    • Bit 7 – USISIE: Start Condition Interrupt Enable
    • Bit 6 – USIOIE: Counter Overflow Interrupt Enable
    • Bit 5..4 – USIWM1..0: Wire Mode
    • Bit 3..2 – USICS1..0: Clock Source Select
    • Bit 1 – USICLK: Clock Strobe
    • Bit 0 – USITC: Toggle Clock Port Pin

    Gruß
    SpiekerChris
    Gib dein Wissen weiter und sei dein eigener Lehrer!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2007
    Beiträge
    27
    Hallo, sorry dass ich nicht exakt beschrieben hab.

    Ich benutzt ein Atmega 644P (Platin A ) , ein Atmega 128 RN Funk (Platin B ) 4 Motoren und 2 Ultraschallsensoren .Das Platin A sendet die Daten (Drehzahl ) für 4 Motoren . In Platin A wird eine Menge von Daten verarbeitet und am Ende kommen 4 Drehzahlen raus . Das Platin B lesen die Entfernungen von 2 Ultraschallsensoren und filtern die .Danach wird diese Daten ( gefiltert Entfernungen ) zum Platin A übertragen . Im Prinzip kann ich die Ultraschallsensorenwerten in Platin A verarbeiten aber das Platin A ist schon genug belastet .Deswegen habe ich ein extra Platin B vorgesehen .Die beide Platine sind hardwaremäßig mit TWI unterstützt.

    Ich will Platin A und Platin B wie Master behandeln und 2 Ultraschallsensoren natürlich als Slaves.Dann ist das ein Multimastersystem.

    Ich habe noch eine Frage .Ich glaube , dass man soll nur das Status auf dem Bus lesen und auswerten .Wieso braucht man auch USI zu ziehen?

    Vielen Dank

    Mit freundlichen Grüssen

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    09.12.2004
    Ort
    Berlin -Spandau
    Alter
    33
    Beiträge
    15
    Die oben beschriebenen Register beziehen sich auf den ATtiny2313.

    Beim ATmega644P sieht das wieder etwas anders aus:
    >siehe Datenblatt des ATmega644P ab Seite 209 (19. 2-wire Serial Interface).<
    http://www.atmel.com/dyn/resources/p...nt/doc8011.pdf
    Dort sind die Register TWSR (TWI Status Register) und TWCR (TWI Control Register) getrennt vom USI.

    TWSR (TWI Status Register):
    • Bits 7:3 – TWS: TWI Status
    • Bit 2 – Res: Reserved Bit
    • Bits 1:0 – TWPS: TWI Prescaler Bits

    TWCR (TWI Control Register):
    • Bit 7 – TWINT: TWI Interrupt Flag
    • Bit 6 – TWEA: TWI Enable Acknowledge Bit
    • Bit 5 – TWSTA: TWI START Condition Bit
    • Bit 4 – TWSTO: TWI STOP Condition Bit
    • Bit 3 – TWWC: TWI Write Collision Flag
    • Bit 2 – TWEN: TWI Enable Bit
    • Bit 1 – Res: Reserved Bit
    • Bit 0 – TWIE: TWI Interrupt Enable


    Beim ATmega128 sieht das wieder etwas anders aus:
    >siehe Datenblatt des ATmega128A ab Seite 201 (21. Two-wire Serial Interface)<
    http://www.atmel.com/dyn/resources/p...nt/doc8151.pdf
    Dort sind die Register TWSR (TWI Status Register) und TWCR (TWI Control Register) wie beim ATmega644P aufgebaut.

    In den Datenblättern findest du natürlich auch alle Befehle für die Programmierung in C.

    Gruß
    SpiekerChris
    Gib dein Wissen weiter und sei dein eigener Lehrer!

Berechtigungen

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