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

 
 
> задержка aka Delay, кто как пишет
CAHTA_1939
сообщение Aug 18 2007, 18:08
Сообщение #1


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

Группа: Участник
Сообщений: 142
Регистрация: 11-08-07
Пользователь №: 29 713



начал программировать жки ака MT-12864J. и столкнулся с необходимостью задержки на несколько нс.
for'ом уже не катит. пришла в голову мыслю использования прерывания, но вот как... хз.
нашел несколько примеров, но мне они показались странными...

напишите, кто как реализует задержку на несколько нс (сек)?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
FREEKER
сообщение Sep 12 2007, 19:25
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 24-06-06
Пользователь №: 18 330



Вот очень элементарный пример задержки smile.gif
Функция Delay() - небольшая задержка в 550мкс и функция Big_Delay() - несколько секунд, а мож и больше smile.gif зависит от Delay() также. При кварце 8MHz.

Код
void Delay(void)
{
unsigned int t;
for (t=730; t>0; t--);          //(4 такта For)
}

void Big_Delay(void)
{
unsigned int y;
for (y=5000; y>0; y--)
Delay();
}


Но с таймером мне тоже не всё понятно. Разъясните. Как сделать следующее. Допустим тикает таймер. Нужно остановить его и замерить время по приходу на порт P2.2 логической "1", т.е. по перепаду с 0 на 1. или наоборот.
Flag = P2IFG & 0x04; //Устанавливается флаг при перепаде 1>0
Либо замерить время единичного импулься. т.е. по перепадам 0-1 и 1-0.
Можно пример!? На примере понятней, особенно с коментами.
beer.gif
Rezident. Вам отдельная благодарность.
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 12 2007, 20:40
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(FREEKER @ Sep 13 2007, 01:25) *
Но с таймером мне тоже не всё понятно. Разъясните. Как сделать следующее. Допустим тикает таймер. Нужно остановить его и замерить время по приходу на порт P2.2 логической "1", т.е. по перепаду с 0 на 1. или наоборот.

Ну для этого таймер останавливать не обязательно. Используйте функцию захвата таймера.
Код
#define CAP_TICKOVFCNTR 0x00010000

volatile unsigned long smplTime, smplOvfCntr;

//================================================//
// Инициализация таймера захвата входной частоты  //
//------------------------------------------------//
//аргументы :нет                                  //
//возвращает:нет                                  //
//================================================//
void initTimerCAP(void)
{ TACTL=TASSEL_2|ID_0|TAIE|TACLR;                 //TACLK=SMCLK/1, прерыв. от переполнения
                                                  //разрешено
  TACCR0=0;                                       //результат захвата
  TACCTL0=CM_1|CCIS_1|CAP;                        //режим захвата по нараст. фронту
                                                  //вход захвата CCI0B (P2.2)
  P2SEL|=BIT2;                                    //P2.2 - CCI0B
  P2DIR&=~BIT2;                                   //P2.2 - вход
  TACTL|=MC_2;                                    //пуск в режиме Continous
}
//================================================//
// Запуск таймера сэмплирования                   //
//------------------------------------------------//
//аргументы :нет                                  //
//возвращает:текущую метку времени                //
//================================================//
unsigned long fStartTimerCap(void)
{ unsigned int buf;
  TACCTL0=CM_3|CCIS_3|CAP;                        //режим захвата по любому фронту
                                                  //вход захвата=VCC
  TACCTL0^=CCIS0;                                 //формируем программно перепад
  buf=TACCR0;                                     //получаем текущее значение TAR
  TACCTL0=CM_1|CCIS_1|CAP;                        //режим захвата по нараст. фронту
  smplTime=smplOvfCntr+buf;                       //получим текущую временную метку
  TACCTL0|=CCIE;                                  //разрешим прерывание при захвате
  return(smplTime);
}
//================================================//
// Обработчик прерывания таймера сэмплирования    //
//------------------------------------------------//
//аргументы :нет                                  //
//возвращает:нет                                  //
//================================================//
#pragma vector=TIMERA0_VECTOR
#pragma type_attribute=__interrupt
void TimerA0_ISR(void)
{ unsigned int buf;
  buf=TACCTL0;                                    //временная метка захвата
  smplTime=smplOvfCntr+buf;                       //просуммирует с таймером переполнений
  TACCTL0&=~CCIE;                                 //сбросим разреш. прерывания захвата
}
//================================================//
// Обработчик прерывания переполнений таймера     //
//------------------------------------------------//
//аргументы :нет                                  //
//возвращает:нет                                  //
//================================================//
#pragma vector=TIMERA1_VECTOR
#pragma type_attribute=__interrupt
void TimerA1_ISR(void)
{ switch(TAIV)
  { default:
    case 0x02:
    case 0x04:
      break;
    case 0x0A:
      smplOvfCntr+=CAP_TICKOVFCNTR;               //инкремент счетчика переполнений
      break;
  }
}

