-
        

Ergebnis 1 bis 4 von 4

Thema: Interrupt beim I2C Slave

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329

    Interrupt beim I2C Slave

    Anzeige

    Hallo Forum,

    ein ATMega8 soll 2 Gearsensoren abfragen. Dazu wird beim Detektieren eines Zahnradzahns ein Interrupt ausgelöst und die Zeit zum nächsten Zahn gestoppt.
    Die Werte sollen von einem anderen ATMega abgeholt werden.

    Jetzt zum Problem:

    In der Bascom-Doku zum Config I2C-Slave steht, daß ein Interrupt benötigt wird. Isch haabe aber keine Interrupt mehr frei !?
    Geht das nicht mit dem extra für I2C vorgesehenem Interrupt TWI ??
    Kann mir jemand weiterhelfen?

    Günter

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    43
    Beiträge
    379
    Hi Günter,

    schau mal hier: http://www.mikrocontroller.net/articles/AVR_TWI

    Das TWI hat einen eigenen Interrupt TWINT (TWI Interrupt Flag) , der ausgelöst wird, wenn eine Anfrage mit der richtigen Adresse kommt.

    => guter Beitrag

    Gruß MAT

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329

    I2C Slave

    Soooo,

    jetzt habe ich mich mal ins Datenblatt des ATMega8 eingegraben, aber noch nicht schlauer:

    Ich will 4 Bytes übertragen, wo muß ich die 4-fach Schleife einbauen und welche Statuscodes sind abzufragen (1Byte = A8 2. und 3. B8 letztes C8 ??)

    Code:
    $regfile = "m8def.dat"                                      ' the used chip
    $crystal = 16000000                                         ' frequency used
    
    Dim Left_array(2) As Byte
    Dim Speed_left As Word At Left_array Overlay
    Dim Right_array(2) As Byte
    Dim Speed_right As Word At Right_array Overlay
    
    Dim Cnt As Byte
    Dim Twi_control As Byte
    Dim Twi_status As Byte
    
    Declare Sub Twi_init
    
    Enable Interrupts
    Call Twi_init
    
    Do
       Speed_left = 12345
       Speed_right = 54321
        ' schauen ob TWINT gesetzt ist
        Twi_control = Twcr And &H80                             ' Bit7 von Controlregister
        If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8                          ' Status anfordern
            ' will der Master ein Byte haben
            If Twi_status = &HA8 Or Twi_status = &HB8 Then
                Twdr = Left_array(1)                            ' neue Daten ausgeben
            End If
            ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
            Twcr = &B11000100                                   ' TWINT löschen, mit ACK
        End If
    
    
    Loop
    
    
    Sub Twi_init
    
        Twar = &H70
        Twcr = &B01000100
        Twsr = 0
        Twdr = &HFF
    End Sub

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

    das ist ungetestet, sollte aber so funktionieren:

    Code:
    $regfile = "m8def.dat"                                      ' the used chip
    $crystal = 16000000                                         ' frequency used
    
    Dim Data_array(4) As Byte
    Dim Speed_left As Word At Data_array Overlay
    Dim Speed_right As Word At Data_array + 2 Overlay
    
    Dim Cnt As Byte
    Dim Twi_control As Byte
    Dim Twi_status As Byte
    Dim I As Byte
    
    Declare Sub Twi_init
    
    Enable Interrupts
    Call Twi_init
    
    Speed_left = 12345
    Speed_right = 54321
    
    Do
        Twi_control = Twcr And &H80                             ' Bit7 von Controlregister auslesen
    
        If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8                          ' Status ->Bit3 bis Bit7
    
            Select Case Twi_status
    
            Case &H60 :                                         'Wir sind gemeint
                    Twcr = &B11000100                           ' TWINT löschen, erzeugt ACK
    
            Case &HA8:                                          'Master will Byte haben
                     I = 1
                     Twdr = Data_array(i)
                     Twcr = &B11000100
    
            Case &HB8:                                          'Master Will Weiteres Byte Haben
                     Incr I
                     Twdr = Data_array(i)
                     Twcr = &B11000100
            End Select
        End If
    
    Loop
    
    
    Sub Twi_init
    
        Twar = &H70
        Twcr = &B01000100
        Twsr = 0
        Twdr = &HFF
    End Sub
    Edit: jetzt mal den Master 4 Bytes abholen lassen...
    Gruß, Stefan

Berechtigungen

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