mikrocontroller.net

Forum: Compiler & IDEs Procyon AVR Lib: Bug in I2C mit GCC 4.1.1?


Autor: Hartmut Semken (hsemken)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mahlzeit.

Macht doch immer wieder Spass, Bugs zu suchen - und dann auch nicht zu 
finden. ich gebs langsam auf.

Szenario: zwei Mega8 verbunden über TWI/I2C, einer ist Master, einer 
Slave.
Code sind jeweils die Procyon AVR Lib i2c routinen plus eine triviale 
main-Schleife.

Übersetzt wird das ganze mit GCC 4.1.1 aus WINAVR 20070122 (jaa, ich 
weiss, Windoofs ist für Mädchen, aber ich werde seit 15 Jahren nicht 
warm mit GDB :-)

Master Write funktioniert prima, Daten kommen am Slave an und werden 
korrekt ausgegeben (uart oder LCD).
Master Read dagegen geht nicht. Das heisst, es geht ein bischen.
Wenn man nur ein Byte vom Slave liest, die Übertragung sich aslo auf 
SLA+R und ein Byte beschränkt, dann klappts. Auch mit einem testhalber 
eingesetzten PCF8574 genau wie mit dem Mega8.

Versucht man aber, mehr als ein Byte (mit 2, 3, 4 und 5 probiert) zu 
lesen, dann wird nocht SLA+R und das erste Byte korrekt übertragen.
Danach aber ist Ruhe auf der Taktleitung. Es kommen einfach keine Takte 
mehr.
Das TWI auf dem Master shiftet aber dennoch Bits rein, die man dann als 
0xFF lesen kann.

Das Lesen passiert in einer Schleife, die für alle Lesebytes durchlaufen 
wird (d.h. für alle bis auf das letzte, das letzte wird ausserhalb der 
Schleife empfangen mit NACK statt ACK wie in der Schleife).

Wieso sollte also der erste Schleifendurchlauf funktionieren, alle 
weiteren aber nicht?
Mach ich was falsch oder GCC oder die Library?

Als Gegenprobe habe ich mal den TWI-Master-Code aus AVR315 verwendet. 
Und der funktioniert interessanterweise.

Ich habe jetzt den erzeugten Assembler-Code noch nicht so genau 
verglichen - will erstmal dumm in die runde fragen, ob jemand ds Problem 
schon hatte und vielleicht eine Lösung teilen will :-) :-)?

merci
Hartmut "hase" Semken

Autor: Frank Jonischkies (frajo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du sequentiel lesen willst, mußt Du vom ersten bis vorletzten Byte 
das Bit TWEA im Register TWCR auf 1 setzen damit ACK erkannt wird. Beim 
letzten Byte ist dann TWEA 0 und die Übertragung endet.

Autor: hsemken (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das macht die Schleife in der Procyon lib ja auch: alle bytes bis 
auf das letzte werden mit derselben Funktion gelesen, das letzte dann 
ausserhalb der Schleife, wobei eben nur kein ACK gesendet wird.

Aber wieso funktioniert das nicht mit >1 Byte?

Moment, mir fällt grad auf, dass ja bei Len=1 immer nur mit NACK gelesen 
wird, ist das der Grund? geht das eventuell einfach gar nicht mir ACK?

Danke für die Idee, dsa probiere ich morgen mal durch.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.