Перейти к содержанию
    

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

for'ом уже не катит. пришла в голову мыслю использования прерывания, но вот как... хз.

нашел несколько примеров, но мне они показались странными...

 

напишите, кто как реализует задержку на несколько нс (сек)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

напишите, кто как реализует задержку на несколько нс (сек)?

Так несколько нс или несколько с?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нс =)

Несколько нс (наносекунд) как-то сами образуются, там не только прерывания не нужны, там вообще ничего не нужно. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Несколько нс (наносекунд) как-то сами образуются, там не только прерывания не нужны, там вообще ничего не нужно. :)

 

 

это если нужно 10нс...

мне нужно 140нс - 450нс - 1000нс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это если нужно 10нс...

мне нужно 140нс - 450нс - 1000нс

У меня интервал между прерываниями по таймеру составляет 500 нс, и действительно делаю задержку с такой точностью с помощью прерывания от таймера. То есть 450 нс = Delay(1), 1000нс=Delay(2).

Задержку меньше 500 нс реализую с помощью встроенной в компилятор функции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а примерчик можешь дать?

Де жа вю...

 

//******* DELAY SUPPORT *******//

__no_init int delay_count;

 

void StartDelay(int t)

{ delay_count=t; }

 

void Delay(int t)

{ StartDelay(t); while(delay_count>0) CheckTimeAndResetWDT() ; }

 

void BackgroundService()

{ // Delay service

if (delay_count) delay_count--;

}

 

void TimerBConfiguration(void)

{ __bic_SR_register OSCOFF;

TBCTL = TBSSEL_2 + TBCLR + MC_0; // Timer B counts SMCLK clocks continuos

TBCCTL0 = CCIE; // module 0 configuration

TBCCR0 = MaxB; // period of timer overflow

TBCTL |= MC_1; // timer start to "UP" mode

};

 

#pragma vector=TIMERB0_VECTOR

__interrupt void TimerB_modul0()

{ __enable_interrupt();

ResetWDT1;

BackgroundService();

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

эм... чтото не воткну =)

выложи плиз все ф-ции. плиз

Изменено пользователем CAHTA_1939

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, вы обалдели что ли? :07: Судя по тому, что тема в разделе MSP430, то вопрос применительно к нему. Так про какие наносекунды гутарим-то? :cranky: Ядро MSP430 кроме серии MSP430F2xxx может тактироваться частотой максимум 8МГц. Т.е. период клока - 125нс. Вход в прерывание - 6 тактов (>=750нс), выход из прерывания 5 тактов (>=625нс). О каком формировании интервала меньше 1,2мкс с помощью прерывания может вообще идти речь? Такие задержки на MSP430 только NOP-ами формируются! :1111493779:

P.S. на такт ошибся с прерываниями. Исправил.

Изменено пользователем rezident

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот блин... то есть задержки нужно мутить NOD'ами и осциллографом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот блин... то есть задержки нужно мутить NOD'ами и осциллографом?

Можно и без осциллографа обойтись. Количество тактов за которое выполняется каждая команда в User's Manual описано. команда NOP за 1 такт выполняется. Если тактовая 8МГц, то два NOP дадут задержку 250нс, 4 NOP - 500нс. Формировать задержку с помощью прерываний имеет смысл только при временах в десятки-сотни мкс или больше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну лан, с "нс" я понял , а что делать с "мс" ? как их мутить? нужна задержка от 100мс до 1000мс с шагом примерно 20-50мс

 

помогите плиз

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как их мутить? нужна задержка от 100мс до 1000мс с шагом примерно 20-50мс

У меня тикает прерывание каждую милисекунду и есть глобальная переменная

volatile unsigned long tick_ms;        // милисекундные тики, хватит на 49 дней непрерывной работы прибора

тогда милисекундная задержка выглядит так

void delay( unsigned long del )
{
  for ( del += tick_ms; del > tick_ms; )
;
}

получается от 1мс до 49 дней, с шагом 1 мс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня тикает прерывание каждую милисекунду и есть глобальная переменная

volatile unsigned long tick_ms;        // милисекундные тики, хватит на 49 дней непрерывной работы прибора

тогда милисекундная задержка выглядит так

void delay( unsigned long del )
{
  for ( del += tick_ms; del > tick_ms; )
;
}

получается от 1мс до 49 дней, с шагом 1 мс

+1. Только у меня в зависимости от задачи тикает с периодом от 1мс до 32мс. Но отсчет времени все равно в мс идет. Просто инкремент тиков на величину периода происходит.

#define SYSTEM_TICK_MS 10UL  //период системных тиков 10мс

tick_ms+=SYSTEM_TICK_MS; //инкремент счетчика системных тиков

Сформировать задержку очень просто

unsigned long tmp=tick_ms;
while ((tick_ms-tmp)<5000); //задержка на 5 сек

При таком способе даже момент переполнения счетчика tick_ms не влияет на отсчет временного интервала, т.к. в цикле ожидания вычитание беззнаковых величин происходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...