0,0 → 1,379 |
<!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 URXCaddr |
rjmp usart0_rx_isr |
.org UDREaddr |
rjmp 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 baudrate |
VE_BAUD0: |
.db 05,"baud0" |
.dw VE_HEAD |
.set VE_HEAD = VE_BAUD0 |
XT_BAUD0: |
.dw PFA_DOVALUE |
PFA_BAUD00: ; ( -- ) |
.dw 10 |
|
; ( -- ) Hardware Access |
; R( --) |
; initialize usart0 |
VE_USART0: |
.db $06, "usart0",0 |
.dw VE_HEAD |
.set VE_HEAD = VE_USART0 |
XT_USART0: |
.dw DO_COLON |
PFA_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_EXIT |
|
usart0_udre_isr: |
push xl |
in xl,SREG |
push xl |
push xh |
push zl |
push zh |
|
lds xl,usart0_tx_in |
lds xh,usart0_tx_out |
|
cp xh,xl |
brne usart0_udre_next |
|
usart0_udre_last: |
lds xl, USART0_B |
cbr xl,(1<<UDRIE0) |
sts USART0_B,xl |
|
rjmp usart0_udre_done |
|
usart0_udre_next: |
inc xh |
andi xh,usart0_tx_mask |
sts usart0_tx_out,xh |
|
ldi zl,low(usart0_tx_data) |
ldi zh,high(usart0_tx_data) |
add zl,xh |
adc zh,zeroh |
|
ld xl,z |
out_ UDR0,xl |
|
usart0_udre_done: |
pop zh |
pop zl |
pop xh |
pop xl |
out SREG,xl |
pop xl |
reti |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
usart0_rx_isr: |
push xl |
in xl, SREG |
push xl |
push xh |
push zl |
push zh |
|
lds xl,usart0_rx_in |
inc xl |
andi xl,usart0_rx_mask |
|
ldi zl, low(usart0_rx_data) |
ldi zh, high(usart0_rx_data) |
add zl, xl |
adc zh, zeroh |
in_ xh, UDR0 |
st Z, xh |
sts usart0_rx_in, xl |
|
pop zh |
pop zl |
pop xh |
pop xl |
out SREG, xl |
pop xl |
reti |
|
; (c -- ) Hardware Access |
; R( --) |
; put 1 character into output queue, wait if needed, enable UDRIE0 interrupt |
VE_TX0: |
.db $03, "tx0" |
.dw VE_HEAD |
.set VE_HEAD = VE_TX0 |
XT_TX0: |
.dw DO_COLON |
PFA_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_TX0Q |
XT_TX0Q: |
.dw DO_COLON |
PFA_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 needed |
VE_RX0: |
.db $03, "rx0" |
.dw VE_HEAD |
.set VE_HEAD = VE_RX0 |
XT_RX0: |
.dw DO_COLON |
PFA_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_RX0Q |
XT_RX0Q: |
.dw DO_COLON |
PFA_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> |