188
7679H–CAN–08/08
AT90CAN32/64/128
The following code example shows a simple USART0 receive function that handles both nine bit
characters and the status bits.
Note: 1. The example code assumes that the part specific header file is included.
The receive function example reads all the I/O Registers into the Register File before any com-
putation 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)
USART0_Receive:
; Wait for data to be received
lds r18, UCSR0A
sbrs r18, RXC0
rjmp USART0_Receive
; Get status and 9th bit, then data from buffer
lds r17, UCSR0B
lds r16, UDR0
; If error, return -1
andi r18, (1<<FE0) | (1<<DOR0) | (1<<UPE0)
breq USART0_ReceiveNoError
ldi r17, HIGH(-1)
ldi r16, LOW(-1)
USART0_ReceiveNoError:
; Filter the 9th bit, then return
lsr r17
andi r17, 0x01
ret
C Code Example
(1)
unsigned int USART0_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 = UDR0;
/* 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);
}