1891ВМ12Я 0 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба Смотрите внимательнее, оба примера рабочие. Я проклят, не работает... :( Если заменить 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 вообще мечтать не приходится... :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба Попробовал модифицировать пример AT91SAM7S64-PeriodicIntervalTimer-IAR4_30A-1_21 в котором таймер срабатывает каждые 200 мс. Добавил мигание светодиодом в обработчик прерывания и... тоже не работает. Но ведь это же провереный код, а тоже не работает. Как быть?... =( ЗЫ Уже готов вены резать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба Вены резать рано. Рабочий код должен выглядеть примерно так: #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. Но раз уж взялись - придется только добить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба Это ^^^ работает? P.S. Этот таймер далеко не так прост, как может показаться на первый взгляд. Использовать прерывание в данном случае я бы однозначно не рекомендовал. Нет, это тоже не работает. Пробовал этот код запускать из RAM из под IAR через Wiggler - не работает. Пробовал выводить в формате raw-binary и через SAM-BA - программа хоть и записалась и после проверки выдало что запись совпала, но не работает вообще, даже не начинает выполняться... Похоже, дело в самом SAM7S... Хотя всё должно быть рабочим, т.к. платка заводского изготовления от Olimex SAM7-H64 и ничего кроме светодиодика я пока не припаивал (причем не на саму платку, а через разъемы на отдельной макетке), т.е. повредить я сам не мог... Даже не знаю как быть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SpiritDance 0 4 августа, 2006 Опубликовано 4 августа, 2006 · Жалоба Ну глюки в армах вобщем привычное дело. У меня вот недавно глючило прерывание по переполнению от tc1 - вызывалось в 2 раза чаще предполагаемого и флаг OVR был нулю равным, хотя с другими каналами все работало. пришлось по сравнению прерывание делать. А не позднее как вчера генератор внутренний сдох при экспирементах с внешним генератором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 4 августа, 2006 Опубликовано 4 августа, 2006 · Жалоба Похоже, дело в самом SAM7S... Ну глюки в армах вобщем привычное дело. Сказки не надо рассказывать. 99% всех проблем - от кривых рук. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SpiritDance 0 4 августа, 2006 Опубликовано 4 августа, 2006 (изменено) · Жалоба Руки у меня действительно не самые прямые но когда код работает на 2 каналах и не работает как надо на третьем оставшемся тут уж не до сказок. А вообще может его статикой вынесло - черт его знает. Я пробоавал только на одном проце. Хотя согласен с Вами - большинство проблем из-за человеческих ошибок. И здесь возможно присутмтвует некая тупая до безобразия ошибка. В стартапе например. Изменено 4 августа, 2006 пользователем SpiritDance Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 5 августа, 2006 Опубликовано 5 августа, 2006 (изменено) · Жалоба Хотя согласен с Вами - большинство проблем из-за человеческих ошибок. И здесь возможно присутмтвует некая тупая до безобразия ошибка. В стартапе например.Всё возможно, но я по причине своего нубства не могу найти где эта ошибка... :( Приложил этот многострадальный проектик (для IAR-ARM 4.40A). Проверьте, пожалуйста, будет ли он работать на Вашем SAM7S64? Изменено 5 августа, 2006 пользователем AVR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 августа, 2006 Опубликовано 5 августа, 2006 · Жалоба К сожалению, у меня нет IAR'а, но есть некоторые соображения: - Глобально прерывания разрешены? - Если используется level sensetive режим, то прерывание RTT нужно запрещать внутри обработчика, в противном случае оно может сработать несколько раз. - и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 5 августа, 2006 Опубликовано 5 августа, 2006 (изменено) · Жалоба К сожалению, у меня нет IAR'а, но есть некоторые соображения: - Глобально прерывания разрешены? Честно говоря, не нашел как можно разрешить глобально прерывания. Правда нашел как их можно глобально запретить AIC_DCR.GMSK, но дебаггер показывает что бит запрета не установлен, т.е. всё по идее должно работать. Также обратил внимание что у меня всё время активны биты регистра AIC_IPR, которые соотвествуют SYSIRQ и AIC-IRQ1. AIC_IMR показывает что они разрешены, но ничего не происходит... Один раз проскочило что в AIC_IVR был адрес обработчика прерывания, т.е. вроде как должно разродиться, но... Судя по картинке, всё что необходимо уже настроено... - Если используется level sensetive режим, то прерывание RTT нужно запрещать внутри обработчика, в противном случае оно может сработать несколько раз. Сработало бы хоть один разок... :) Изменено 5 августа, 2006 пользователем AVR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 августа, 2006 Опубликовано 5 августа, 2006 · Жалоба Глобально запретить прерывания можно на уровне ядра - достаточно бит I в CPSR установить. Добавьте в main вызов __enable_interrupt(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 5 августа, 2006 Опубликовано 5 августа, 2006 · Жалоба А забавно будет если AVR не знал, что нужно хоть раз активировать __enable_interrupt(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 5 августа, 2006 Опубликовано 5 августа, 2006 (изменено) · Жалоба А забавно будет если AVR не знал, что нужно хоть раз активировать __enable_interrupt(). Это действительно забавно, именно это я и забыл, хотя на AVRах никогда не забывал вызывать именно эту функцию в IAR-AVR :laugh: ЗЫ Теперь у меня программа натыкается на то что показано на рисунке, а это бесконечный цикл. Возможно нужно #pragma vector какое-нибудь добавить?... Изменено 5 августа, 2006 пользователем AVR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 августа, 2006 Опубликовано 5 августа, 2006 · Жалоба Теперь у меня программа натыкается на то что показано на рисунке, а это бесконечный цикл. Поздравляю. А то, что этот бесконечный цикл находится на месте вектора irq, не наводит на размышления? По-идее, там должно быть что-нибудь вроде этого: ldr pc, [pc, #-0xf20] Т.е. чтение PC из AIC_IVR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 5 августа, 2006 Опубликовано 5 августа, 2006 (изменено) · Жалоба Поздравляю. А то, что этот бесконечный цикл находится на месте вектора irq, не наводит на размышления? По-идее, там должно быть что-нибудь вроде этого: ldr pc, [pc, #-0xf20] Т.е. чтение PC из AIC_IVR. Точно, всё аналогично AVRкам, тоже надо добавить прагму vector = 0x18 перед обработчиком IRQ =) Изменено 5 августа, 2006 пользователем AVR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться