Forum: Mikrocontroller und Digitale Elektronik atmega168 & twi/i2c - immer im slave-transmitter-mode?


von Martin S. (smartinick)


Lesenswert?

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.

von Martin S. (smartinick)


Lesenswert?

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
Noch kein Account? Hier anmelden.