Datasheet

179
2490R–AVR–02/2013
ATmega64(L)
Sending Frames with
9 Data Bits
If 9-bit characters are used (UCSZn = 7), the ninth bit must be written to the TXB8n bit in UCS-
RnB before the low byte of the character is written to UDRn. The following code examples show
a transmit function that handles 9-bit characters. For the assembly code, the data to be sent is
assumed to be stored in registers r17:r16.
Note: 1. These transmit functions are written to be general functions. They can be optimized if the con-
tents of the UCSRnB is static. For example, only the TXB8n bit of the UCSRnB Register is
used after initialization.
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 ninth bit can be used for indicating an address frame when using Multi-processor Communi-
cation mode or for other protocol handling as for example synchronization.
Assembly Code Example
(1)
USART_Transmit:
; Wait for empty transmit buffer
sbis UCSRnA,UDREn
rjmp USART_Transmit
; Copy ninth bit from r17 to TXB8
cbi UCSRnB,TXB8n
sbrc r17,0
sbi UCSRnB,TXB8n
; Put LSB data (r16) into buffer, sends the data
out UDRn,r16
ret
C Code Example
(1)
void USART_Transmit( unsigned int data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRnA & (1<<UDREn)) )
;
/* Copy ninth bit to TXB8 */
UCSRnB &= ~(1<<TXB8n);
if ( data & 0x0100 )
UCSRnB |= (1<<TXB8n);
/* Put data into buffer, sends the data */
UDRn = data;
}