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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> прерывания от таймеров в SAM, опять затупил :(
AVR
сообщение Aug 3 2006, 15:44
Сообщение #16


фанат Linux'а
*****

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



Цитата(aaarrr @ Aug 3 2006, 03:43) *
Смотрите внимательнее, оба примера рабочие.

Я проклят, не работает... sad.gif
Если заменить 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 вообще мечтать не приходится... sad.gif


--------------------
Go to the top of the page
 
+Quote Post
AVR
сообщение Aug 3 2006, 19:23
Сообщение #17


фанат Linux'а
*****

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



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


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 3 2006, 19:41
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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. Но раз уж взялись - придется только добить.
Go to the top of the page
 
+Quote Post
AVR
сообщение Aug 3 2006, 20:22
Сообщение #19


фанат 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 и ничего кроме светодиодика я пока не припаивал (причем не на саму платку, а через разъемы на отдельной макетке), т.е. повредить я сам не мог... Даже не знаю как быть...


--------------------
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Aug 4 2006, 06:24
Сообщение #20


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



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


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 4 2006, 09:20
Сообщение #21


Гуру
******

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



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

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

Сказки не надо рассказывать. 99% всех проблем - от кривых рук.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Aug 4 2006, 18:55
Сообщение #22


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



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

Сообщение отредактировал SpiritDance - Aug 4 2006, 18:57


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
AVR
сообщение Aug 5 2006, 15:27
Сообщение #23


фанат Linux'а
*****

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



Цитата(SpiritDance @ Aug 4 2006, 22:55) *
Хотя согласен с Вами - большинство проблем из-за человеческих ошибок. И здесь возможно присутмтвует некая тупая до безобразия ошибка. В стартапе например.
Всё возможно, но я по причине своего нубства не могу найти где эта ошибка... sad.gif
Приложил этот многострадальный проектик (для IAR-ARM 4.40A).
Проверьте, пожалуйста, будет ли он работать на Вашем SAM7S64?

Сообщение отредактировал AVR - Aug 5 2006, 15:28


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 5 2006, 18:32
Сообщение #24


Гуру
******

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



К сожалению, у меня нет IAR'а, но есть некоторые соображения:
- Глобально прерывания разрешены?
- Если используется level sensetive режим, то прерывание RTT нужно запрещать внутри обработчика, в противном случае оно может сработать несколько раз.
- и т.д.
Go to the top of the page
 
+Quote Post
AVR
сообщение Aug 5 2006, 20:11
Сообщение #25


фанат 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 нужно запрещать внутри обработчика, в противном случае оно может сработать несколько раз.

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

Сообщение отредактировал AVR - Aug 5 2006, 20:25


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 5 2006, 21:09
Сообщение #26


Гуру
******

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



Глобально запретить прерывания можно на уровне ядра - достаточно бит I в CPSR установить. Добавьте в main вызов __enable_interrupt().
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 5 2006, 22:07
Сообщение #27


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
AVR
сообщение Aug 5 2006, 22:14
Сообщение #28


фанат Linux'а
*****

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



Цитата(GetSmart @ Aug 6 2006, 02:07) *
А забавно будет если AVR не знал, что нужно хоть раз активировать __enable_interrupt().

Это действительно забавно, именно это я и забыл, хотя на AVRах никогда не забывал вызывать именно эту функцию в IAR-AVR laugh.gif blush.gif
ЗЫ
Теперь у меня программа натыкается на то что показано на рисунке, а это бесконечный цикл.
Возможно нужно #pragma vector какое-нибудь добавить?...

Сообщение отредактировал AVR - Aug 5 2006, 22:27


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 5 2006, 22:30
Сообщение #29


Гуру
******

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



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


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

По-идее, там должно быть что-нибудь вроде этого:
Код
ldr    pc, [pc, #-0xf20]

Т.е. чтение PC из AIC_IVR.
Go to the top of the page
 
+Quote Post
AVR
сообщение Aug 5 2006, 22:38
Сообщение #30


фанат 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


--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:43
Рейтинг@Mail.ru


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