Таймер в моем примере считает постоянно на максимальной частоте SMCLK c переполнением (от 0 до 0xFFFF и дальше). Чтобы расширить измеряемый временной интервал введена 32-битная переменная smplTime, которая суммируется с 32-битным счетчиком переполнений smplOvfCntr. Максимальный временной интервал измеряемый при этом может быть вычислен как число 0xFFFFFFFF деленное на значение частоты SMCLK. Для SMCLK=8MHz этот интервал составляет почти 9 минут.
initTimerCAP - функция начальной инициализации ТаймераА
fStartTimerCap - функция запуска периода ожидания срабатывания ловушки перехода 0->1 на входе P2.2. Она возвращает начальную метку времени. После ее запуска нужно ожидать сброса бита разрешения прерывания CCIE в регистре TACCTL0. Сброс бита будет означать, что ловушка сработала и в переменной smplTime мы имеет соответствующую метку времени. Разница между текущим значением smplTime и значением которая вернула функция fStartTimerCap будет искомым интервалом ожидания от момента запуска до срабатывания ловушки. Для пересчета этой величины в привычные секунды smplTime нужно поделить на значение тактирующей частоты SMCLK.
P.S. еще пояснение. "Хитрая" манипуляция в функции fStartTimerCap
Код
  TACCTL0=CM_3|CCIS_3|CAP;
  TACCTL0^=CCIS0;

обсуловлена тем, что в общем случае MCLK и SMCLK могут быть асинхронными. Например, MCLK от DCO тактируется, а SMCLK от кварцевого генератора. Если при таких условиях попытаться впрямую считать значение TAR без останова таймера, то можно получить неверное значение.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- CAHTA_1939   задержка aka Delay   Aug 18 2007, 18:08
- - Dog Pawlowa   Цитата(CAHTA_1939 @ Aug 18 2007, 21:08) н...   Aug 18 2007, 20:31
|- - CAHTA_1939   Цитата(Dog Pawlowa @ Aug 19 2007, 00:31) ...   Aug 18 2007, 20:42
|- - Dog Pawlowa   Цитата(CAHTA_1939 @ Aug 18 2007, 23:42) н...   Aug 18 2007, 20:52
|- - CAHTA_1939   Цитата(Dog Pawlowa @ Aug 19 2007, 00:52) ...   Aug 18 2007, 20:57
|- - Dog Pawlowa   Цитата(CAHTA_1939 @ Aug 18 2007, 23:57) э...   Aug 18 2007, 21:45
- - CAHTA_1939   а примерчик можешь дать?   Aug 18 2007, 21:55
|- - Dog Pawlowa   Цитата(CAHTA_1939 @ Aug 19 2007, 00:55) а...   Aug 18 2007, 22:13
- - CAHTA_1939   эм... чтото не воткну =) выложи плиз все ф-ции. пл...   Aug 18 2007, 22:30
- - rezident   Господа, вы обалдели что ли? Судя по тому, что т...   Aug 18 2007, 22:57
|- - Dog Pawlowa   Цитата(rezident @ Aug 19 2007, 01:57) Гос...   Aug 19 2007, 18:29
- - CAHTA_1939   вот блин... то есть задержки нужно мутить NOD...   Aug 18 2007, 23:06
|- - rezident   Цитата(CAHTA_1939 @ Aug 19 2007, 05:06) в...   Aug 18 2007, 23:19
- - CAHTA_1939   ну лан, с "нс" я понял , а что делать с...   Aug 19 2007, 12:54
- - VAI   Цитатакак их мутить? нужна задержка от 100мс до 10...   Aug 19 2007, 13:48
|- - rezident   Цитата(VAI @ Aug 19 2007, 19:48) У меня т...   Aug 19 2007, 17:53
- - CAHTA_1939   а можно поподробней. как настроить тикание =) ибо ...   Aug 19 2007, 19:14
- - rezident   Для кварца 8Мгц используемого в качестве источника...   Aug 19 2007, 20:57
- - CAHTA_1939   ппц как мудрено. а попроше нет ничего? я же тока н...   Aug 19 2007, 21:52
- - rezident   Куда уж проще-то? И так ничего лишнего. Только m...   Aug 19 2007, 22:10
- - aag   По идее можно код обработки прерывания ошибки квар...   Aug 24 2007, 06:38
|- - rezident   Цитата(aag @ Aug 24 2007, 12:38) По идее ...   Aug 24 2007, 13:51
- - a1ex   Вот я задержку пишу так: void delay(unsigned int ...   Dec 3 2007, 16:47
- - Сергей Борщ   Цитата(a1ex @ Dec 3 2007, 18:47) Может кт...   Dec 3 2007, 17:22


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

 


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


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