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

 
 
 
Reply to this topicStart new topic
> Помогите найти ошибку в коде. 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
Палыч
сообщение Apr 12 2011, 07:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Уж не знаю как в m32u4 (нет под рукой DS), но в m32 регистры UCSRC и UBRRH - совмещены (различаются битом URSEL). Может и в Вашем Мк так?
Go to the top of the page
 
+Quote Post
Буратино
сообщение Apr 12 2011, 07:36
Сообщение #3


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

Группа: Свой
Сообщений: 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);
}


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 12 2011, 07:39
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Буратино @ Apr 12 2011, 11:36) *
Код
/* Set baud rate */
UBRRHn = (unsigned char)(baud>>8);
UBRRLn = (unsigned char)baud;
Обратите внимание на порядок
Go to the top of the page
 
+Quote Post
Буратино
сообщение Apr 12 2011, 07:58
Сообщение #5


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

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



Цитата(Палыч @ Apr 12 2011, 10:39) *
Обратите внимание на порядок


Изменил порядок, но к сож. не пашетsad.gif


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 12 2011, 08:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



А глобальное разрешение прерываний не забыли?
Go to the top of the page
 
+Quote Post
Буратино
сообщение Apr 12 2011, 08:16
Сообщение #7


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

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



Все ,разрулил. сейчас расскажу

#pragma vector=USART1_TX_vect заменил на
#pragma vector=USART1_UDRE_vect rolleyes.gif

Всем спасибо!, така краса.. sm.gif))0

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


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 12 2011, 11:13
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Код
INT08U UARTReceiveByte (void) {
    INT08U temp1=UART_RxHead, temp2=UART_RxTail;

    while (temp1 == temp2) {
    };
Иззюмительный кусок кода! 1111493779.gif Повесить МК можно и гораздо проще!
Go to the top of the page
 
+Quote Post
Буратино
сообщение Apr 12 2011, 12:36
Сообщение #9


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

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



Цитата(XVR @ Apr 12 2011, 14:13) *
Иззюмительный кусок кода! 1111493779.gif Повесить МК можно и гораздо проще!


нормально все там, а если че то можно через некоторое время выпрыгивать из этого ожидания. Посмотрите, там даже место оставлено для этих целейsm.gif


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 12 2011, 12:46
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Буратино @ Apr 12 2011, 16:36) *
нормально все там, а если че то можно через некоторое время выпрыгивать из этого ожидания. Посмотрите, там даже место оставлено для этих целейsm.gif
Да ну? С чего это оно 'выпрыгнет' из while цикла? У вас же там сравниваются локальные копии volatile переменных (из temp1 и temp2). Если они окажутся равными на входе в цикл, то цикл никогда не кончится

Go to the top of the page
 
+Quote Post
Буратино
сообщение Apr 12 2011, 18:50
Сообщение #11


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

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



Цитата(XVR @ Apr 12 2011, 16:46) *
Да ну? С чего это оно 'выпрыгнет' из while цикла? У вас же там сравниваются локальные копии volatile переменных (из temp1 и temp2). Если они окажутся равными на входе в цикл, то цикл никогда не кончится


хм, а и правда нехорошо. Я так сделал ибо компилятор ругался на сравнение volatile переменных.
Ну и че делать? Может быть внутри операторного блока цикла ,переменным temp1, temp2 присваивать значения volatile переменных?


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 13 2011, 05:19
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Буратино @ Apr 12 2011, 22:50) *
Я так сделал ибо компилятор ругался на сравнение volatile переменных.
Это он не прав biggrin.gif
Цитата
Ну и че делать? Может быть внутри операторного блока цикла ,переменным temp1, temp2 присваивать значения volatile переменных?

Достаточно одной временной переменной
Код
INT08U temp1=UART_RxHead;

    while (temp1 == UART_RxTail) {
    
     temp1=UART_RxHead;
    };

Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Apr 13 2011, 07:39
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Буратино @ Apr 12 2011, 22:50) *
хм, а и правда нехорошо. Я так сделал ибо компилятор ругался на сравнение volatile переменных.

Именно ругался, а не предупреждал о том, что ничего не знает об их поведении?
Go to the top of the page
 
+Quote Post

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

 


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


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