реклама на сайте
подробности

 
 
> Помогите найти ошибку в коде. UART, ATMega32U4
Буратино
сообщение Apr 12 2011, 06:50
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215



main.c
Код
void main (void) {

    InitDevice ();

    while (1) {
        Delay_mSeconds(20);
        UARTTransmitByte(0x55);
    }
}


UART.c
Код
#include "global.h"
/*
********************************************************************************
*                             #DEFINE CONSTANTS
********************************************************************************
*/
#define UART_RX_BUFFER_SIZE 8
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 )
#define UART_TX_BUFFER_SIZE 8
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1 )

#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif


/*
********************************************************************************
*                             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 temp1=UART_RxHead, temp2=UART_RxTail;
    INT08U tmptail;


    while (temp1 == temp2) {
    };
    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
********************************************************************************
*/


#pragma vector=USART1_RX_vect
__interrupt void USART_Rx_isr(void) {
    INT08U data;
    INT08U tmphead;

    data = UDR1;
    tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;
    UART_RxHead = tmphead;  
    if (tmphead == UART_RxTail) {        }
    UART_RxBuf[tmphead] = data;
}


#pragma vector=USART1_TX_vect
__interrupt void USART0_Tx_interrupt( void ) {
    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);
    }
}


UART.h
Код
/*
********************************************************************************
*                             GLOBAL VARIABLE
********************************************************************************
*/
extern INT08U UART_RxBuf[];
extern volatile INT08U UART_RxHead;
extern volatile INT08U UART_RxTail;

extern INT08U UART_TxBuf[];
extern volatile INT08U UART_TxHead;
extern volatile INT08U UART_TxTail;


/*
********************************************************************************
*                        GLOBAL FUNCTION PROTOTYPES
********************************************************************************
*/
INT08U UARTDataInReceiveBuffer (void);
INT08U UARTReceiveByte (void);
void UARTTransmitByte (INT08U);

init.c
Код
...
void Init_UART (void) {
    UBRR1L = 0x0C;                                            
    UBRR1H = 0x00;                                          
    UCSR1B = (1<<RXEN1)|(1<<TXEN1)|(1<<TXCIE1)|(1<<RXCIE1)|(1<<UDRIE1);    
    UCSR1C = (1<<USBS1)|(3<<UCSZ10);                          
}
...


Вроде как не первый раз использую этот код, но что-то не едут лыжиsad.gif
Выполняется несколько итераций (по количеству байт в буфере передатчика), при этом на выводе Тх ничего нет, потом все умирает совсем.
Шо делать? sm.gif

Сообщение отредактировал Буратино - Apr 12 2011, 08:13


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016