Datasheet

in r16, UDR0
ret
C Code Example
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR0;
}
For I/O registers located in extended I/O map, “IN”, “OUT”, “SBIS”, “SBIC”, “CBI”, and “SBI” instructions
must be replaced with instructions that allow access to extended I/O. Typically “LDS” and “STS”
combined with “SBRS”, “SBRC”, “SBR”, and “CBR”.
The function simply waits for data to be present in the receive buffer by checking the RXC flag, before
reading the buffer and returning the value.
24.8.2 Receiving Frames with 9 Data Bits
If 9-bit characters are used (UCSZn=7) the ninth bit must be read from the RXB8 bit in UCSRnB before
reading the low bits from the UDRn. This rule applies to the FE, DOR and UPE Status flags as well. Read
status from UCSRnA, then data from UDRn. Reading the UDRn I/O location will change the state of the
receive buffer FIFO and consequently the TXB8, FE, DOR and UPE bits, which all are stored in the FIFO,
will change.
The following code example shows a simple receive function for USART0 that handles both nine-bit
characters and the status bits. For the assembly code, the received data will be stored in R17:R16 after
the code completes.
Assembly Code Example
USART_Receive:
; Wait for data to be received
in r16, UCSR0A
sbrs r16, RXC
rjmp USART_Receive
; Get status and 9th bit, then data from buffer
in r18, UCSR0A
in r17, UCSR0B
in r16, UDR0
; If error, return -1
andi r18,(1<<FE)|(1<<DOR)|(1<<UPE)
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
unsigned int USART_Receive( void )
{
unsigned char status, resh, resl;
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC)) )
;
ATmega328PB
USART - Universal Synchronous Asynchronous R...
© 2018 Microchip Technology Inc.
Datasheet Complete
DS40001906C-page 271