Буратино 0 12 апреля, 2011 Опубликовано 12 апреля, 2011 (изменено) · Жалоба 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); } ... Вроде как не первый раз использую этот код, но что-то не едут лыжи:( Выполняется несколько итераций (по количеству байт в буфере передатчика), при этом на выводе Тх ничего нет, потом все умирает совсем. Шо делать? :) Изменено 12 апреля, 2011 пользователем Буратино Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба Уж не знаю как в m32u4 (нет под рукой DS), но в m32 регистры UCSRC и UBRRH - совмещены (различаются битом URSEL). Может и в Вашем Мк так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба Уж не знаю как в 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба /* Set baud rate */ UBRRHn = (unsigned char)(baud>>8); UBRRLn = (unsigned char)baud; Обратите внимание на порядок Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба Обратите внимание на порядок Изменил порядок, но к сож. не пашет:( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба А глобальное разрешение прерываний не забыли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 12 апреля, 2011 Опубликовано 12 апреля, 2011 (изменено) · Жалоба Все ,разрулил. сейчас расскажу #pragma vector=USART1_TX_vect заменил на #pragma vector=USART1_UDRE_vect :rolleyes: Всем спасибо!, така краса.. :)))0 Изменено 12 апреля, 2011 пользователем Буратино Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба INT08U UARTReceiveByte (void) { INT08U temp1=UART_RxHead, temp2=UART_RxTail; while (temp1 == temp2) { }; Иззюмительный кусок кода! :1111493779: Повесить МК можно и гораздо проще! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба Иззюмительный кусок кода! :1111493779: Повесить МК можно и гораздо проще! нормально все там, а если че то можно через некоторое время выпрыгивать из этого ожидания. Посмотрите, там даже место оставлено для этих целей:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба нормально все там, а если че то можно через некоторое время выпрыгивать из этого ожидания. Посмотрите, там даже место оставлено для этих целей:)Да ну? С чего это оно 'выпрыгнет' из while цикла? У вас же там сравниваются локальные копии volatile переменных (из temp1 и temp2). Если они окажутся равными на входе в цикл, то цикл никогда не кончится Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба Да ну? С чего это оно 'выпрыгнет' из while цикла? У вас же там сравниваются локальные копии volatile переменных (из temp1 и temp2). Если они окажутся равными на входе в цикл, то цикл никогда не кончится хм, а и правда нехорошо. Я так сделал ибо компилятор ругался на сравнение volatile переменных. Ну и че делать? Может быть внутри операторного блока цикла ,переменным temp1, temp2 присваивать значения volatile переменных? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Я так сделал ибо компилятор ругался на сравнение volatile переменных.Это он не прав Ну и че делать? Может быть внутри операторного блока цикла ,переменным temp1, temp2 присваивать значения volatile переменных? Достаточно одной временной переменной INT08U temp1=UART_RxHead; while (temp1 == UART_RxTail) { temp1=UART_RxHead; }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба хм, а и правда нехорошо. Я так сделал ибо компилятор ругался на сравнение volatile переменных. Именно ругался, а не предупреждал о том, что ничего не знает об их поведении? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться