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
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
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
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
Hallo Günter,
das ist ungetestet, sollte aber so funktionieren:
Edit: jetzt mal den Master 4 Bytes abholen lassen...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
Gruß, Stefan
Lesezeichen