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

Thema: (gelöst) I2C -> ATMega als Slave?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.10.2007
    Beiträge
    7

    (gelöst) I2C -> ATMega als Slave?

    Anzeige

    Praxistest und DIY Projekte
    Hey Leute!

    Hab mich in den letzten Wochen etwas mit Mikrocontrollern und Bascom beschäftigt..

    Nun will ich mich an ein I2C Bus-System zwischen zwei ATMega16 wagen und habe folgende Frage: Wie kann ich einen der ATMega als Slave definieren und ihm eine I2C Adresse zuweisen?


    Ich danke euch im Voraus für euer Bemühen!
    mfg. Marko

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    04.10.2007
    Beiträge
    7
    Danke erstmal für deine Antwort!

    Hab mir die Seite durchgelesen. Muss man bei den Bespielen keine Lib einbinden?

    Über welche Pins läuft eig. der TWI Bus? Muss man da erst welche Pins definieren?

    Oder läuft der Code für einen Slave so:


    Code:
    $regfile = "m16def.dat"                                      ' the used chip 
    $crystal = 7372800                                          ' frequency used 
    ' $baud = 9600                                              ' keine baud rate angeben ! 
    
    Config Portd = Output                                       ' kompletter PortD als Ausgang 
    
    Dim Twi_control As Byte                                     ' Controlregister lokale kopie 
    Dim Twi_status As Byte
    Dim Twi_data As Byte
    
    Dim Neuesbyte As Byte                                       ' Bytemerker 
    
    Declare Sub Twi_init_slave
    
    Twi_data = 0
    Call Twi_init_slave                                         ' TWI aktivieren 
    
    ' alle LEDs ein 
    Portd = 0
    
    ' Hauptschleife 
    Do
      
        ' Merker zurücksetzen 
        Neuesbyte = 0
    
        ' schauen ob TWINT gesetzt ist 
        Twi_control = Twcr And &H80                             ' Bit7 von Controlregister 
    
        If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8                          ' Status 
    
            ' wurde ein Byte geschickt 
            If Twi_status = &H80 Or Twi_status = &H88 Then
                Twi_data = Twdr                                 ' neue Daten merken 
                Neuesbyte = 1                                   ' merken das ein neues Byte da ist 
            End If
    
            ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht 
            Twcr = &B11000100                                   ' TWINT löschen, erzeugt ACK 
        End If
    
        ' wenn ein neues Byte gekommen ist, dieses an PortD ausgeben 
        If Neuesbyte <> 0 Then
            Portd = Twi_data                                    ' Daten auf PortD ausgeben 
        End If
    
    Loop
    
    End
    
    
    ' Unterprogramme 
    
    
    ' TWI als slave aktivieren 
    Sub Twi_init_slave
        Twsr = 0                                                ' status und Prescaler auf 0 
        Twdr = &HFF                                             ' default 
        Twar = &H40                                             ' Slaveadresse setzen 
        Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten 
    
    End Sub

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    09.05.2007
    Beiträge
    202
    Hallo Marco,

    wenn du Hardware-TWI nutzt, brauchst du keine Lib einbinden. TWI läuft auf den Pins C.0 (SCL) und C.1 (SDA). Die Adresse des Slaves legst du im Unterprogramm Twi_init_slave mit Twar = &H40 (oder beliebige andere Adresse) fest.
    Gruß, Stefan

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.10.2007
    Beiträge
    7
    Ok.. danke.. langsam geht das Lichtlein auf..


    Muss ich den TWI-Bus (wie z.B. I2C) mi +5V incl. Wiederstand (zb. 1K) versorgen?

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    09.05.2007
    Beiträge
    202
    Hallo Marco,

    Pullups müssen rein. TWI ist nur ein anderer Name für I2C bei den Atmel-Prozessoren! (Hat glaub' ich irgendwelche Lizenzgründe).
    Gruß, Stefan

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    04.10.2007
    Beiträge
    7
    hey danke für die antwort! Habs hinbekommen! Es funktioniert einwandfrei!

    Eine Frage hab ich allerdings noch:
    Wenn ich einen chip, der den I2C bus unterstützt, ansteuern/auslesen möchte, kann ich da anstatt dessen einfach den twi bus verwenden?


    P.s. Und allen hilfesuchenden in sachen twi kann ich meinen fertigen und funktionierenden code via pm schicken..

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Wenn ich einen chip, der den I2C bus unterstützt, ansteuern/auslesen möchte, kann ich da anstatt dessen einfach den twi bus verwenden?
    Ja
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    09.05.2007
    Beiträge
    202
    Hallo Marco,

    und wenn du mit
    Code:
    $lib "i2c_twi.lbx"
    die Library einfügst, kannst du mit den Bascom-Hochbefehlen
    wie I2cstart, I2cwByte und I2cstop das Hardware-TWI auf dem Master benutzen.
    Gruß, Stefan

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    04.10.2007
    Beiträge
    7
    thx an alle!

    Klappt jetzt alles prima!
    mfg.

    PS. Wie kann ich einen Beitrag als gelöst markieren?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests