|
|
  |
прерывания от таймеров в SAM, опять затупил :( |
|
|
|
Aug 3 2006, 15:44
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(aaarrr @ Aug 3 2006, 03:43)  Смотрите внимательнее, оба примера рабочие. Я проклят, не работает... Если заменить 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 вообще мечтать не приходится...
--------------------
|
|
|
|
|
Aug 3 2006, 19:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Вены резать рано. Рабочий код должен выглядеть примерно так: Код #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. Но раз уж взялись - придется только добить.
|
|
|
|
|
Aug 3 2006, 20:22
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(aaarrr @ Aug 3 2006, 23:41)  Это ^^^ работает? P.S. Этот таймер далеко не так прост, как может показаться на первый взгляд. Использовать прерывание в данном случае я бы однозначно не рекомендовал. Нет, это тоже не работает. Пробовал этот код запускать из RAM из под IAR через Wiggler - не работает. Пробовал выводить в формате raw-binary и через SAM-BA - программа хоть и записалась и после проверки выдало что запись совпала, но не работает вообще, даже не начинает выполняться... Похоже, дело в самом SAM7S... Хотя всё должно быть рабочим, т.к. платка заводского изготовления от Olimex SAM7-H64 и ничего кроме светодиодика я пока не припаивал (причем не на саму платку, а через разъемы на отдельной макетке), т.е. повредить я сам не мог... Даже не знаю как быть...
--------------------
|
|
|
|
|
Aug 4 2006, 09:20
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата Похоже, дело в самом SAM7S... Цитата Ну глюки в армах вобщем привычное дело. Сказки не надо рассказывать. 99% всех проблем - от кривых рук.
|
|
|
|
|
Aug 5 2006, 20:11
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(aaarrr @ Aug 5 2006, 22:32)  К сожалению, у меня нет IAR'а, но есть некоторые соображения: - Глобально прерывания разрешены? Честно говоря, не нашел как можно разрешить глобально прерывания. Правда нашел как их можно глобально запретить AIC_DCR.GMSK, но дебаггер показывает что бит запрета не установлен, т.е. всё по идее должно работать. Также обратил внимание что у меня всё время активны биты регистра AIC_IPR, которые соотвествуют SYSIRQ и AIC-IRQ1. AIC_IMR показывает что они разрешены, но ничего не происходит... Один раз проскочило что в AIC_IVR был адрес обработчика прерывания, т.е. вроде как должно разродиться, но... Судя по картинке, всё что необходимо уже настроено... [attachment=6545:attachment] Цитата - Если используется level sensetive режим, то прерывание RTT нужно запрещать внутри обработчика, в противном случае оно может сработать несколько раз. Сработало бы хоть один разок...
Сообщение отредактировал AVR - Aug 5 2006, 20:25
--------------------
|
|
|
|
|
Aug 5 2006, 22:30
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата Теперь у меня программа натыкается на то что показано на рисунке, а это бесконечный цикл. Поздравляю. А то, что этот бесконечный цикл находится на месте вектора irq, не наводит на размышления? По-идее, там должно быть что-нибудь вроде этого: Код ldr pc, [pc, #-0xf20] Т.е. чтение PC из AIC_IVR.
|
|
|
|
|
Aug 5 2006, 22:38
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(aaarrr @ Aug 6 2006, 02:30)  Поздравляю. А то, что этот бесконечный цикл находится на месте вектора irq, не наводит на размышления? По-идее, там должно быть что-нибудь вроде этого: Код ldr pc, [pc, #-0xf20] Т.е. чтение PC из AIC_IVR. Точно, всё аналогично AVRкам, тоже надо добавить прагму vector = 0x18 перед обработчиком IRQ =)
Сообщение отредактировал AVR - Aug 5 2006, 22:47
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|