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.
ok, problem gelöst. eine pause hat dann wieder die bäume vor lauter wald sichtbar gemacht... ein, 2 kleine fehler und nix ging. 1x twsr statt twcr beschrieben und nach der start-kondition das start-bit nicht gelöscht wie es im datenblatt steht. Danke & sorry für den unnötigen post! dafür gibts - wenns fertig ist - ein asm-beispiel für die codesammlung wenn pcf8583 und dcf77 gemeinsam funktionieren, d.h. sich alle x stunden synchen. lG, Martin.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.