Rainbow Electronics ATmega3290P_V User Manual
Page 172

172
ATmega329/3290/649/6490
2552H–AVR–11/06
The following code example shows a simple USART receive function that handles both
nine bit characters and the status bits.
Note:
1. See “About Code Examples” on page 8.
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
(1)
USART_Receive:
; Wait for data to be received
sbis
UCSR0A, RXC0
rjmp
USART_Receive
; Get status and 9th bit, then data from buffer
in
r18, UCSR0A
in
r17, UCSR0B
in
r16, UDRn
; If error, return -1
andi
r18,(1<<FE0)|(1<<DOR0)|(1<<UPE0)
breq
USART_ReceiveNoError
ldi
r17, HIGH(-1)
ldi
r16, LOW(-1)
USART_ReceiveNoError:
; Filter the 9th bit, then return
lsr
r17
andi
r17, 0x01
ret
C Code Example
(1)
unsigned int
USART_Receive( void )
{
unsigned char
status, resh, resl;
/* Wait for data to be received */
while
( !(UCSR0A & (1<<RXC0)) )
;
/* Get status and 9th bit, then data */
/* from buffer */
status = UCSR0A;
resh = UCSR0B;
resl = UDRn;
/* If error, return -1 */
if
( status & (1<<FE0)|(1<<DOR0)|(1<<UPE0) )
return
-1;
/* Filter the 9th bit, then return */
resh = (resh >> 1) & 0x01;
return
((resh << 8) | resl);
}