Цитата(yliya @ Dec 11 2012, 19:44)

но ... если сигнал появится на INT1? что делать в этом случае?
я получаю из таймера двоичное значение, мне нужно перевести в десятичное...
Если неизвестно который из сигналов приходит первый , но время необходимо измерить между двумя сигналами можно поступить следующим образом -
1 - установить прерывания на ожидание события.
2 - по свершившемуся событию (на любом из прерываний) проверить флаг (счетчик событий)
2.1 - если флаг сброшен (счетчик событий = 0) и запустить таймер.
2.2 - если флаг установлен (счетчик событий = 1) остановить таймер и получить время между событиями, установить признак готовности времени для основной программы.
Код
#define _INT0_PULSE 1
#define _INT1_PULSE 2
char countPulse = 0;
char timeOk = 0;
unsigned int timeResult = 0;
void __attribute__ ((__interrupt__, no_auto_psv)) _INT0Interrupt(void)
{
...... /* очистить флаг прерываний - */
controlPulse(_INT0_PULSE);
}
void __attribute__ ((__interrupt__, no_auto_psv)) _INT1Interrupt(void)
{
...... /* очистить флаг прерываний - */
controlPulse(_INT1_PULSE);
}
void controlPulse(char pulse)
{
if( ! countPulse )
{
/*запустить таймер на отсчет времени*/
countPulse = pulse;
WriteTimerX(0);
TXCONbits.TON=1;
}
else
{
if(p[u]u[/u]lse != countPulse)/*ожидать второго пульса*/ /*очепятку исправил */
{
/*остановить таймер, зафиксировать резыльтат*/
countPulse = 0; /*сбросить флаг для следующего замера*/
timeResult = ReadTimerX();
timeOk = 1;
}
else
{
/* тот-же пульс - либо просто ожидать другого пульса,
либо перезапустить отсчет времени
*/
}
}
}
/* WriteTimerX(), ReadTimerX() - функция записи, чтения таймера X*/
Дополнительно контролируя pulse в controlPulse можно фиксировать какое событие было первым и принимать какое-то решение - зависит от постановки задачи.
В основной программе :
Код
while( ! timeOk )
{
/*ожидание результата*/
}
......
/*получен результат , приступить к его обработке*/
По поводу доступа к регистрам таймера на этапе ознакомления рекомендую использовать библиотеку Timers Peripheral Module Library из 16-bit Compiler Peripheral Libraries (MPLAB - C30 XC16 , в других компиляторах может называться иначе, но обычно присутсвует ) - это позволит сконцентрироваться на решении главной задачи , а особенности обращения к аппаратным регистрам изучать по ходу ознакомления с программированием , или при возникновении необходимости глубокой оптимизации исполняемого кода.
для преобразования в двоично-десятичный результат
Код
unsigned int Bin; /* двоичное */
unsigned char bcdResult[5] = {0,0,0,0,0}; /*двоично-десятичный результат */
char i = 0;
for(i = 0; i<5; i++)
{
bcdResult[i] = (unsigned char)(Bin % 10)
Bin = Bin / 10;
}
Как-то так. Но можно и иначе.
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард