Forum: Compiler & IDEs [S] I2C-Lib auf Interrupt-Basis


von N.G. (Gast)


Lesenswert?

Hallo Forum,

Ich wollte fragen, ob es eine gute TWI-Master-Lib gibt, die mit den 
Interrupts des AVR arbeitet (ein ATmega2560, sollte aber egal sein, da 
die Register bei allen(?) AVRs gleich ist, sonst muss ich halt noch mit 
dem Praeprozessor etwas anpassen). Eigentlich könnte ich den Code auch 
selber schreiben, aber warum das Rad neu erfinden? Und es würde mir vor 
allem sehr viel Zeit beim proggen und testen sparen.

Mein jetziger Code ist zT mit while-Schleifen, und diese Wartezeit würde 
ich mir gerne sparen, da ich gerade einen Roboter baue, der in Echtzeit 
auf Ereignisse reagieren soll

Also, hat jmd einen Link oÄ. Für mich?

mfG
N.G.

von Karl H. (kbuchegg)


Lesenswert?

Hmm. Interessanter Weise konnte ich auf die schnelle nichts in C finden, 
obwohl das eigentlich nicht so das große Problem sein sollte eine 
State-Machine in der TWI-ISR hochzuziehen.

Der Link hier
Beitrag "[ASM] Hardware TWI-MASTER Interrupt basierend für Mega AVR"
scheint momentan der beste zu sein, auch wenn es da um Assembler geht.
Der Autor hat da ein potentielles Problem entdeckt, darum poste ich den 
Link trotzdem

von Karl H. (kbuchegg)


Lesenswert?

Das hier
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=31371
scheint auch ein guter Anfangspunkt für weitere Recherchen zu sein.

Die Atmel AppNote klingt recht viel versprechend.

von Oliver S. (oliverso)


Lesenswert?

Komisch, irgendwie dachte ich immer, daß die lib von Peter Fleury sowas 
wie der defacto-Standard ist, und google die garantiert findet.

Was genau passt dir daran nicht?

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Oliver S. schrieb:
> Komisch, irgendwie dachte ich immer, daß die lib von Peter Fleury sowas
> wie der defacto-Standard ist, und google die garantiert findet.

An die hatte ich auch als erstes gedacht.

> Was genau passt dir daran nicht?

Sie ist nicht interrupt basiert.

von Oliver S. (oliverso)


Lesenswert?

Tja, wo du recht hast, hast du recht...

Oliver

von N.G. (Gast)


Lesenswert?

Erst einmal danke für eure Antworten

Ich befinde mich gerade auf Klassenfahrt, deswegen kann ich mir den 
ASM-Code erst später ansehen.
Die Li von Fleury kannte ich, ich habe diese auch schon benutzt, aber 
wie oben schon genannt wurde greift diese eben nicht auf den Interrupt 
zurück

Ich suche auch auch nochmal ein bisschen

mfG
N.G.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Genau dieselbe Suche hatte ich vor ca. einem Jahr auch, auch mehr oder 
weniger erfolglos. Ich hab mir dann meine eigene Implementierung 
gemacht, getrennt nach Master und Slave, basierend auf den beiden 
AppNotes von Amtel. Eingesetzt in vielen verschiedenen Projektchen, bis 
jetzt problemlos. Etwas unvollständig (Restart fehlt, hatte ich bisher 
nicht gebraucht)

Soll  ich mich trauen das hier hochzuladen?

von Marcus P. (marc2100)


Lesenswert?

Hi,
an einer Interrupt-Lösung die schon funktioniert, wäre ich auch 
interessiert.
Ich finde du solltest es hochladen ;)

Gruß
Marcus

von Michael R. (Firma: Brainit GmbH) (fisa)


Angehängte Dateien:

Lesenswert?

Also gut...

keine "Library" im herkömmlichen Sinn, nur zwei Files: i2c_master.c und 
.h, einfach ins Projektverzeichnis kopieren, ins Makefile aufnehmen.

Einfaches (nicht getestetes) main um die Verwendung zu illustrieren.

Hinweis: in der zentralen state machine (großes switch-statement) habe 
ich  ganz bewusst die symbolischen Konstanten aus der util/twi.h 
verzichtet (z.B. TW_MR_DATA_NACK), ganz einfach weil im Datenblatt immer 
die Hex-Zahl angeführt ist. Beim Entwickeltn/Debuggen dauernd händisch 
hin- und her-übersetzen ist mir irgendwann zu mühsam geworden....

Nachtrag: Der Code ist zwar interrupt-basiert, die eigentlichen Routinen 
i2c_get() und i2c_put() warten aber bis die Übertragung fertig ist 
(eigentlich wartet die i2c_start() ) Das sollte sich aber leicht 
anpassen lassen, allerdings wird das Error-handling und eventuelles 
retry dann etwas komplexer... meine "Slave-Library" arbeitet da etwas 
anders (ist am Slave aber auch einfacher...)



Was auf jeden Fall fehlt: Restart und Multi-master

kritische aber konstruktive Kommentare sehr erwünscht!

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.