Немного повозившись с кодом, получаем следующее, которое имеет некоторые ограничения. Задержку меньше 50 микроСекунд получить не удается. Почему это происходит я еще не разобрался, но не так сильно это мне нужно.
Микроконтроллер работает на частоте 1 МГц. 1000 в переменной i соответствует 1 миллиСекунде задержки. Контроллер, в это время выключен.
Код следующий:
#include <msp430.h>
unsigned int i=65535;
void DELAY_us (unsigned int);
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */
P1DIR |= 0x01; // P1.0 output, for v. test
while (1)
{
P1OUT ^= 0x01;
DELAY_us (i);
}
}
#pragma vector=TIMERA0_VECTOR // Timer A0 interrupt service routine
__interrupt void Timer_A (void) {
__bic_SR_register_on_exit(LPM0_bits); // Clear LPM0 bits (CPU run)
}
void DELAY_us (unsigned int k) {
CCTL0 = CCIE; // CCR0 interrupt enabled
TACTL = TASSEL_2 + MC_1; // SMCLK, upmode
CCR0 = k; // Load counter, 1 uS per tick if k> 50
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
То, что действительно работает, выделено зеленым.
Суть простая. Функция запускает таймер, на время, которое определено в переменной i а потом k. Процессор отключается и ждет пока таймер закончит счет. Когда это произошло, срабатывает прерывание (включается процессор) и программа продолжает рабтать дальше.
Недостаток в том, что больше 65 мСек задержку получить нельзя, тк максимальное 16-ти битное число, которое может быть загружено в таймер = 65535. Поэтому, для более длительной задержки, эту процедуру (DELAY_us (i);) необходимо вызывать несклько раз.
P.S. Сделано как "закладка", для "себя, любимого" : )