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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> SAM7S256 Системные прерывания перестают работать через 2-4часа, Помогите.
aaarrr
сообщение Apr 1 2015, 11:53
Сообщение #16


Гуру
******

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



Цитата(Димон Безпарольный @ Apr 1 2015, 14:43) *
Как проверить protect mode прерывания?

В AIC_DEBUG он включается. Лучше приведите код инициализации AIC и стартап (или где находится вектор IRQ), чтобы не приходилось гадать.

Цитата(Димон Безпарольный @ Apr 1 2015, 14:43) *
Я бы вынес запись EOICR, но как быть с PIT_PIVR? Читать его в какую - нибудь переменную?

Оставьте просто *PIT_PIVR;

Цитата(Димон Безпарольный @ Apr 1 2015, 14:43) *
К тому же я так и не смог отключить RTT и всех запутал. Пост 13.

Не понял, в чем состоит проблема. Просто не включайте ALMIEN и RTTINCIEN в RTT_MR.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Apr 1 2015, 12:00
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(aaarrr @ Apr 1 2015, 14:53) *
Лучше приведите код инициализации AIC и стартап (или где находится вектор IRQ), чтобы не приходилось гадать.
Код инициализации AIC
Код
    *AIC_SMR1    =    (1 << 5) | 1;    //Positive edge triggered (5), 1-й уровень пиоритета
    *AIC_SVR1    =    (unsigned long) SYS_int; //Адрес обработчика прерывания
    *AIC_IECR    =    (1 << 1);        //Разрешить системное прерывание SYS(1)


Стартап большой. Вот что касается IRQ:
Код
Mode_USR        EQU     0x10
Mode_FIQ        EQU     0x11
Mode_IRQ        EQU     0x12
Mode_SVC        EQU     0x13
Mode_ABT        EQU     0x17
Mode_UND        EQU     0x1B
Mode_SYS        EQU     0x1F

I_Bit           EQU     0x80           ; when I bit is set, IRQ is disabled
F_Bit           EQU     0x40           ; when F bit is set, FIQ is disabled

IRQ_Stack_Size  EQU     0x00000080

;               LDR     PC,IRQ_Addr
                LDR     PC,[PC,#-0xF20]       ; Vector From AIC_IVR


IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

IRQ_Handler     B       IRQ_Handler
FIQ_Handler     B       FIQ_Handler

;  Enter IRQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #IRQ_Stack_Size

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2015, 12:04
Сообщение #18


Гуру
******

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



Понятно. Protection mode не задействован, иначе бы вообще ничего не работало.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Apr 1 2015, 12:16
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Разобрался почему я не могу отключить RTT. Отключил PIT и RTT. Тогда прерывания остановились полностью. Включаю PIT и что я вижу? Выполнение кода из условия if (*RTT_SR & 2):

Код
    if (*RTT_SR & 2) {                //Время выполнения 450нс на частоте 48МГц
        Strob = 1;                    //Прерывание по Real-time Timer (RTT) (для подсчёта секунд) стр71.
        *AIC_EOICR = 1;}            //


Но RTT остановлен! Проверено. Дело в некорректной диагностики прерывания от RTT? Как тогда будет правильно?

Сообщение отредактировал Димон Безпарольный - Apr 1 2015, 12:19
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2015, 12:19
Сообщение #20


Гуру
******

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



Цитата(Димон Безпарольный @ Apr 1 2015, 15:16) *
Разобрался почему я не могу отключить RTT. Отключил PIT и RTT. Тогда прерывания остановились полностью. Включаю PIT и что я вижу? Выполнение кода из условия:

Код
if (*RTT_SR & 2)


Но RTT остановлен. Проверено. Дело в некорректной диагностики? Как тогда будет правильно?

Все правильно, в статусном регистре биты в любом случае устанавливаются.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Apr 1 2015, 12:20
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(aaarrr @ Apr 1 2015, 15:19) *
Все правильно, в статусном регистре биты в любом случае устанавливаются.

Вот! Значит я некорректно обрабатываю прерывания. Стало быть и некорректно их завершаю. Как тогда сделать правильно?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2015, 12:49
Сообщение #22


Гуру
******

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



Код
__irq void sys_irq(void)
{
    if(*PIT_SR & PITS)
    {
        ...
        *PIT_PIVR;
    }
    if(*RTT_SR & RTTINC)
    {
        ...
    }

    *AIC_EOICR = 0; // Единственное место, где пишется EOICR
}


Бросьте Вы этот RTT: самый убогий таймер, толку от него 0.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Apr 2 2015, 05:37
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Правильно написал aaarrr (пост6) что медленный таймер RTT при завершении прерывания блокирует линию SYS_INT еще на 2 цикла:

Цитата
The status register flags reset is taken into account only 2 slow clock cycles after the read of the RTT_SR (Status Register)


В этом причина. Если прерывания случаются в этот период они уже не обрабатываются никогда. Страшно подумать какой геморрой будет если вместе с RTT включить остальные системные прерывания. Таймер RTT я больше не использую. Процессор проработал 12 часов без глюков. Проблема решена. Всем спасибо. Вот конечный код:
Код
__irq void SYS_int (void) {            //Прерывание от System Controller. Время выполнения 1мкс на частоте 48МГц
    if (*PIT_SR & 1) {                //Проверка бита PITS(0) из PIT_SR - регистр статуса интервального таймера
        Strob = 1;                    //Прерывание по Real-time Timer (RTT) (для подсчёта секунд) стр71.
    if (!(*PIO_PDSR&(1<<28))) {KnobCNT++;}//Если кнопка нажата - считаем время нажатия
    else if (KnobCNT) {Knob = KnobCNT; KnobCNT=0; Beep = 1;}//Если отжата и счетчик ненулевой - перезаписываем
        if (Beep) {                    //Прерывание по Periodic Interval Timer (PIT) стр77. P2.0
            Beep--;                    //
            *PWM_ENA = 2;}            //Разрешить работу канала PWM1 (CHID2) P2.0        
        else {*PWM_DIS = 2;}         //Запретить работу канала PWM1 (CHID2)
        *PIT_PIVR;    }                //Чтение PIT_PIVR сбрасывает бит PITS в PIT_SR
    *AIC_EOICR = 1;    }                //__irq void SYS_int (void)


Сообщение отредактировал Димон Безпарольный - Apr 2 2015, 05:38
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Apr 15 2015, 06:07
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Вышел из положения. Величину секундного таймера проверяю в прерывании RTT. Если величина отличается от ранее запомненой, выставляется секундный строб:

Код
if (!(RTT_Value==*RTT_VR)) {Strob1s=1; RTT_Value=*RTT_VR;}
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 15 2015, 10:05
Сообщение #25


Гуру
******

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



Цитата(Димон Безпарольный @ Apr 15 2015, 09:07) *
Вышел из положения. Величину секундного таймера проверяю в прерывании RTT.

Наверное, в прерывании PIT?

Мне все же интересно, зачем в системе иметь секундные прерывания от таймера, тактирующегося от RC-генератора? Ведь от Real Time там одно название на SAM7.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Apr 15 2015, 11:59
Сообщение #26


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(aaarrr @ Apr 15 2015, 13:05) *
Наверное, в прерывании PIT?

Мне все же интересно, зачем в системе иметь секундные прерывания от таймера, тактирующегося от RC-генератора? Ведь от Real Time там одно название на SAM7.

В прерывании от PIT конечно.

Да просто спортивный интерес. Секундные прерывания нужны для обновления дисплея. Точность не нужна. Можно было бы и прерывания от PIT через счетчик пересчитать. Собственно, оно так и было. Просто может кому пригодится..
Go to the top of the page
 
+Quote Post

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

 


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


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