ATMEGA16: Feststellen ob der TWI gerade in Benutzung ist ...

Aug 14, 2005 6 Replies

Hi NG, bie meinem ATMEGA16 wird intensiv der TWI genutzt.



Insbesondere erfolgt alle 100ms ein Interrupt und in der Interrupt-Routine wird wiedrum auch der TWI genutzt. Es ist also möglich, dass während der Übertragung (es werden immer viele Bytes an ein LCD-Display übertragen) der Interrupt kommt und der ATMEGA den TWI für etwas anderes nutzen will. Ich störe also gelegentlich eine laufende Übertragung.



Wie kann ich nun feststellen ob sich der TWI gerade in Benutzunng befindet ? Aktuell benutze ich eine globale Variable, die den Status wiedergibt.



Kann ich auch den TWSR benutzen ? Der STatus code $F8 erschien mir geeignet - er besagt wohl "nothing to do". Das Manual hört sich allerdings so an, als könne der TWSR auch zwischendrin diesen Code annehmen, obwohl der Übertragungsvorgang läuft.



Hat jemand eine Idee ?



Gruss Nico


"Nicolas Nickisch" schrieb im Newsbeitrag news:42fed93f$0$6989$ snipped-for-privacy@newsread2.arcor-online.net...

semophores

-- Manfred Winterhoff, reply-to invalid, use mawin at despammed.com homepage:

formatting link
de.sci.electronics FAQ:
formatting link
Read 'Art of Electronics' Horowitz/Hill before you ask. Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.

cli(); ... ; sei(); um den entsprechenden Block?

Jan

Meinst du Semaphoren? Die sind aber doch eher für gegenseitigen Ausschluß gedacht. Ich denke, das blockierende Verhalten der P() Operation ist hier auch nicht gewünscht.

Gruß, Johannes

Ich glaube, die Idee mit den Semaphoren ist noch am realistischsten Ich werde es mal probieren. Vielen Dank erstmal

"Jan Dittmer" schrieb im Newsbeitrag news: snipped-for-privacy@ppp0.net...

Hmm, muss man um beim Atmel Semaphoren zu realisieren nicht auch Interrupts abschalten (sei, cli), weil der keine 'test and inc/dec' Instruktion hat? Ich habe zumindest in dem Instruction Set [1] nichts derartiges gefunden und auch avrX [2] schaltet Interrupts ab um das zu machen. Du kannst ja sonst auch selektiv den einen stoerenden Interrupt abschalten und nicht alle.

Jan

[1]
formatting link
[2]
formatting link

"Nicolas Nickisch" schrieb:

Nach der Benutzung einfach TWEN ausschalten, dann kannst du das testen.

cheers, J"org .-.-. --... ...-- -.. . DL8DTL http://www.sax.de/~joerg/ NIC: JW11-RIPE Never trust an operating system you don't have sources for. ;-)

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required