Го-о-оспидя, как все запущено!
Обычно задуманное вами делается так.
Определяете прерывание с "тиком" 1 мс или 10мс или 100мс, как удобнее.. Инкрементируете в прерывании некую переменную "системных тиков" на величину веса/цены системного тика. Это будут ваши "часы", единые для всей программы. Далее в основном цикле для каждого события отводите по переменной в которых будут храниться значения временнЫх меток. Сравниваете текущее показание "часов" и значение временнОй метки путем беззнакового вычитания. Если разница больше периода возникновения события, то реализуете его (событие) и запоминаете вновь текущее значение "часов". Вот и вся недолга!
Важное замечание. Переменная "тиков" должна быть объявлена как беззнаковое целое (unsigned int) и обязательно с квалификатором
volatile. Разрядность переменной "тиков" определяется требованиями к максимальному периоду событий. Если предположим, что "вес" системного тика - 1мс, то 16-и разрядная переменная типа unsigned int позволяет определить максимальный период 65,535с. Если этого мало, то используйте 32-х разрядный тип unsigned long int, тогда при том же "весе" тика (1мс) максимальный период составит немного больше 1,5 месяцев. Только в последнем случае следует обязательно обеспечить атомарность считывания переменной "тиков" потому, что она инкрементируется в прерывании, а значение ее считывается в основном цикле программы. Притом, что значение переменной превышает нативную разрядность MSP430. Если для реализации атомарности чтения не прибегать к запрету прерываний, то типовым способом является такой, как в примере ниже (функция clock_ms).
Код
...
#include <stdint.h>
#define ADD_SYSTICK_VALUE 1UL //цена системного тика - 1 мс
#define LED1_BLINKPERIOD 100UL //период мерцания LED1 [в мс]
#define LED2_BLINKPERIOD 500UL //период мерцания LED2 [в мс]
volatile uint32_t SystemTick;
uint32_t clock_ms(void)
{ uint32_t tmp1, tmp2;
do
{ tmp1=SystemTick;
tmp2=SystemTick;
} while(tmp1 != tmp2);
return tmp2;
}
void main (void)
{ uint32_t timeStampLed1, timeStampLed2;
...
timeStampLed1 = clock_ms();
timeStampLed2 = clock_ms();
...
for (;;)
{
...
if ((clock_ms() - timeStampLed1) >= LED1_BLINKPERIOD) //проверка периода мерцания LED1
{ P4OUT ^= BIT3;
timeStampLed1 = clock_ms();
}
if ((clock_ms() - timeStampLed2) >= LED2_BLINKPERIOD) //проверка периода мерцания LED2
{ P4OUT ^= BIT4;
timeStampLed2 = clock_ms();
}
...
}
}
#pragma vector=TIMERA0_VECTOR
@pragma type_attrinute=__interrupt
void SYSTICK_ISR(void)
{ SystemTick += ADD_SYSTICK_VALUE; //инкремент переменной системного тика
}