|
задержка aka Delay, кто как пишет |
|
|
|
Aug 18 2007, 20:42
|

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

|
Цитата(Dog Pawlowa @ Aug 19 2007, 00:31)  Так несколько нс или несколько с? нс =)
|
|
|
|
|
Aug 18 2007, 20:57
|

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

|
Цитата(Dog Pawlowa @ Aug 19 2007, 00:52)  Несколько нс (наносекунд) как-то сами образуются, там не только прерывания не нужны, там вообще ничего не нужно.  это если нужно 10нс... мне нужно 140нс - 450нс - 1000нс
|
|
|
|
|
Aug 18 2007, 22:13
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(CAHTA_1939 @ Aug 19 2007, 00:55)  а примерчик можешь дать? Де жа вю... //******* 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(); }
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Aug 19 2007, 13:48
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37

|
Цитата как их мутить? нужна задержка от 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 мс
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Aug 19 2007, 17:53
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(VAI @ Aug 19 2007, 19:48)  У меня тикает прерывание каждую милисекунду и есть глобальная переменная Код 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 не влияет на отсчет временного интервала, т.к. в цикле ожидания вычитание беззнаковых величин происходит.
|
|
|
|
|
Sep 12 2007, 19:25
|

Участник

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

|
Вот очень элементарный пример задержки  Функция Delay() - небольшая задержка в 550мкс и функция Big_Delay() - несколько секунд, а мож и больше  зависит от 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. Можно пример!? На примере понятней, особенно с коментами. Rezident. Вам отдельная благодарность.
|
|
|
|
|
Sep 12 2007, 20:40
|
Гуру
     
Группа: Свой
Сообщений: 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 без останова таймера, то можно получить неверное значение.
|
|
|
|
|
Dec 3 2007, 16:47
|
Группа: Новичок
Сообщений: 13
Регистрация: 29-11-07
Из: Jurmala
Пользователь №: 32 821

|
Вот я задержку пишу так:
void delay(unsigned int a) {unsigned int k; for(k=0;k!=a;++k) { }
Ну и соответсвенно, чтобы точно задержку задать, приходиться смотреть осцилографом, и все время значение а подгонять.. Может кто знает как вычислить сколько такой цикл занимает тактов? Пример: а =10000;(MCLK) DCO = ~800kHz;
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|