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
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
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);
}