hi,

ich hab jetzt mal einen master- und einen slavecode geschrieben.

der Master soll das byte 0b10101010 an die slave senden und gibt dabei dann jedes mal den inhalt des twsr aus.

die übertragung sieht folgendermasen aus.

-master sendet erfolgreich startbedingung
-master sendet adresse+w und erhält ack
-slave zeigt an, dass sie andressiert wurde und ack gesendet wurde...

und dann hängt sich der bus auf. es wird dann einfach nichts mehr angezeigt.

Meine vermutung ist es jetzt, dass sich die slave nichtmehr angesprochen fühlt.

meine frage ist jetzt, was muss ich in das kontrollregister (twcr) schreiben, nachdem twint ausgelöst wurde? hat der mega168 vlt. irgentwelche macken, die nicht im datenblatt erwähnt werden?

mfg robin

EDIT:

hier noch mein code:

Master (die wait-Schleifen sind nur dazu da, dass die leds länger leuchten
TWI_INT ist wie bei der slave ein vergleich von TWSR):
Code:
main:
		rcall wait
		rcall TWI_Start
main1:	lds r16,twcr
		sbrs r16,7
		rjmp main1
		rcall twi_int
		rcall wait
		rcall TWI_send_adr_w
main2:
		lds r16,twcr
		sbrs r16,7
		rjmp main2
		rcall twi_int
		rcall wait
		rcall TWI_send_data
main3:
		lds r16,twcr
		sbrs r16,7
		rjmp main3
		rcall twi_int
		rcall wait
		rcall twi_stop
main4:
		lds r16,twcr
		sbrs r16,7
		rjmp main4
		rcall twi_int
		rcall waits
		rjmp main
Slave (dieser code wird per interrupt gestartet):
Code:
twi_int2:
	lds r16,twsr
	andi r16, 0xf8
	cpi r16,0x60
	breq twi_sla_w_ack
	cpi r16,0x68
	breq twi_arbitration_lost
	cpi r16,0x70
	breq twi_generell_call
	cpi r16,0x78
	breq twi_arbitration_lost
	cpi r16,0x80
	breq twi_data_rec_ack
	cpi r16,0x88
	breq twi_data_rec_nack
	cpi r16,0x90
	breq twi_data_rec_ack
	cpi r16,0x98
	breq twi_data_rec_nack
	cpi r16,0xa0
	breq twi_stop
	rjmp fatal_error

twi_sla_w_ack:
ldi r16,1
out portb,r16
ret

fatal_error:
ldi r16,2
out portb,r16
ret

twi_arbitration_lost:
ldi r16,3
out portb,r16
ret

twi_generell_call:
ldi r16,4
out portb,r16
ret

twi_data_rec_ack:
ldi r16,5
out portb,r16
ret

twi_data_rec_nack:
ldi r16,6
out portb,r16
ret

twi_stop:
ldi r16,7
out portb,r16
ret