Forum: Mikrocontroller und Digitale Elektronik I2C Slave antwortet nicht richtig


von Mathias (Gast)


Lesenswert?

Hallo Forum,
ich habe ein kleines  Problem, ich habe einen DSP der über I2C mit einem 
Atmega8 kommunizieren soll, wobei der DSP der Master ist, der Atmega8 
soll nur im Slave Transmit Modus betrieben werden.
Er reagiert auch mit dem Interrupt auf die Anfrage des DSP aber 
antwortet nicht richtig. Anstatt der Daten die der Atmega8 senden soll, 
sendet er seine eigene Adresse.
Hier der Quellcode der Interruptroutine und die Initialisierung

1
TWI_INI:
2
  ldi        temp, ADRESS
3
  out        TWAR,temp          ; Adresse für das I2C Interface
4
  ldi       temp,(1<<TWEA)|(1<<TWEN)|(1<<TWIE)  ; TWI-Modul als Slave initialisieren
5
  out        TWCR,temp
6
  ldi        temp,0xFC
7
  out        TWSR,temp          ; Prescaler für TWI auf 1
8
9
;interrupt
10
I2CInt:
11
12
  in      Bufferi,SREG
13
  ldi     tempi, (1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE)    ; Interrupt Flag löschen
14
  out     TWCR,tempi  
15
  in       Tempi, TWSR    ; Status-Register abfragen            
16
  andi     Tempi, 0xF8    ; Bit0...2 ausblenden (Prescaler und Reserve-Bit)
17
18
  cpi     Tempi, TW_ST_SLA_ACK          ; 0xA8   SLA+R
19
  breq     TWSI_TW_ST_SLA_ACK  
20
TWSI_TW_ST_SLA_ACK:            ; xA8   10101000 (SLA+R wurde empfangen; ACK wurde zurückgesendet)    
21
  sbi    PortD,1    
22
  out    TWDR,temp2
23
  cbi    PortD,1
24
  ldi    Tempi, (1<<TWINT|1<<TWEA|1<<TWEN|1<<TWIE)
25
  out    TWCR,Tempi
26
  out      SREG,Bufferi
27
28
reti

über den Trigger an PD1 sehe ich, das er auch jedes mal da lang kommt?

Sieht hier jemand einen Fehler?

Gruß
Mathias

von Peter D. (peda)


Lesenswert?

Das Interruptflag darf erst ganz zum Schluß des Handlers gelöscht 
werden!!!

Damit sagst Du ja dem HW-I2C, daß alles getan ist und es den SCL-Pin 
loslassen kann, damit der Master weitermacht.


Peter

von Mathias (Gast)


Lesenswert?

Vielen Dank für die schnelle Antwort, das war's...
es funzt :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.