Цитата(Юрий Санвальд @ Oct 31 2011, 13:06)

А почему Вы думаете, что ошибка в обработчике прерывания? Оно у Вас вообще происходит, это прерывание? В обработчик программа попадает? Как это проверяли? Инициализация портов и таймера не приведена, так что трудно что то сказать...
Если закоментировать изменение состояния светодиода через 100мс, то второй светодиод будет мигать четко раз в 500 мс. И наоборот: если закоментировать изменение состояния светодиода через 500мс, то другой светодиод будет мигать четко раз в 100 мс. А если оставить оба флага, то и у первого и у второго светодиода частота сбивается.
[code]
int main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Остановка сторожевого таймера, чтобы предотвратить время сброса
_DINT(); // Запрещаем прерывания
InitializationPortIO (); // Вызов функции инициализации портов ввода/вывода микроконтроллера
InitializationTimersMSP430 (); // Вызов функции инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135
_EINT(); // Разрещаем прерывания
while (1)
{
if (Flag_500ms == true) // Если поставлен флаг 500мс
{
P4OUT = ~(P4OUT & BIT4); // Состояние 5 вывода 4 порта меняется
Flag_500ms = false; // Флаг убирается
}
/*
if (Flag_100ms == true) // Если поставлен флаг 100мс
{
P4OUT = ~(P4OUT & BIT3); // Состояние 4 вывода 4 порта меняется
Flag_100ms = false; // Флаг убирается
}
*/
}
}
//********************************************************************************
*********************************************************************************
******************************
//********************************************************** ОБРАБОТЧИКИ ПРЕРЫВАНИЙ ********************************************************************************
*********************
#pragma vector = TIMERA0_VECTOR // Прерывание от таймера А (срабатывает каждые 10 мс)
__interrupt void isr_TACCR0() // прерывание
{
/*
t ++;
if ( t >= 10 )
{
Flag_100ms = true;
t = 0;
}
*/
y ++;
if ( y >= 50 )
{
Flag_500ms = true;
y = 0;
}
}
//********************************************************************************
*********************************************************************************
******************************
//************************************************************* ОПИСАНИЯ ФУНКЦИЙ ********************************************************************************
************************
void InitializationTimersMSP430 (void) // Функция инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135
{
// Общая инициализвция модуля тактирования микроконтроллера
BCSCTL1 = 0x00; // Обнуление управляющего регистра BCSCTL1
IFG1 &= ~XT2OFF; // XT2 = HF XTAL
int y; // Включение XT2
do
{
IFG1 &= ~OFIFG; // Очистка флага OFIFG
for (y = 0xFF; y > 0; y--); // Задержка
}
while (IFG1 & OFIFG); // проверка
BCSCTL2 = 0x00; // Обнуление управляющего регистра BCSCTL2
DCOCTL = DCO0 | DCO1 | DCO2 | // Частота генератора -> МАКСИМУМ (8000000 Гц)
MOD0 | MOD1 | MOD2 | MOD3 | MOD4; // Модулятор тактовой частоты DCO -> МАКСИМУМ
BCSCTL1 = RSEL0 | RSEL1 | RSEL2; // Сопротивление внутреннего резистора -> МАКСИМУМ
BCSCTL2 = SELM_2 | // Источник тактирования MCLK -> XT2CLK
DIVM_0 | // Делитель MCLK -> 1
SELS | // Источник тактирования SMCLK -> XT2CLK
DIVS_0 ; // Делитель SMCLK -> 1
LPM4; // Генераторы DCO и LFXT1 отключены
// Инициализация таймера А
TACTL = TASSEL_2 | // Источник тактирования таймера -> сигнал SMCLK (8МГц)
ID_3 | // Предделитель таймера -> 8
MC_1; // Режим работы таймера -> счёт вверх до значения TACCR0
TACCR0 = 10000; // Счёт до значения -> 10000
TACCTL0 = CCIE; // Разрешение прерывания по захвату/сравнению, разрешение запроса прерывания от флага CCIFG
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void InitializationPortIO (void) // Функция инициализации портов ввода вывода микроконтроллера
{
// Инициализация порта ввода/вывода №4
P4SEL = 0x00; // Все выводы порта настроены как цыфровые линии
P4OUT = 0x00; // На всех выводах порта установлены логические "0"
P4DIR = 0x18; // 4,5 вывод порта настроены как выходы
}