Прошу прощения если не в тему, но если нужна привязка ко времени и есть свободный аппаратный таймер, то не проще ли так?
CODE
/*****************************************
Модуль таймеров
Автор: N1X
Дата: 09.2011
******************************************/
#ifndef TIMERS_h
#define TIMERS_h
#include <iostm8s105c4.h>
#define MAXLTIMERS 2 //Кол-во программных таймеров
//Список локальных таймеров:
#define LCD_LTIMER 0 //Имена для упрощения ))) кому как больше нравится, можно enum прикрутить
#define MAINTIMER 1
//Экспортируемые функции:
void TimersInit(void); //Инициализация аппаратуры
void StartLTimer(unsigned char TimerID); //Обнуляет таймер TimerID
unsigned int GetLTimer(unsigned char TimerID); //Возвращает текущее значение нужного таймера
#endif
CODE
#include "timers.h"
#include <intrinsics.h>
volatile unsigned int LTimers[MAXLTIMERS];
void TimersInit(void)
{
//CLK_PCKENR1 |= ?; //Вкл. тактирование таймера 3
TIM3_PSCR = 0; //Делитель выключен
TIM3_ARRH = 0x3e; //Считаем до 16000
TIM3_ARRL = 0x80;
TIM3_IER = 0x01; //Прер. по переполнению вкл.
TIM3_CR1_CEN = 1; //Включаем счетчик
__enable_interrupt();
}
void StartLTimer(unsigned char TimerID)
{
LTimers[TimerID] = 0;
}
unsigned int GetLTimer(unsigned char TimerID)
{
return(LTimers[TimerID]);
}
#pragma vector=TIM3_OVR_UIF_vector
__interrupt void TIM3_Int(void)
{
TIM3_SR1_UIF = 0;
unsigned char i;
for (i=0; i < MAXLTIMERS; i++)
LTimers[i]++;
}
В данном примере при 16 МГц тактовой имеем инкремент таймеров каждую мс... Итого точность хода, + не обязательно тупо ждать в цикле, а можно делать че-нить полезное... Хотя мелкие задержки так делать расточительно, постоянные прерывания...
Использовать вообще просто, чтобы запустить ожидание вызываем StartLTimer и переодически проверяем значение функцией GetLTimer...