CODE
/*
********************************************************************************
* GLOBAL FUNCTION
********************************************************************************
*/
INT08U UART_RxBuf[UART_RX_BUFFER_SIZE];
volatile INT08U UART_RxHead;
volatile INT08U UART_RxTail;
INT08U UART_TxBuf[UART_TX_BUFFER_SIZE];
volatile INT08U UART_TxHead;
volatile INT08U UART_TxTail;
INT08U UARTDataInReceiveBuffer (void) {
INT08U temp1 = UART_RxHead, temp2 = UART_RxTail;
return (temp1 != temp2);
}
INT08U UARTReceiveByte (void) {
INT08U temp=UART_RxHead;
INT08U tmptail;
while (temp == UART_RxTail) {
temp = UART_RxHead;
};
tmptail = ( UART_RxTail + 1 ) & UART_RX_BUFFER_MASK;
UART_RxTail = tmptail;
return UART_RxBuf[tmptail];
}
void UARTTransmitByte (INT08U data ) {
INT08U tmphead;
tmphead = ( UART_TxHead + 1 ) & UART_TX_BUFFER_MASK;
while ( tmphead == UART_TxTail );
UART_TxBuf[tmphead] = data;
UART_TxHead = tmphead;
UCSR1B |= (1<<UDRIE1);
}
/*
********************************************************************************
* LOCAL FUNCTION
********************************************************************************
*/
ISR(USART1_RX_vect) {
INT08U data;
INT08U tmphead;
data = UDR1;
tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;
UART_RxHead = tmphead;
if (tmphead == UART_RxTail) { /* ERROR! Receive buffer overflow */ }
UART_RxBuf[tmphead] = data;
}
ISR(USART1_UDRE_vect ) {
INT08U temp1 = UART_TxHead, temp2 = UART_TxTail;
INT08U tmptail;
if (temp1 != temp2) {
tmptail = ( UART_TxTail + 1 ) & UART_TX_BUFFER_MASK;
UART_TxTail = tmptail;
UDR1=UART_TxBuf[tmptail];
}
else {
UCSR1B &= ~(1<<UDRIE1);
}
}
********************************************************************************
* GLOBAL FUNCTION
********************************************************************************
*/
INT08U UART_RxBuf[UART_RX_BUFFER_SIZE];
volatile INT08U UART_RxHead;
volatile INT08U UART_RxTail;
INT08U UART_TxBuf[UART_TX_BUFFER_SIZE];
volatile INT08U UART_TxHead;
volatile INT08U UART_TxTail;
INT08U UARTDataInReceiveBuffer (void) {
INT08U temp1 = UART_RxHead, temp2 = UART_RxTail;
return (temp1 != temp2);
}
INT08U UARTReceiveByte (void) {
INT08U temp=UART_RxHead;
INT08U tmptail;
while (temp == UART_RxTail) {
temp = UART_RxHead;
};
tmptail = ( UART_RxTail + 1 ) & UART_RX_BUFFER_MASK;
UART_RxTail = tmptail;
return UART_RxBuf[tmptail];
}
void UARTTransmitByte (INT08U data ) {
INT08U tmphead;
tmphead = ( UART_TxHead + 1 ) & UART_TX_BUFFER_MASK;
while ( tmphead == UART_TxTail );
UART_TxBuf[tmphead] = data;
UART_TxHead = tmphead;
UCSR1B |= (1<<UDRIE1);
}
/*
********************************************************************************
* LOCAL FUNCTION
********************************************************************************
*/
ISR(USART1_RX_vect) {
INT08U data;
INT08U tmphead;
data = UDR1;
tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;
UART_RxHead = tmphead;
if (tmphead == UART_RxTail) { /* ERROR! Receive buffer overflow */ }
UART_RxBuf[tmphead] = data;
}
ISR(USART1_UDRE_vect ) {
INT08U temp1 = UART_TxHead, temp2 = UART_TxTail;
INT08U tmptail;
if (temp1 != temp2) {
tmptail = ( UART_TxTail + 1 ) & UART_TX_BUFFER_MASK;
UART_TxTail = tmptail;
UDR1=UART_TxBuf[tmptail];
}
else {
UCSR1B &= ~(1<<UDRIE1);
}
}
Код "перенаправления" вывода
Код
// прототип функции вывода символа
int my_putchar(char c, FILE *stream);
// определяем дескриптор для стандартного вывода
FILE mystdout = FDEV_SETUP_STREAM(
my_putchar, // функция вывода символа
NULL, // функция ввода символа, нам сейчас не нужна
_FDEV_SETUP_WRITE // флаги потока - только вывод
);
// функция вывода символа
int my_putchar(char c, FILE *stream)
{
UARTTransmitByte(c);
return 0;
}
int my_putchar(char c, FILE *stream);
// определяем дескриптор для стандартного вывода
FILE mystdout = FDEV_SETUP_STREAM(
my_putchar, // функция вывода символа
NULL, // функция ввода символа, нам сейчас не нужна
_FDEV_SETUP_WRITE // флаги потока - только вывод
);
// функция вывода символа
int my_putchar(char c, FILE *stream)
{
UARTTransmitByte(c);
return 0;
}
Код я перетащил из старого IAR проекта в WINAVR. Так нужно было.
Если "printf" вызываю из main - ок. Если из других модулей - перегружается проц.
Просто не понимаю даже куда смотреть. Спасибо за советы.
Не ясно еще как память посмотреть. Может быть я что то навтыкал с оперативой/стеком/кучей..
В IAR я просто в настройках проекта менял границы этих областей и иногда все разруливалось. Что делать в WinAVR совсем не понимаю.