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

 
 
 
Reply to this topicStart new topic
> проблемы с SAM7S256
Китаев Владимир
сообщение Feb 3 2009, 09:06
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 7-07-08
Из: Новомосковск, Тульская область
Пользователь №: 38 779



Здравствуйте!
Столкнулся при работе с SAM7S256 с непонятной проблемой.
Использую прерывание SYS для обработки прерываний от DBGU и RTTC. В начале все работает, происходит несколько прерываний DBGU и RTTC, а затем прерывания перестают возникать вообще, хотя галочки pending и mask все время установлены. Сама прога в этот момент вертится в бесконечном цикле в main.
Что это может быть и как это можно исправить?
Спасибо.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 3 2009, 09:09
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Китаев Владимир @ Feb 3 2009, 12:06) *
Что это может быть и как это можно исправить?

Может быть, Вы сконфигурировали источник SYS на работу по фронту.
Go to the top of the page
 
+Quote Post
Китаев Владимир
сообщение Feb 3 2009, 09:20
Сообщение #3





Группа: Новичок
Сообщений: 10
Регистрация: 7-07-08
Из: Новомосковск, Тульская область
Пользователь №: 38 779



Цитата(aaarrr @ Feb 3 2009, 12:09) *
Может быть, Вы сконфигурировали источник SYS на работу по фронту.


Нет у меня работает по уровню: AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL.
DBGU работает в режиме PDC:
Код
...
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int) IRQ_DBGU;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 6;

AT91F_PDC_Open(AT91C_BASE_PDC_DBGU);    
AT91C_BASE_DBGU->DBGU_RPR = (unsigned int) buff_rx;
AT91C_BASE_DBGU->DBGU_RCR = 40;
...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 3 2009, 09:34
Сообщение #4


Гуру
******

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



Цитата(Китаев Владимир @ Feb 3 2009, 11:20) *
DBGU работает в режиме PDC:
Покажите код обработчика прерывания SYS. Очень похоже, что в какой-то из веток вы забываете прописать AIC_EIOCR.


--------------------
На любой вопрос даю любой ответ
"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
Китаев Владимир
сообщение Feb 3 2009, 09:43
Сообщение #5





Группа: Новичок
Сообщений: 10
Регистрация: 7-07-08
Из: Новомосковск, Тульская область
Пользователь №: 38 779



Цитата(Сергей Борщ @ Feb 3 2009, 12:34) *
Покажите код обработчика прерывания SYS. Очень похоже, что в какой-то из веток вы забываете прописать AIC_EIOCR.

AIC_EIOCR сбрасывается в конце обработчика один раз. Нужно писать для каждой ветки свой?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 3 2009, 09:45
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Китаев Владимир @ Feb 3 2009, 12:43) *
AIC_EIOCR сбрасывается в конце обработчика один раз. Нужно писать для каждой ветки свой?

Просто код приведите, а то мы еще долго будем упражняться в телепатии.
Go to the top of the page
 
+Quote Post
Китаев Владимир
сообщение Feb 3 2009, 09:48
Сообщение #7





Группа: Новичок
Сообщений: 10
Регистрация: 7-07-08
Из: Новомосковск, Тульская область
Пользователь №: 38 779



Я уже привожу, просто убирал все лишнее...

Код
__irq void IRQ_DBGU(void)
    {char j, k, l, h;
    short i;
    long long temp;
    unsigned int status;
    long long TMP;
    int R;

    // get Usart status register and active interrupt
    status = AT91C_BASE_DBGU->DBGU_CSR;
    if (status & AT91C_US_RXBUFF)
        {     
        ...
        ОБРАБОТКА DBGU
        ...

        memcpy(buff_rx, buff_rx_null, sizeof(buff_rx_null));
        AT91C_BASE_DBGU->DBGU_RPR = (unsigned int) buff_rx;
        AT91C_BASE_DBGU->DBGU_RCR = 40;
        //* Reset the satus bit for error
        AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTSTA;
        }

    if (status & AT91C_US_TIMEOUT)
        {
        AT91C_BASE_DBGU->DBGU_CR = AT91C_US_STTTO;
        }

    //status = AT91C_RTTC_RTTINC;  
    status = AT91C_BASE_RTTC->RTTC_RTSR;
       if (status != 0)
           {
            ...
            ОБРАБОТКА RTTC
            ...
            }    
    AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_SYS);
    AT91C_BASE_AIC->AIC_EOICR = 0;
    }


Сообщение отредактировал Китаев Владимир - Feb 3 2009, 10:05
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 3 2009, 10:10
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Китаев Владимир @ Feb 3 2009, 12:48) *
Я уже привожу, просто убирал все лишнее...

Ничего криминального, кроме совершенно не нужной записи AIC_ICCR я не вижу.
А Вы учитываете, что RTT снимает запрос на прерывание только через 2 такта SCLK после чтения RTTC_RTSR?
Go to the top of the page
 
+Quote Post
Китаев Владимир
сообщение Feb 3 2009, 10:42
Сообщение #9





Группа: Новичок
Сообщений: 10
Регистрация: 7-07-08
Из: Новомосковск, Тульская область
Пользователь №: 38 779



Цитата(aaarrr @ Feb 3 2009, 13:10) *
Ничего криминального, кроме совершенно не нужной записи AIC_ICCR я не вижу.
А Вы учитываете, что RTT снимает запрос на прерывание только через 2 такта SCLK после чтения RTTC_RTSR?

Попробовал просто внести задержку (пустым циклом) после чтения RTTC_RTSR - вроде бы помогло. Спасибо. Как это вообще более правильно реализовать? У меня из за этой задержки поплыли измерения, которые сделаны по прерыванию от таймера. Этой задержкой я просто торможу таймер.

Сообщение отредактировал Китаев Владимир - Feb 3 2009, 10:44
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 3 2009, 11:12
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Китаев Владимир @ Feb 3 2009, 13:42) *
Как это вообще более правильно реализовать?

Правильно - не пользоваться RTT, ИМХО. Есть же вполне нормальные таймеры - TC, PIT.
Go to the top of the page
 
+Quote Post
Китаев Владимир
сообщение Feb 3 2009, 13:22
Сообщение #11





Группа: Новичок
Сообщений: 10
Регистрация: 7-07-08
Из: Новомосковск, Тульская область
Пользователь №: 38 779



Цитата(aaarrr @ Feb 3 2009, 14:12) *
Правильно - не пользоваться RTT, ИМХО. Есть же вполне нормальные таймеры - TC, PIT.

TС все заняты, а о PIT неподумал ... спасибо. a14.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 3 2009, 13:55
Сообщение #12


Гуру
******

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



Цитата(Китаев Владимир @ Feb 3 2009, 15:22) *
TС все заняты, а о PIT неподумал ... спасибо. a14.gif
Вот у меня тоже PIT, и обработчик примерно такой:
Код
        volatile dword Tmp = AT91C_BASE_PITC->PITC_PIVR >> 20;
        while (Tmp)
        {
            --Tmp;
            SystemTimer_Handler();
        }
  //дальше другие обработчики на  SYS


--------------------
На любой вопрос даю любой ответ
"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

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

 


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


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