Hallo allerseits!
schon wieder ein problem mit i2c...
atmega168 mit 20mhz, hardware-twi.
prescaler ist auf 1, bitrate-register auf 192 -> 50khz. (auch schon mit
100khz probiert, bringt keine änderung)
interrupts sind disabled, also alles gepolled.
pullups sind auf beiden twi-leitungen aktiviert, pcf8583p / lm75a hängen
gemeinsam bzw. einzeln drauf, macht eigentlich keinen unterschied, der
status ist immer der gleiche:
nach der twi-initialisierung sende ich ein start, anschließend warten
bis twint gesetzt ist und twsr auslesen. die prescalerbits ausmaskieren
und den status am lcd ausgeben. der sollte jetzt lt. datenblatt 0x08
sein -> start condition has been sent.
ist aber immer 0xb8 -> lt. datenblatt ist das der status das ich im
slave transmitter-modus ein byte gesendet und ack empfangen habe.
nur will ich nichts vom slave transmitter-mode, ich will master sein und
habe ja erst eine start-condition gesendet...?
außer den twbr, twsr & twdr registern greife ich nichts an, müsste ich
noch irgendwas extra initialisieren...?
Hier die relevanten asm-schnipsel:
i2c_init:
push temp3
lds temp3,twsr
andi temp3,0b11111100
sts twsr,temp3 ; prescaler = 1
ldi temp3,192 ;192=50khz, 92=100khz
sts twbr,temp3 ; bitrate=192 -> 50khz bei 20mhz
; enable wird bei start-condition bzw. send/read/stop erledigt
pop temp3
ret
i2c_start:
push temp3
ldi temp3,(1<<TWINT)|(1<<TWEN)|(1<<TWSTA)
sts twcr,temp3
ldi temp1,'!'
rcall lcd_printchar
;warten bis twint-bit gesetzt & status abfragbar ist
i2c_start_loop:
lds temp3,TWCR
sbrs temp3,TWINT
rjmp i2c_start_loop
ldi temp1, twsr ;statusregister laden
andi temp1, 0b11111000 ; prescaler ausmaskieren
rcall lcd_number_hex ; ausgabe -> 0x08 sollte erscheinen, 0xb8 kommt
raus
ldi temp1,'!'
rcall lcd_printchar
pop temp3
ret
und im hauptprogramm rufe ich init & start nacheinander auf...
-> der rest wie lesen,... liefert leider nichts, meiner meinung nach
hänge ich ja schon beim senden der Startkondition...
Die code-samples die ich hier gefunden habe machen es auch nicht
wirklich anders -> bitrate setzen, enablen und start schicken...?
wenn ich mir die abläufe im atmega168 datenblatt ansehe müsste aber
alles passen...?
bin mittlerweile für jede idee dankbar!, Martin.