PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Statusregister (TWSR) TWI beim mega168



bedboy27
19.08.2008, 21:56
Hallo


hab nur noch ein kleines Problem. Der TWI (I²C) funktioniert gut.
Aber nur wenn ich das TWSR nicht nach dem richtigen Statuscode
abfrage.
Das TWSR hat immer nach jeder Byteübertragung oder Startbedingung den
Code 0x00. Obwohl z.B. nach der Startbedingung eigentlich 0x08 im TWSR stehen müsste.
Könnte mir da mal jemand helfen???


MFG
Tobi

;------------------------------------------------------
; START Condition
;------------------------------------------------------
send:
ldi akku,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
sts TWCR,akku
wait1:
lds akku,TWCR
sbrs akku,TWINT
rjmp wait1
campere2:
lds akku,TWSR
andi akku,0x00
cpi akku,Start
brne Error1
;------------------------------------------------------
; Adresse
;------------------------------------------------------
Adresse:
ldi akku,SLA_8574
sts TWDR,akku ; Speichert Slave-Adresse in TWDR
ldi akku,(1<<TWINT)|(1<<TWEN)
sts TWCR,akku
wait2:
lds akku,TWCR
sbrs akku,TWINT
rjmp wait2
campere1:
lds akku,TWSR
andi akku,0x00
cpi akku,SLA_W
brne Error2
daten:
mov data,r18
sts TWDR,data
ldi akku,0b10000100
sts TWCR,akku
wait3:
lds akku,TWCR
sbrs akku,TWINT
rjmp wait3
campere3:
lds akku,TWSR
andi akku,0x00
cpi akku,0x00
brne Error2
;------------------------------------------------------
; STOP Condition
;------------------------------------------------------
stop:
ldi akku,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
sts TWCR,akku
ret

linux_80
19.08.2008, 23:12
Hi,

kann es sein das Du den Wert mit dem falschen Wert Und-verknüpfts ?

Sollte mit 0xF8 geschehen, um die unteren 3 Bits auszublenden !

bedboy27
20.08.2008, 21:59
Nein, an dem liegts auch nicht. Denn den Wert 0xF8 hatte ich auch schon eingegeben. Hatte auch nicht funktioniert.

sternst
20.08.2008, 22:31
Du machst ständig "TWSR und 0x00".
Logisch, dass du da dann auch ständig 0x00 als Ergebnis bekommst.

linux_80
21.08.2008, 13:12
Vorher stand da "TWSR and 0x02",
es muss heissen "TWSR and 0xF8".
Oder lass mal die ganze AND-geschichte weg, denn die prescaler Bits sollten ja sowieso nicht gesetzt sein, dann gehts auch.

bedboy27
21.08.2008, 20:50
Also ich hab jetzt den Vergleich mit dem Statusregister weggelassen.
Funktioniert auch super. Danke euch.

Aber mich würde trotzdem mal interessieren warum es nicht geht wenn
ich das TWSR abfrage und mit einem bestimmen Code wie 0xF8 vergleiche.

Wenn da mal ein Fehler, aus irgentwelchen Gründen, auf tritt, kann der mir das ja garnicht sagen.

linux_80
22.08.2008, 01:01
Vergleichen solltest Du schon, aber das AND nach dem auslesen kannst Du weglassen.
Hast Du nicht 'nen Port übrig, um zu debugzwecken den Wert an LEDs anzuzeigen ?

bedboy27
23.08.2008, 10:39
Gute Idee. Bloß nen direkten Port hab ich jetzt nicht zur Verfügung.
Aber ich kann ja gleich die LED's am PCF8574 nehmen den ich
am I²C habe. Müsste ja funktionieren.

PicNick
23.08.2008, 10:43
Möchte nur deponieren, dass es den Zustand 0x00 schon auch gibt, das ist ein saumässig grauslicher Fehler auf der Leitung.

bedboy27
23.08.2008, 21:59
ja jetzt hatts auch mit dem Vergleich des TWSR funtioniert.

Ich hatte erst das TWSR ausgelesen und mir an einen Port
über LED's zeigen lassen. So wies es linux_80 vorgeschlagen hatte.

Und dann verglichen wie folgt.



lds r16,TWSR
andi r16,0x08 ;bei Start Bedingung
cpi r16,0x08
brne Error
....


danke