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

|
Здравствуйте! Столкнулся при работе с SAM7S256 с непонятной проблемой. Использую прерывание SYS для обработки прерываний от DBGU и RTTC. В начале все работает, происходит несколько прерываний DBGU и RTTC, а затем прерывания перестают возникать вообще, хотя галочки pending и mask все время установлены. Сама прога в этот момент вертится в бесконечном цикле в main. Что это может быть и как это можно исправить? Спасибо.
|
|
|
|
|
Feb 3 2009, 09:20
|
Группа: Новичок
Сообщений: 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; ...
|
|
|
|
|
Feb 3 2009, 09:43
|
Группа: Новичок
Сообщений: 10
Регистрация: 7-07-08
Из: Новомосковск, Тульская область
Пользователь №: 38 779

|
Цитата(Сергей Борщ @ Feb 3 2009, 12:34)  Покажите код обработчика прерывания SYS. Очень похоже, что в какой-то из веток вы забываете прописать AIC_EIOCR. AIC_EIOCR сбрасывается в конце обработчика один раз. Нужно писать для каждой ветки свой?
|
|
|
|
|
Feb 3 2009, 09:48
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Feb 3 2009, 10:42
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Feb 3 2009, 13:22
|
Группа: Новичок
Сообщений: 10
Регистрация: 7-07-08
Из: Новомосковск, Тульская область
Пользователь №: 38 779

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

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

|
Цитата(Китаев Владимир @ Feb 3 2009, 15:22)  TС все заняты, а о PIT неподумал ... спасибо.  Вот у меня тоже 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|