|
|
  |
Помогите найти ошибку в коде. UART, ATMega32U4 |
|
|
|
Apr 12 2011, 06:50
|

Профессионал
    
Группа: Свой
Сообщений: 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); } ... Вроде как не первый раз использую этот код, но что-то не едут лыжи  Выполняется несколько итераций (по количеству байт в буфере передатчика), при этом на выводе Тх ничего нет, потом все умирает совсем. Шо делать?
Сообщение отредактировал Буратино - Apr 12 2011, 08:13
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Apr 12 2011, 07:36
|

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

|
Цитата(Палыч @ Apr 12 2011, 10:24)  Уж не знаю как в m32u4 (нет под рукой DS), но в m32 регистры UCSRC и UBRRH - совмещены (различаются битом URSEL). Может и в Вашем Мк так? в даташите вот таким образом инициализируется UART Код void USART_Init( unsigned int baud ) { /* Set baud rate */ UBRRHn = (unsigned char)(baud>>8); UBRRLn = (unsigned char)baud; /* Enable receiver and transmitter */ UCSRnB = (1<<RXENn)|(1<<TXENn); /* Set frame format: 8data, 2stop bit */ UCSRnC = (1<<USBSn)|(3<<UCSZn0); }
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Apr 12 2011, 08:16
|

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

|
Все ,разрулил. сейчас расскажу #pragma vector=USART1_TX_vect заменил на #pragma vector=USART1_UDRE_vect Всем спасибо!, така краса..  ))0
Сообщение отредактировал Буратино - Apr 12 2011, 08:20
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Apr 13 2011, 05:19
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Буратино @ Apr 12 2011, 22:50)  Я так сделал ибо компилятор ругался на сравнение volatile переменных. Это он не прав Цитата Ну и че делать? Может быть внутри операторного блока цикла ,переменным temp1, temp2 присваивать значения volatile переменных? Достаточно одной временной переменной Код INT08U temp1=UART_RxHead;
while (temp1 == UART_RxTail) { temp1=UART_RxHead; };
|
|
|
|
|
Apr 13 2011, 07:39
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(Буратино @ Apr 12 2011, 22:50)  хм, а и правда нехорошо. Я так сделал ибо компилятор ругался на сравнение volatile переменных. Именно ругался, а не предупреждал о том, что ничего не знает об их поведении?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|