|
Не могу заставить работать UART по прерываниям на ATXMega128A1, В GCC всё работает в IAR не могу :( |
|
|
|
Dec 2 2009, 12:31
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Оказалось что дело не в прерывании а в чём-то, непонятно в чём. Следующий код работает: Код uint8_t sendArray[NUM_BYTES] = {0x55, 0xaa, 0xf0, 0xff, 0x00, 0x11};
/* Send sendArray. */ i = 0; while (i < NUM_BYTES) { if(USART_TXBuffer_PutByte(&USART_data,sendArray[i])) i++; } и на выходе имеем последовательно 6 байт. а в принципе то же самое но вот так: Код uint8_t sendArray[NUM_BYTES] = {0x55, 0xaa, 0xf0, 0xff, 0x00, 0x11};
int putchar(int data) { if (!USART_TXBuffer_PutByte(&USART_data,data)) return EOF; else return data; }
/* Send sendArray. */ i = 0; while (i < NUM_BYTES) { if(putchar(sendArray[i])!=EOF) i++; } уже не работает. На выходе имеем первые 2 байта и всё.
|
|
|
|
|
Dec 2 2009, 12:44
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Цитата(MrYuran @ Dec 2 2009, 18:41)  Нифига они не одинаковые. И что такое USART_TXBuffer_PutByte()? Хотя нет, похожи... А что в корне разного? Мож я чего не понимаю или пропустил. Это функа из uart_driver из AVR1307.
|
|
|
|
|
Dec 2 2009, 22:50
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Alexey Belyaev @ Dec 2 2009, 19:26)  EOF в stdio.h
bool USART_TXBuffer_PutByte(USART_data_t * usart_data, uint8_t data); Попробуйте явно привести типы данных к их определениям Код if(putchar(sendArray[i])!=EOF) i++; изменить на Код if(putchar((int)(sendArray[i]))!=EOF) i++; и Код if (!USART_TXBuffer_PutByte(&USART_data,data)) return EOF; на Код if (!USART_TXBuffer_PutByte(&USART_data, (uint8_t)data)) return EOF; Хотя, если честно, мне тоже непонятны причины применения таких "оберток" для реализации функций IAP.
|
|
|
|
|
Dec 30 2009, 12:35
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Игрался с разными ситуациями с примером от атмела. И получил следующие результаты: Работает: Код /*! Test data to send. */ uint8_t sendArray[NUM_BYTES] = {0x55, 0xaa, 0xf0};
....
... main(...) { ... /* Send sendArray. */ i = 0; while (i < NUM_BYTES) { bool byteToBuffer; byteToBuffer = USART_TXBuffer_PutByte(&USART_data, sendArray[i]); if(byteToBuffer){ i++; } } ... } Тоже работает: Код uint8_t Test[]="Test";
....
... main(...) { ... i = 0; while (i < 4) { bool byteToBuffer; byteToBuffer = USART_TXBuffer_PutByte(&USART_data, Test[i]); if(byteToBuffer) i++; } ... } А следующие куски кода не работают: Код ....
... main(...) { ... uint8_t Test[]="Test";
i = 0; while (i < 4) { bool byteToBuffer; byteToBuffer = USART_TXBuffer_PutByte(&USART_data, Test[i]); if(byteToBuffer) i++; } ... } И вот этот Код uint8_t Test[]="Test";
....
void send_str(uint8_t *data) { while (*data) USART_TXBuffer_PutByte(&USART_data,*data++); }
... main(...) { ... send_str(Test); ... } Что не так то? в GCC всё это работает.
|
|
|
|
|
Dec 30 2009, 13:53
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Alexey Belyaev @ Dec 30 2009, 14:35)  Что не так то? в GCC всё это работает. У IAR два стека. В третьем примере ваш массив размещается на стеке данных. В четвертом примере стек данных занимается на сохранение регистров при вызове функции. Возможно, его размера не хватает и стек данных налезает на стек возвратов. P.S. и неплохо бы давать расшифровку понятия "не работает".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 31 2009, 05:51
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Цитата(Сергей Борщ @ Dec 30 2009, 19:53)  У IAR два стека. В третьем примере ваш массив размещается на стеке данных. В четвертом примере стек данных занимается на сохранение регистров при вызове функции. Возможно, его размера не хватает и стек данных налезает на стек возвратов. А есть возможность приблизить это всё к GCC, там с этим проблем никогда не было. И что это за стек такой, который переполняется уже в самом начале программы из сотни строк? Цитата(Сергей Борщ @ Dec 30 2009, 19:53)  P.S. и неплохо бы давать расшифровку понятия "не работает". В 3ем сообщении последняя строка. Из UART выходит в случае с "Test" только "T" и проц как бы подвисает.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|