PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Hardware-TWI (2 x Mega 168) [gelöst]



robin
22.11.2008, 14:38
Hi,

ich versuch schon seit einer knappen woche, eine TWI-übertragung zwischen zwei Mega168 hinzubekommen.

hab am anfang ein Programm aus dem internet für den Mega8 genommen und auf den mega168 umgeschrieben... warn ja nur manche in durch lds und out durch sts zu ändern.

Das programm wollte nicht, es kahm immer wieder zu einem bus-fehler.

An meinem bus hängen je and SCL und SDA ein 10k widerstand gegen VCC. wie es auch in mehreren forembeiträgen beschrieben wurde (hab auch schon andere widerstände versucht: 4k7 oder auch nur 200 ohm).

Da das programm aus dem internet nicht funktioniert, hab ich mir ein eigenes masterprogramm geschrieben, das mir die ganzen Bus-fehler ausgibt (zumindest die im Datenblatt). Zur zeit hab ich aber das problem, dass er mir erfolgreich eine gesendete startbedingung ausgibt und dann eine fehlermeldung die nicht im datenblatt zu finden ist...

an was kann das liegen? ich versuch mein code noch hochzustellen, aber da müsst ich den vlt noch vorher kommentieren und ein bischen ordnen.

fall euch noch was einfällt, dass ich vergessen haben könnte, schiest los.

mfg robin

bax
22.11.2008, 15:07
Ich gehe davon aus das Du mit Fehlermeldung den Inhalt des TWSR meinst? Was steht denn drin?

Rajko

robin
24.11.2008, 22:48
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):


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):

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

robin
26.11.2008, 15:06
hab mein fehler gefunden,

war eigentlich recht blöd, hab vergessen TWINT zu löschen und somit den port wieder freizugeben.

mfg robin

ps.: falls ihr interesse am ganzen code habt, den kann ich gerne noch hochladen.
Es ist einmal ein Master transmitter und ein slave reciever. beides auf einem m168