реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> вопросы по pic24, помогите новичку)
volodya
сообщение Dec 12 2012, 07:33
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



Цитата(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;
}


Как-то так. Но можно и иначе.


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post
evc
сообщение Dec 12 2012, 08:50
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(volodya @ Dec 12 2012, 11:33) *
Если неизвестно который из сигналов приходит первый , но время необходимо измерить между двумя сигналами можно поступить следующим образом -
1 - установить прерывания на ожидание события.
2 - по свершившемуся событию (на любом из прерываний) проверить флаг (счетчик событий)
2.1 - если флаг сброшен (счетчик событий = 0) и запустить таймер.
2.2 - если флаг установлен (счетчик событий = 1) остановить таймер и получить время между событиями, установить признак готовности времени для основной программы.


А можно и еще проще - сделать два одинаковых обработчика прерываний INT0 и INT1.
Еще на входе делать поверку - работает ли Таймер1 или нет (бит 15 в регистре T1CON - "1" или "0"?).
Если работает, записать результат и остановить Таймер1. Если не работает, обнулить и запустить Таймер1.
Но это не отменяет необходимость обработчика прерываний от Таймера1.
Потому что, если Таймер1 переполнится, результат будет искажен.

Цитата(volodya @ Dec 12 2012, 11:33) *
else
{
if(pilse != countPulse)/*ожидать второго пульса*/
{
/*остановить таймер, зафиксировать резыльтат*/
countPulse = 0; /*сбросить флаг для следующего замера*/

Наверное опечатка. Должно быть "u".


--------------------
УЭР
Go to the top of the page
 
+Quote Post
volodya
сообщение Dec 12 2012, 12:06
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



Цитата(evc @ Dec 12 2012, 10:50) *


Опечатку исправил - спасибо за подсказку.

Согласен - контроль переполнения таймера необходим (особенно если события разделяют большие промежутки времени) и в общем достоверность результата повысится.



--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post
evc
сообщение Dec 12 2012, 13:01
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(volodya @ Dec 12 2012, 16:06) *
Опечатку исправил - спасибо за подсказку.

Код
else
  {
    if(p[u]u[/u]lse != countPulse)/*ожидать второго пульса*/ /*очепятку исправил */
    {
      /*остановить таймер, зафиксировать резыльтат*/
      countPulse = 0; /*сбросить флаг для следующего замера*/
      timeResult = ReadTimerX();
      timeOk = 1;


Когда включен тег "code", внутри этого "кода", теги не учитываются.
Да и я не вам это писал, а тому, кто будет копи-пейстит.


--------------------
УЭР
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.03163 секунд с 7
ELECTRONIX ©2004-2016