У меня работает ....
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено albor 28 января 2005 г. 18:39
В ответ на: USART AVR !!!!!!!! отправлено Spark 28 января 2005 г. 13:04

includes */
#include
#include

/* UART Control Register Bit Definitions */
#define RXCIE 7
#define TXCIE 6
#define UDRIE 5
#define RXEN 4
#define TXEN 3
#define CHR9 2
#define RXB8 1
#define TXB8 0
/* UART Status Register Bit Definitions */
#define RXC 7
#define TXC 6
#define UDRE 5
#define FE 4
#define OVR 3
/* UART Buffer Defines */
#define UART_RX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 )
#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif
#define UART_TX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1 )
#if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )
#error TX buffer size is not a power of 2
#endif

/* Static Variables */
//unsigned int Flags;

static unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
static volatile unsigned char UART_RxHead;
static volatile unsigned char UART_RxTail;
static unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
static volatile unsigned char UART_TxHead;
static volatile unsigned char UART_TxTail;
/* Prototypes */
void InitUART( unsigned char baudrate );
unsigned char ReceiveByte( void );
void TransmitByte( unsigned char data );
/***********************************************************************/
/* initialize UART */
void InitUART( unsigned char baudrate )
{
unsigned char x;
UBRRH = 0; /* set the baud rate */
UBRRL = baudrate; /* set the baud rate */
/* enable UART receiver and transmitter, and receive interrupt */
UCSRA |= (1< UCSRB = ( (1< x = 0; /* flush receive buffer */
UART_RxTail = x;
UART_RxHead = x;
UART_TxTail = x;
UART_TxHead = x;
}


/* interrupt handlers */
#pragma vector=USART_RXC_vect
__interrupt void UART_RX_interrupt( void )
{
unsigned char data;
unsigned char tmphead;
data = UDR; /* read the received data */
/* calculate buffer index */
tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;
UART_RxHead = tmphead; /* store new index */
if ( tmphead == UART_RxTail )
{
/* ERROR! Receive buffer overflow */
}
UART_RxBuf[tmphead] = data; /* store received data in buffer */
}


#pragma vector=USART_UDRE_vect
__interrupt void UART_TX_interrupt( void )
{
unsigned char tmptail;
/* check if all data is transmitted */
if ( UART_TxHead != UART_TxTail )
{
/* calculate buffer index */
tmptail = ( UART_TxTail + 1 ) & UART_TX_BUFFER_MASK;
UART_TxTail = tmptail; /* store new index */
UDR = UART_TxBuf[tmptail]; /* start transmition */
}
else
{
UCSRB &= ~(1< }
}


/* Read and write functions */
unsigned char ReceiveByte( void )
{ unsigned char a;
unsigned char tmptail;
while ( UART_RxHead == UART_RxTail ) /* wait for incomming data */;
tmptail = ( UART_RxTail + 1 ) & UART_RX_BUFFER_MASK;/* calculate buffer index */
UART_RxTail = tmptail; /* store new index */
a = UART_RxBuf[tmptail];
// if (Flag(0)) TransmitByte(a);
return (a); /* return data */
}

void TransmitByte( unsigned char data )
{
unsigned char tmphead;
/* calculate buffer index */
tmphead = ( UART_TxHead + 1 ) & UART_TX_BUFFER_MASK; /* wait for free space in buffer */
while ( tmphead == UART_TxTail );
UART_TxBuf[tmphead] = data; /* store data in buffer */
UART_TxHead = tmphead; /* store new index */
UCSRB |= (1<}

unsigned char CheckInBuffer( void )
{
return ( UART_RxHead != UART_RxTail ); /* return 0 (FALSE) if the receive buffer is empty */
}

unsigned char CheckOutBuffer( void )
{
return ( UART_TxHead != UART_TxTail ); /* return 0 (FALSE) if the transmit buffer is empty */
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru