Цитата(aaarrr @ Jun 25 2008, 10:31)

Для сброса прерывания нужно прочитать PIT_PIVR.
"!" - это логическая операция, а не битовая.
Почему 30? У System Controller'а ID 1, но лучше написать AT91C_ID_SYS.
Всё исправил как Вы сказали. Всё равно не работает.
Таймер щитает. Порт настроен.
Программа просто не заходит в обработчик прерывания.
#include "AT91SAM7S128.h"
//////////////Прерывание от PIT////////////////////
__irq void PIT_interrupt(void)
{
int x;
x=*AT91C_PITC_PIVR;
*AT91C_PIOA_ODSR=~*AT91C_PIOA_ODSR; //Сюда программа почему-то ни когда не заходит
*AT91C_AIC_EOICR = 0; //Выход из прерывания
}
//////////////////Настраиваем PIT///////////////////
void SET_PIT(void)
{
int x;
//Устанавливаем прерывание
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS]=0|(1<<5); //Приоритет 0, по переднему фронту
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS]=(unsigned long)PIT_interrupt;
AT91C_BASE_AIC->AIC_IECR=(1<<AT91C_ID_SYS); //разрешаем прерывание
x=*AT91C_PITC_PIVR; //сбрасываем PICNT
*AT91C_PITC_PIMR=0x20 ; //устанавливаем значение PIV=0x20
*AT91C_PITC_PIMR|=AT91C_PITC_PITEN|AT91C_PITC_PITIEN; //разрешаем прерывание и запускаем таймер
}
int main(void)
{
SET_PORT(); //Настраиваем порт на выход
SET_PIT();
while(1) { }; //ждём прерывание
}