PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt beim I2C Slave



guenter1604
03.12.2009, 21:17
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

mat-sche
04.12.2009, 10:26
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

guenter1604
07.12.2009, 18:39
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 ??)


$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

StevieL
07.12.2009, 19:59
Hallo Günter,

das ist ungetestet, sollte aber so funktionieren:



$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...