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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Не могу заставить работать UART по прерываниям на ATXMega128A1, В GCC всё работает в IAR не могу :(
Spider
сообщение Dec 2 2009, 08:05
Сообщение #1


В поисках истины
***

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



Всем привет.

За основу взят AVR1307. Там 2 примера, один по прерываниям, второй по опросу. Так вот тот что с прерываниями не работает. Кроме того, я не первый день работаю с AVR, но до этого всё на GCC, и там у меня всё работает. Вот решил освоить IAR и вот sad.gif

Помогите, может в IAR что-то как-то особенно должно быть? (хотя в AVR1307 пример именно для IAR)
Go to the top of the page
 
+Quote Post
Shtirlits
сообщение Dec 2 2009, 08:20
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 845
Регистрация: 18-10-04
Из: Pereslavl-Zalessky, Russian Federation
Пользователь №: 905



В разных компиляторах по-разному оформляются функции прерывания и прочие абсолютно необходимые вещи, которых нет в стандарте языка. Раз дело не в железе, то начинать нужно с документации на эти #pragma.
Если можно, то текст в студию!
Go to the top of the page
 
+Quote Post
Spider
сообщение Dec 2 2009, 12:31
Сообщение #3


В поисках истины
***

Группа: Свой
Сообщений: 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 байта и всё.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 2 2009, 12:41
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Нифига они не одинаковые.
И что такое USART_TXBuffer_PutByte()?
Хотя нет, похожи...

Случайно в цикле не зависает?
В ИАРе у меня лично с if-ами были глюки.
После того как разобрался, всегда все условия писал в явном виде.
Попробуйте оттрассировать.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Spider
сообщение Dec 2 2009, 12:44
Сообщение #5


В поисках истины
***

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



Цитата(MrYuran @ Dec 2 2009, 18:41) *
Нифига они не одинаковые.
И что такое USART_TXBuffer_PutByte()?
Хотя нет, похожи...

А что в корне разного? Мож я чего не понимаю или пропустил.
Это функа из uart_driver из AVR1307.
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 2 2009, 14:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А где у вас определен EOF? И покажите прототип USART_TXBuffer_PutByte. Возможно у вас проблемы с неявным приведением типов.
Go to the top of the page
 
+Quote Post
Spider
сообщение Dec 2 2009, 14:26
Сообщение #7


В поисках истины
***

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



EOF в stdio.h

bool USART_TXBuffer_PutByte(USART_data_t * usart_data, uint8_t data);
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 2 2009, 15:39
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Возьмите и приведите к вменяемому типу параметры и возвращаемые значения - хоть так
Код
int putchar (uint8_t data);

И расскажите, для чего нужны обертки для оберток, которые еще будут использоваться в других обертках smile.gif Кроме утечки стека, разумеется.
Go to the top of the page
 
+Quote Post
Spider
сообщение Dec 2 2009, 15:43
Сообщение #9


В поисках истины
***

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



int putchar (int data);
объявлен в stdio.h и нужен для printf()
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 2 2009, 15:53
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Alexey Belyaev @ Dec 2 2009, 19:43) *
int putchar (int data);
объявлен в stdio.h и нужен для printf()

Понятно, тогда
Код
int putchar(int data)
{
uint8_t tmp = data & 0xff;
        if (!USART_TXBuffer_PutByte(&USART_data, tmp)) return EOF;
        else return data;
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 2 2009, 22:50
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 3 2009, 00:20
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Недавно тоже делал проект на xmege в IAR. 4 UART. Прием-передача по прерываниям.
В атемловский пример смотрел исключительно для справки. Чисто удостовериться - правильно ли понимаю даташит.
А так - они какие-то бесполезные (именно что только бросить взгляд).
Но в процессе каких-либо особенностей или глюков не отметил. Тупо инициализировал, тупо расставил прерывания.
Тупо работает. Проц - реактивный, в сравнении с атмега48. Байты не считаешь, ни о чем не думаешь.

От атмела самый правильный и хороший пример - это про преодолении защиты записи в всякие защищенные регистры.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Spider
сообщение Dec 30 2009, 12:35
Сообщение #13


В поисках истины
***

Группа: Свой
Сообщений: 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 всё это работает.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 30 2009, 13:53
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Spider
сообщение Dec 31 2009, 05:51
Сообщение #15


В поисках истины
***

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



Цитата(Сергей Борщ @ Dec 30 2009, 19:53) *
У IAR два стека. В третьем примере ваш массив размещается на стеке данных. В четвертом примере стек данных занимается на сохранение регистров при вызове функции. Возможно, его размера не хватает и стек данных налезает на стек возвратов.

А есть возможность приблизить это всё к GCC, там с этим проблем никогда не было. И что это за стек такой, который переполняется уже в самом начале программы из сотни строк?
Цитата(Сергей Борщ @ Dec 30 2009, 19:53) *
P.S. и неплохо бы давать расшифровку понятия "не работает".
В 3ем сообщении последняя строка. Из UART выходит в случае с "Test" только "T" и проц как бы подвисает.
Go to the top of the page
 
+Quote Post

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

 


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


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