146
ATmega8515(L)
2512K–AVR–01/10
Note:
The receive function example reads all the I/O Registers into the Register File before
any computation is done. This gives an optimal receive buffer utilization since the buffer
location read will be free to accept new data as early as possible.
Assembly Code Example
USART_Receive:
; Wait for data to be received
sbis
UCSRA, RXC
rjmp
USART_Receive
; Get status and ninth bit, then data from buffer
in
r18, UCSRA
in
r17, UCSRB
in
r16, UDR
; If error, return -1
andi
r18,(1<<FE)|(1<<DOR)|(1<<PE)
breq
USART_ReceiveNoError
ldi
r17, HIGH(-1)
ldi
r16, LOW(-1)
USART_ReceiveNoError:
; Filter the ninth bit, then return
lsr
r17
andi
r17, 0x01
ret
C Code Example
unsigned int
USART_Receive( void )
{
unsigned char
status, resh, resl;
/* Wait for data to be received */
while
( !(UCSRA & (1<<RXC)) )
;
/* Get status and ninth bit, then data */
/* from buffer */
status = UCSRA;
resh = UCSRB;
resl = UDR;
/* If error, return -1 */
if
( status & (1<<FE)|(1<<DOR)|(1<<PE) )
return
-1;
/* Filter the ninth bit, then return */
resh = (resh >> 1) & 0x01;
return
((resh << 8) | resl);
}