Ich hab mir das jetzt alles mal ziemlich genau angesehn, und versucht damit ein Programm zu schreiben.
Ich wusste zwar das es nicht leicht wird, aber gleich so kompliziert !!!

So initialisiere ich den TWI beim Slave:
Code:
	; TWI einstellen
		; TWI TWAR (nur SLAVE) 	Adress-Register		
		ldi temp, TWI_Slave_Adresse<<TWA0|TWI_General_Call_Enable<<TWGCE
		out TWAR,temp
		; TWI TWCR 				Control-REGISTER	
		ldi temp, 1<<TWINT|1<<TWEA|0<<TWSTA|0<<TWSTO|0<<TWWC|1<<TWEN|1<<TWIE
		out TWCR,temp

und hier wollte ich versuchen einen programmtext zu schreiben um daten zu empfangen:
Code:
TWSI:
	in temp, SREG
	push temp

	in temp, TWSR
	andi temp, 0b11111000

	????
	????




TWI_Ende:
	;das TWINT-Flag löschen ((logisch 1)	
	ldi temp, 1<<TWINT|1<<TWEA|1<<TWEN|1<<TWIE
	out TWCR,temp

	pop temp
	out SREG, temp
	reti
Dort wo die ???? stehn endet mein verständnis

Ich habe mir nochmal das Datenblatt vom ATmega8 hergenommen. Auf Seite 186 ist eine schöne Tabelle was bei den ???? so alles drinn stehn sollte. Ich kann zwar English, aber da hier dann andauernd so begriffe wie SLA, ACK, GCA, ... fallen setz ich da aus.

1. Stimmt es das das Register TWSR für die Überwachung des Zustandes auf dem Bus ist, also hier steht drinnen was jetzt als nächstes geschieht?
Wenn ja, dann hab ich das schon mal nicht komplett falsch verstanden.

2. Brauch ich wirklich alle diese Befehle, und wofür stehn die jetzt im einzelnen?

Die Datenbyts empfange ich wenn TWSR auf 0x80 steht oder? ich will allerdings immer 2 Bytes empfangen, wie mach ich das?

Ich weiß das sind jetzt ziemlich viele Fragen aufeinmal, aber ich hab mir fest vorgenommen das genauer zu verstehn.

EDIT: Ich glaub ich hab jetzt aus dem Datenblatt herausgelesen das 0x80 und 0x88 jeweils ankündigen ein Datenbyte übertragen zu haben, also würde das dann so aus sehn:

Code:
TWSI:
	in temp, SREG
	push temp

	in temp, TWSR
	andi temp, 0b11111000
	
	cpi temp, 0x80
	breq Datenbyte_empfangen

	cpi temp, 0x88
	breq Datenbyte_empfangen

	rjmp TWI_Ende	

Datenbyte_empfangen:
	inc TWI_Anzahl_empfangen
	cpi TWI_Anzahl_emfpangen, 0b00000001
	rjmp Datenbyte1_emfpangen
	cpi TWI_Anzahl_emfpangen, 0b00000010
	rjmp Datenbyte2_empfangen
	
Datenbyte1_empfangen:
	mov TWI_empfangen1, temp
	rjmp TWI_Ende

Datenbyte2_emfpangen:
	clr TWI_Anzahl_empfangen
	mov TWI_emfpangen2, temp
		
	;Daten verarbeiten...
	
	rjmp TWI_Ende	


TWI_Ende:
	;das TWINT-Flag löschen ((logisch 1)	
	ldi temp, 1<<TWINT|1<<TWEA|1<<TWEN|1<<TWIE
	out TWCR,temp

	pop temp
	out SREG, temp
	reti
Wenn ich also die Anderen Status Codes weglassen kann wäre ich doch mit dem Slave schon fertig beim Programmieren oder?