Gast
#1840385
Hallo Leute, ich bin gerade dabei ein minimales "Multitasking" aufzubauen. Ein Task davon soll eine Kommunikation über die TWI Schnittstelle abhandeln. Die Kommunikation an sich funktioniert soweit. Zum Testen sollte mein Programm prinzipiell so aussehen: Der Slave befindet sich in einer Endlosschleife, in der er zyklisch nachsieht, ob es was zu tun gibt oder nicht. Bei einem Interrupt sichere ich mir das TWI Status Register(TWSR). Setze ein Flag, dass es jetzt etwas zu arbeiten gibt und verlasse die ISR wieder. In der Hauptschleife "sieht" der Task "jetzt gibts was zu tun" und arbeitet alle weiteren nötigen Schritte ab. Wenn er fertig ist, wartet er wiederum bis der nächste Interrupt auftritt. Soweit die Idee. Mein Problem ist aber, das nach dem Verlassen der ISR sofort wieder in die ISR gesprungen wird, und wieder und wieder.... Irgendwann kommt doch die Abarbeitung des Tasks in der Hauptschleife dran und die Kommunikation geht weiter. Ihr könnt euch vorstellen wie lange! Genau, bis zum nächsten Interrupt! In den Datenblättern ist beschreiben, dass es nach dem Interrupt die jeweilige definierte Softwareaktion auszuführen ist. Mir ist schon klar, dass der Interrupt nach dem Verlassen der ISR immer noch ansteht und das der Grund ist warum er wieder in die ISR springt. Der logische Schritt war die Interruptflags in dem TWI Control Register(TWCR) zu bearbeiten. Also TWIE usw. zurückzusetzen. Fehlanzeige! Sobald in diesem Register irgendetwas verändert wird, fühlt sich das TWI-Modul veranlasst, mit der Abarbeitung fortzufahren(z.B. den Inhalt des Adressregisters auf den Bus zu legen). Wenn das TWI Modul mir somit keine Möglichkeit lässt, selbst zu entscheiden, wann ich die weitere Abarbeitung vornehme, dann hat der Interrupt für mich nicht wirklich einen nutzen. Ich habe den Beginn der Übertragung mit dem Oszi aufgezeichnet und angehängt. Der gelbe Graph stellt die Sprünge in die ISR dar. Also jeder Flankenwechsel bedeutet einen Sprung in die ISR. Rosa ist die Datenleitung und Grün der Takt. Hat jemand eine Idee, wie ich es schaffe nach dem Verlassen der ISR nicht wieder in die ISR zu springen? Also selbst enscheiden kann, wann es weiter geht?
