Hardware TWI / I2C Mega16

Gast #147243
Lesenswert?

Hallo!
Ich möchte gerne Hardware I2C auf einem Mega16 proggen.
Ich programmiere in C. Ein byte auf einen PCF8574 schreiben geht ohne
Probleme, code nach datenblatt S.183.
Doch das lesen geht nicht. Leider ist nirgensbeschrieben, wie mann ein
byte vom bus liest, oder wie mann ein NACK generieren lässt.

Kann mit jemand weiterhelfen?
Gast #147245
Lesenswert?

Ja, das ist mir schon klar.
Zuerst schreibe ich die Slaveadresse + Readbit. Danach will ich die
Daten vom Bus lesen. Doch das klappt irgendwie nicht. Ich vermute dass
es am NACK bit scheitert. Ich habe im Datenblatt nirgens gefunden, wie
man es generiert...
Gast #147246
Lesenswert?

das NACK ist ähnlich dem ack

ein takt mit sda auf 0 oder 1 (0 ack und 1 nack)
 irgendwo steht das. guck dir mal die application notes von atmel dazu
an http://atmel.com/dyn/resources/prod_documents/doc2564.pdf

seite 3

An Acknowledge (ACK) is signaled by the receiver
pulling the SDA line low during the ninth SCL cycle. If the receiver
leaves the SDA
line high, a NACK is signaled.
Gast #147247
Lesenswert?

Ja, aber mir ist nicht klar, wie ich das von der Hardware generieren
lasse. Ich hab mal auf einem 8051er software i2c geschrieben, da war es
kein Problem ein NACK zu proggen ;-)

Aber kennst du kein Beispiel wo I2C über die Hardware Register genutzt
wird?
Gast #147250
Lesenswert?

Seite 189 im Datenblatt, in der Tabelle:
z.B:
"$40 SLA+R has been transmitted, ACK has been received."
Wenn in dieser Situation TWEA = 0 dann "Data byte will be received and
NOT ACK will be returned".

Ich würde empfehlen, Seite 170 bis 198 nicht nur unters Kopfkissen zu
legen, sondern auch zu lesen. Da ist alles beschrieben. Ehrlich.

Schönen Gruß
Thomas
Gast #147251
Lesenswert?

ich habe die Hardware I2C-Schnittstelle interruptgesteuert in FastAVR
abgebildet.
Da ich mir sowas auch nicht aus den Fingern sauge - hier habe ich es
her:
http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/i2c_8c-source.html

Im prinzip war es dann doch alles ziemlich einfach. Der TWI-INT. kommt
bei jedem Pup aufm I2C. Im TWI Status register sieht man als erstes
nach, welcher wert da drinn steht, und verzweigt mit einer Switch
anweisung zum eigentlichen geschehen. Ist die notwendige Aktion
erledigt, muss man die entsprechenden Bits(Acknowledge, Stop, Start
etc.) im TWCR setzen und den Int. verlassen.

Ich habe den o.g. Link jetzt vom Papier abgetippt, hoffe, der geht
noch...

AxelR.
Gast #147252
Lesenswert?

Tag zusammen!
Danke für eure Bemühungen!!

Manchmal ist die Welt schon böse... als ich am Abend das Datenblatt zum
xten mal gelsen hatte, war es mir plötzlich klar ;-)

Hab nun mein eigenes funktionierendes script.

Einen schönen Tag noch!

Martin

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren