robo_wolf,
den gleichzeitigen Ablauf von Versand über die USART und Assemblerprogramms musst Du Dir vorstellen, als wären es zwei Threads unter Windows: Es sind zwei voneinander unabhängige, gleichzeitig ablaufende Vorgänge.
Wenn (in SER_TX_START) bei aktivierter USART (TXEN = 1) ein Byte ins UDR geschrieben ist, beginnt der MC, unabhängig vom Ablauf des Assemblerprogramms, das Byte über die USART hinauszutakten. Das ist wie ein eigener USART-"Thread".
Derweil läuft das Assemblerprogramm weiter, quasi im Assembler-"Thread": Es aktiviert den Interrupt (TXIE) und das globale Interrupt-Flag und kehrt ins Hauptprogramm zurück. Dort läuft es in die HS_01-Schleife.
Währenddessen hat der USRAT-"Thread" den Inhalt von UDR vollständig versandt und löst dann den "Tx_complete"-Interrupt aus. Jetzt wird der Ablauf des Assembler-"Threads" ge-interrupted und das Programm springt in das Dienstprogramm "SER_TX_INT". Wenn er sich da durchgewurschtelt hat, kehrt er wieder in die HS_01-Schleife zurück.
Wenn er innerhalb des Dienstprogramms noch ein Byte ins UDR geschrieben hat, dann läuft der USART-"Thread" munter weiter, während der Assembler-"Thread" weiter durch "SER_TX_DONE" hechelt.
War die Botschaft beendet, dann schaltet das Dienstprogramm den "Tx_complete"-Interrupt ab (TXIE=0) und setzt das "SER_TX_AKTIV"-Flag in SERCTL. Weil das UDR leer bleibt, endet hier der USART-"Thread" und der "Tx_complete"-Interrupt bleibt aus - man brauchte ihn noch nicht einmal auszuschalten.
Wenn das Assemblerprogramm nun aus dem Dienstprogramm zurückkehrt, merkt es beim nächsten Aufruf von "SER_TX_DONE", das die Botschaft vollständig verschickt wurde und läuft in die "HAUPTSCHLEIFE" weiter.
Das wichtige Konzept ist hier die "Nebenläufigkeit" von USART-Verarbeitung und Assemblerprogramm. Dieselbe Nebenläufigkeit gibt es auch z.B. bei der TWI-, der SPI-Schnittstelle, den diversen Timer/Countern, beim Lesen und Schreiben des EEPROMS und der ADC-Wandlung.
Piu ciaro?
Ciao,
mare_crisium
P.S. OT: Nach dem Spiel traut man sich kaum noch Italienisch zu schreiben !
Lesezeichen