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.