CAHTA_1939 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба начал программировать жки ака MT-12864J. и столкнулся с необходимостью задержки на несколько нс. for'ом уже не катит. пришла в голову мыслю использования прерывания, но вот как... хз. нашел несколько примеров, но мне они показались странными... напишите, кто как реализует задержку на несколько нс (сек)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба напишите, кто как реализует задержку на несколько нс (сек)? Так несколько нс или несколько с? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CAHTA_1939 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба Так несколько нс или несколько с? нс =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба нс =) Несколько нс (наносекунд) как-то сами образуются, там не только прерывания не нужны, там вообще ничего не нужно. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CAHTA_1939 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба Несколько нс (наносекунд) как-то сами образуются, там не только прерывания не нужны, там вообще ничего не нужно. :) это если нужно 10нс... мне нужно 140нс - 450нс - 1000нс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба это если нужно 10нс... мне нужно 140нс - 450нс - 1000нс У меня интервал между прерываниями по таймеру составляет 500 нс, и действительно делаю задержку с такой точностью с помощью прерывания от таймера. То есть 450 нс = Delay(1), 1000нс=Delay(2). Задержку меньше 500 нс реализую с помощью встроенной в компилятор функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CAHTA_1939 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба а примерчик можешь дать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба а примерчик можешь дать? Де жа вю... //******* 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 0 18 августа, 2007 Опубликовано 18 августа, 2007 (изменено) · Жалоба эм... чтото не воткну =) выложи плиз все ф-ции. плиз Изменено 18 августа, 2007 пользователем CAHTA_1939 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 18 августа, 2007 Опубликовано 18 августа, 2007 (изменено) · Жалоба Господа, вы обалдели что ли? :07: Судя по тому, что тема в разделе MSP430, то вопрос применительно к нему. Так про какие наносекунды гутарим-то? :cranky: Ядро MSP430 кроме серии MSP430F2xxx может тактироваться частотой максимум 8МГц. Т.е. период клока - 125нс. Вход в прерывание - 6 тактов (>=750нс), выход из прерывания 5 тактов (>=625нс). О каком формировании интервала меньше 1,2мкс с помощью прерывания может вообще идти речь? Такие задержки на MSP430 только NOP-ами формируются! :1111493779: P.S. на такт ошибся с прерываниями. Исправил. Изменено 18 августа, 2007 пользователем rezident Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CAHTA_1939 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба вот блин... то есть задержки нужно мутить NOD'ами и осциллографом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба вот блин... то есть задержки нужно мутить NOD'ами и осциллографом? Можно и без осциллографа обойтись. Количество тактов за которое выполняется каждая команда в User's Manual описано. команда NOP за 1 такт выполняется. Если тактовая 8МГц, то два NOP дадут задержку 250нс, 4 NOP - 500нс. Формировать задержку с помощью прерываний имеет смысл только при временах в десятки-сотни мкс или больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CAHTA_1939 0 19 августа, 2007 Опубликовано 19 августа, 2007 · Жалоба ну лан, с "нс" я понял , а что делать с "мс" ? как их мутить? нужна задержка от 100мс до 1000мс с шагом примерно 20-50мс помогите плиз Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 19 августа, 2007 Опубликовано 19 августа, 2007 · Жалоба как их мутить? нужна задержка от 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 мс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 19 августа, 2007 Опубликовано 19 августа, 2007 · Жалоба У меня тикает прерывание каждую милисекунду и есть глобальная переменная 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 не влияет на отсчет временного интервала, т.к. в цикле ожидания вычитание беззнаковых величин происходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться