Перейти к содержанию
    

прерывания от таймеров в SAM

Смотрите внимательнее, оба примера рабочие.

Я проклят, не работает... :(

Если заменить while(true) на

static int x;

if(x != AT91C_BASE_RTTC->RTTC_RTVR)

{

x = AT91C_BASE_RTTC->RTTC_RTVR;

sw = !sw;

if(sw) AT91C_BASE_PIOA->PIO_CODR = BIT30;

else AT91C_BASE_PIOA->PIO_SODR = BIT30;

}

то светодиод, повешенный на соответсвующий вывод мигает с частотой ~1 Гц...

Если же закоментировать и надеяться только на прерывание, то ничего не происходит вообще.

Да, а вы уверены, что прерывание вам действительно нужно? Я бы думал, что прерывания нужнее DBGU, если он используется, конечно.

Таймер я выбрал как самое простейшее что может вызыввать прерывания.

Если же я не могу осилить даже простой таймер, то про DBGU вообще мечтать не приходится... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал модифицировать пример AT91SAM7S64-PeriodicIntervalTimer-IAR4_30A-1_21 в котором таймер срабатывает каждые 200 мс. Добавил мигание светодиодом в обработчик прерывания и... тоже не работает. Но ведь это же провереный код, а тоже не работает. Как быть?... =( :help:

ЗЫ Уже готов вены резать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вены резать рано. Рабочий код должен выглядеть примерно так:

#include "AT91SAM7S64.h"
#include "system.h"
typedef unsigned char byte;
byte sw = 0;

__irq void IRQ_1()
{
    unsigned int a;

    a = *AT91C_RTTC_RTSR;
    sw = !sw;
    if(sw) AT91C_BASE_PIOA->PIO_CODR = BIT30;
    else AT91C_BASE_PIOA->PIO_SODR = BIT30;
    AT91C_BASE_AIC->AIC_EOICR = a;
}

int main()
{
    AT91C_BASE_PIOA->PIO_PER = BIT30;
    AT91C_BASE_PIOA->PIO_OER = BIT30;
    AT91C_BASE_PIOA->PIO_CODR = BIT30;

    AT91C_BASE_RTTC->RTTC_RTMR = 0x00008000 | AT91C_RTTC_RTTINCIEN | AT91C_RTTC_RTTRST;

    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int)IRQ_1;
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = (0x01 << 0x05);
    AT91C_BASE_AIC->AIC_IECR = (0x01 << AT91C_ID_SYS);

    while(1);
}

Это ^^^ работает?

 

P.S. Этот таймер далеко не так прост, как может показаться на первый взгляд. Использовать прерывание в данном случае я бы однозначно не рекомендовал.

P.P.S. Но раз уж взялись - придется только добить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это ^^^ работает?

P.S. Этот таймер далеко не так прост, как может показаться на первый взгляд. Использовать прерывание в данном случае я бы однозначно не рекомендовал.

Нет, это тоже не работает. Пробовал этот код запускать из RAM из под IAR через Wiggler - не работает. Пробовал выводить в формате raw-binary и через SAM-BA - программа хоть и записалась и после проверки выдало что запись совпала, но не работает вообще, даже не начинает выполняться...

Похоже, дело в самом SAM7S... Хотя всё должно быть рабочим, т.к. платка заводского изготовления от Olimex SAM7-H64 и ничего кроме светодиодика я пока не припаивал (причем не на саму платку, а через разъемы на отдельной макетке), т.е. повредить я сам не мог... Даже не знаю как быть...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну глюки в армах вобщем привычное дело.

У меня вот недавно глючило прерывание по переполнению от tc1 - вызывалось в 2 раза чаще предполагаемого и флаг OVR был нулю равным, хотя с другими каналами все работало. пришлось по сравнению прерывание делать.

А не позднее как вчера генератор внутренний сдох при экспирементах с внешним генератором.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похоже, дело в самом SAM7S...

Ну глюки в армах вобщем привычное дело.

Сказки не надо рассказывать. 99% всех проблем - от кривых рук.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Руки у меня действительно не самые прямые но когда код работает на 2 каналах и не работает как надо на третьем оставшемся тут уж не до сказок. А вообще может его статикой вынесло - черт его знает.

Я пробоавал только на одном проце.

Хотя согласен с Вами - большинство проблем из-за человеческих ошибок. И здесь возможно присутмтвует некая тупая до безобразия ошибка. В стартапе например.

Изменено пользователем SpiritDance

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотя согласен с Вами - большинство проблем из-за человеческих ошибок. И здесь возможно присутмтвует некая тупая до безобразия ошибка. В стартапе например.
Всё возможно, но я по причине своего нубства не могу найти где эта ошибка... :(

Приложил этот многострадальный проектик (для IAR-ARM 4.40A).

Проверьте, пожалуйста, будет ли он работать на Вашем SAM7S64?

Изменено пользователем AVR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К сожалению, у меня нет IAR'а, но есть некоторые соображения:

- Глобально прерывания разрешены?

- Если используется level sensetive режим, то прерывание RTT нужно запрещать внутри обработчика, в противном случае оно может сработать несколько раз.

- и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К сожалению, у меня нет IAR'а, но есть некоторые соображения:

- Глобально прерывания разрешены?

Честно говоря, не нашел как можно разрешить глобально прерывания. Правда нашел как их можно глобально запретить AIC_DCR.GMSK, но дебаггер показывает что бит запрета не установлен, т.е. всё по идее должно работать.

Также обратил внимание что у меня всё время активны биты регистра AIC_IPR, которые соотвествуют SYSIRQ и AIC-IRQ1. AIC_IMR показывает что они разрешены, но ничего не происходит... Один раз проскочило что в AIC_IVR был адрес обработчика прерывания, т.е. вроде как должно разродиться, но...

Судя по картинке, всё что необходимо уже настроено...

 

 

- Если используется level sensetive режим, то прерывание RTT нужно запрещать внутри обработчика, в противном случае оно может сработать несколько раз.

Сработало бы хоть один разок... :)

Изменено пользователем AVR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Глобально запретить прерывания можно на уровне ядра - достаточно бит I в CPSR установить. Добавьте в main вызов __enable_interrupt().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А забавно будет если AVR не знал, что нужно хоть раз активировать __enable_interrupt().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А забавно будет если AVR не знал, что нужно хоть раз активировать __enable_interrupt().

Это действительно забавно, именно это я и забыл, хотя на AVRах никогда не забывал вызывать именно эту функцию в IAR-AVR :laugh: :blush:

ЗЫ

Теперь у меня программа натыкается на то что показано на рисунке, а это бесконечный цикл.

Возможно нужно #pragma vector какое-нибудь добавить?...

Изменено пользователем AVR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь у меня программа натыкается на то что показано на рисунке, а это бесконечный цикл.

 

Поздравляю. А то, что этот бесконечный цикл находится на месте вектора irq, не наводит на размышления?

 

По-идее, там должно быть что-нибудь вроде этого:

ldr    pc, [pc, #-0xf20]

Т.е. чтение PC из AIC_IVR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поздравляю. А то, что этот бесконечный цикл находится на месте вектора irq, не наводит на размышления?

По-идее, там должно быть что-нибудь вроде этого:

ldr    pc, [pc, #-0xf20]

Т.е. чтение PC из AIC_IVR.

Точно, всё аналогично AVRкам, тоже надо добавить прагму vector = 0x18 перед обработчиком IRQ =)

Изменено пользователем AVR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...