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

N

Nicolas Nickisch

Guest
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" <nicolas.nickisch@gmx.de> schrieb im Newsbeitrag
news:42fed93f$0$6989$9b4e6d93@newsread2.arcor-online.net...
Wie kann ich nun feststellen ob sich der TWI gerade in Benutzunng befindet ?

semophores
--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
 
Nicolas Nickisch wrote:
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 ?
cli(); ... ; sei(); um den entsprechenden Block?

Jan
 
MaWin wrote:
"Nicolas Nickisch" <nicolas.nickisch@gmx.de> schrieb im Newsbeitrag
news:42fed93f$0$6989$9b4e6d93@newsread2.arcor-online.net...

Wie kann ich nun feststellen ob sich der TWI gerade in Benutzunng befindet ?

semophores
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" <jdittmer@ppp0.net> schrieb im Newsbeitrag
news:42FF1AF5.8070506@ppp0.net...
Nicolas Nickisch wrote:
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 ?

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

Jan
 
Nicolas Nickisch wrote:
Ich glaube, die Idee mit den Semaphoren ist noch am realistischsten
Ich werde es mal probieren.
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] http://www.atmel.com/dyn/resources/prod_documents/DOC0856.PDF
[2] http://www.barello.net/avrx/overview.htm
 
"Nicolas Nickisch" <nicolas.nickisch@gmx.de> schrieb:

Ich glaube, die Idee mit den Semaphoren ist noch am realistischsten
Ich werde es mal probieren.
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. ;-)
 

Welcome to EDABoard.com

Sponsor

Back
Top