<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title> words/usart.asm </title><meta name="keywords" content="amforth programming language Forth ATmega ATMEL"><meta name="description" content="amforth - laguage Forth for ATMEL ATmega"><!-- AUTOINCLUDE START "Page/Head.en.ihtml" DO NOT REMOVE --><link rel="StyleSheet" href="../../../../Web/CSS/MLAB.css" type="text/css" title="MLAB Basic Style"><link rel="StyleSheet" href="../../../../Web/CSS/MLAB_Print.css" type="text/css" media="print"><link rel="shortcut icon" type="image/x-icon" href="../../../../Web/PIC/MLAB.ico"><script type="text/javascript" src="../../../../Web/JS/MLAB_Menu.js"></script><!-- AUTOINCLUDE END --></head><body lang="en"><!-- AUTOINCLUDE START "Page/Header.en.ihtml" DO NOT REMOVE --><!-- ============== HEADER ============== --><div class="Header"><script type="text/javascript"><!--SetRelativePath("../../../../");DrawHeader();// --></script><noscript><p><b> JavaScript is required for including of the header </b></p></noscript></div><!-- AUTOINCLUDE END --><!-- AUTOINCLUDE START "Page/Menu.en.ihtml" DO NOT REMOVE --><!-- ============== MENU ============== --><div class="Menu"><script type="text/javascript"><!--SetRelativePath("../../../../");DrawMenu();// --></script><noscript><p><b> JavaScript is required for including of the menu </b><p></noscript></div><!-- AUTOINCLUDE END --><!-- ============== TEXT ============== --><div class="Text"><h1> words/usart.asm </h1><p><input type=button onClick="history.back()" value="Back"><input type=button onClick="history.forward()" value="Forward"><a href="../WordList.en.html">Jump to Vocabulary</a></p><pre>;;; usart driver;; bit definitions.set pc_ = pc.org URXCaddrrjmp usart0_rx_isr.org UDREaddrrjmp usart0_udre_isr.org pc_; sizes have to be powers of 2!.equ usart0_tx_size = $10.equ usart0_rx_size = $10.equ usart0_tx_mask = usart0_tx_size - 1.equ usart0_rx_mask = usart0_rx_size - 1.set usart0_tx_in = heap.set heap = heap + 1.set usart0_tx_out = heap.set heap = heap + 1.set usart0_tx_data = heap.set heap = heap + usart0_tx_size.set usart0_rx_in = heap.set heap = heap + 1.set usart0_rx_out = heap.set heap = heap + 1.set usart0_rx_data = heap.set heap = heap + usart0_rx_size; ( -- v) System Value; R( -- ); returns usart0 baudrateVE_BAUD0:.db 05,"baud0".dw VE_HEAD.set VE_HEAD = VE_BAUD0XT_BAUD0:.dw PFA_DOVALUEPFA_BAUD00: ; ( -- ).dw 10; ( -- ) Hardware Access; R( --); initialize usart0VE_USART0:.db $06, "usart0",0.dw VE_HEAD.set VE_HEAD = VE_USART0XT_USART0:.dw DO_COLONPFA_USART0: ; ( -- ).dw XT_ZERO.dw XT_DOLITERAL.dw usart0_tx_in.dw XT_CSTORE.dw XT_ZERO.dw XT_DOLITERAL.dw usart0_tx_out.dw XT_CSTORE.dw XT_ZERO.dw XT_DOLITERAL.dw usart0_rx_in.dw XT_CSTORE.dw XT_ZERO.dw XT_DOLITERAL.dw usart0_rx_out.dw XT_CSTORE.dw XT_F_CPU.dw XT_D2SLASH.dw XT_D2SLASH.dw XT_D2SLASH.dw XT_D2SLASH.dw XT_ROT.dw XT_UMSLASHMOD.dw XT_SWAP.dw XT_DROP.dw XT_1MINUS.dw XT_DUP.dw XT_DOLITERAL.dw BAUDRATE0_LOW.dw XT_CSTORE.dw XT_BYTESWAP.dw XT_DOLITERAL.dw BAUDRATE0_HIGH.dw XT_CSTORE.dw XT_DOLITERAL.dw (1<<UMSEL01)|(3<<UCSZ00).dw XT_DOLITERAL.dw USART0_C.dw XT_CSTORE.dw XT_DOLITERAL.dw (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0).dw XT_DOLITERAL.dw USART0_B.dw XT_CSTORE.dw XT_EXITusart0_udre_isr:push xlin xl,SREGpush xlpush xhpush zlpush zhlds xl,usart0_tx_inlds xh,usart0_tx_outcp xh,xlbrne usart0_udre_nextusart0_udre_last:lds xl, USART0_Bcbr xl,(1<<UDRIE0)sts USART0_B,xlrjmp usart0_udre_doneusart0_udre_next:inc xhandi xh,usart0_tx_masksts usart0_tx_out,xhldi zl,low(usart0_tx_data)ldi zh,high(usart0_tx_data)add zl,xhadc zh,zerohld xl,zout_ UDR0,xlusart0_udre_done:pop zhpop zlpop xhpop xlout SREG,xlpop xlreti;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;usart0_rx_isr:push xlin xl, SREGpush xlpush xhpush zlpush zhlds xl,usart0_rx_ininc xlandi xl,usart0_rx_maskldi zl, low(usart0_rx_data)ldi zh, high(usart0_rx_data)add zl, xladc zh, zerohin_ xh, UDR0st Z, xhsts usart0_rx_in, xlpop zhpop zlpop xhpop xlout SREG, xlpop xlreti; (c -- ) Hardware Access; R( --); put 1 character into output queue, wait if needed, enable UDRIE0 interruptVE_TX0:.db $03, "tx0".dw VE_HEAD.set VE_HEAD = VE_TX0XT_TX0:.dw DO_COLONPFA_TX0:; wait for queue.dw XT_TX0Q.dw XT_DOCONDBRANCH.dw PFA_TX0; append to queue.dw XT_DOLITERAL.dw usart0_tx_in.dw XT_CFETCH ; ( -- c tx_in).dw XT_1PLUS.dw XT_DOLITERAL.dw usart0_tx_mask.dw XT_AND ; ( -- c tx_in_new).dw XT_DUP.dw XT_DOLITERAL.dw usart0_tx_in.dw XT_CSTORE.dw XT_DOLITERAL.dw usart0_tx_data ; ( -- c tx_in_new data).dw XT_PLUS.dw XT_CSTORE; enable interrupt.dw XT_DOLITERAL.dw USART0_B.dw XT_DUP ;.dw XT_CFETCH.dw XT_DOLITERAL.dw 1<<UDRIE0.dw XT_OR.dw XT_SWAP.dw XT_CSTORE.dw XT_EXIT; ( -- f) Hardware Access; R( --); check if a character can be appended to output queue.VE_TX0Q:.db $04, "tx0?",0.dw VE_HEAD.set VE_HEAD = VE_TX0QXT_TX0Q:.dw DO_COLONPFA_TX0Q:.dw XT_PAUSE.dw XT_DOLITERAL.dw usart0_tx_out.dw XT_CFETCH.dw XT_DOLITERAL.dw usart0_tx_in.dw XT_CFETCH.dw XT_EQUAL.dw XT_EXIT; ( -- c) Hardware Access; R( --); get 1 character from input queue, wait if neededVE_RX0:.db $03, "rx0".dw VE_HEAD.set VE_HEAD = VE_RX0XT_RX0:.dw DO_COLONPFA_RX0:.dw XT_RX0Q.dw XT_DOCONDBRANCH.dw PFA_RX0.dw XT_DOLITERAL.dw usart0_rx_out.dw XT_CFETCH.dw XT_1PLUS.dw XT_DOLITERAL.dw usart0_rx_mask.dw XT_AND.dw XT_DUP.dw XT_DOLITERAL.dw usart0_rx_out.dw XT_CSTORE.dw XT_DOLITERAL.dw usart0_rx_data.dw XT_PLUS.dw XT_CFETCH.dw XT_EXIT; ( -- f) Hardware Access; R( --); check if unread characters are in the input queue.VE_RX0Q:.db $04, "rx0?",0.dw VE_HEAD.set VE_HEAD = VE_RX0QXT_RX0Q:.dw DO_COLONPFA_RX0Q:.dw XT_PAUSE.dw XT_DOLITERAL.dw usart0_rx_out.dw XT_CFETCH.dw XT_DOLITERAL.dw usart0_rx_in.dw XT_CFETCH.dw XT_NOTEQUAL.dw XT_EXIT</pre><p><input type=button onClick="history.back()" value="Back"><input type=button onClick="history.forward()" value="Forward"><a href="../WordList.en.html">Jump to Vocabulary</a></p></div><!-- AUTOINCLUDE START "Page/Footer.en.ihtml" DO NOT REMOVE --><!-- ============== FOOTER ============== --><div class="Footer"><script type="text/javascript"><!--SetRelativePath("../../../../");DrawFooter();// --></script><noscript><p><b> JavaScript is required for including of the footer </b></p></noscript></div><!-- AUTOINCLUDE END --></body></html>