[S] I2C-Lib auf Interrupt-Basis

Gast #3571225
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.
#3571317
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
Gast #3571588
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.
(Firma: Brainit GmbH) #3573940
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?
(Firma: Brainit GmbH) #3573947
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!
Angehängte Dateien:

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