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
Lesezeichen