Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 07.10.2008, 01:40   #1
Pirat
Member
 
Аватар для Pirat
 
Регистрация: 06.10.2008
Адрес: Донецк
Возраст: 33
Сообщений: 40
Вес репутации: 105/43
Pirat will become famous soon enoughPirat will become famous soon enough
Question Точная задержка

Кто-нибудь подскажет как сделать точную подпрограмму задержки. Не подбирать же каждый раз параметр. Например, требуется чтобы
...
while(1){
PortB=0b00001110;
Delay_Ms(1000); // Задержать на секунду
...
PortB=0b00100110;
Delay_Ms(1000);
}
...
Но ведь в реальности выйдет запаздывание.
Так что использовать
Pirat вне форума   Ответить с цитированием
Старый 07.10.2008, 02:31   #2
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от Pirat Посмотреть сообщение
Так что использовать
Таймер.
IceS вне форума   Ответить с цитированием
Старый 07.10.2008, 08:24   #3
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,925
Вес репутации: 5709/174
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от IceS Посмотреть сообщение
Таймер.
с модулями compare
Greg вне форума   Ответить с цитированием
Старый 07.10.2008, 09:17   #4
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,131
Вес репутации: 4577/129
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Ответ: Точная задержка

А Delay_Ms лучше вообще не использовать, это-ж непомерная расточительность на 1 сек. проц "вешать" (за исключением прерываний естно)
__________________

Vanizma вне форума   Ответить с цитированием
Старый 07.10.2008, 10:10   #5
Mario
Senior Member
 
Аватар для Mario
 
Регистрация: 21.04.2007
Сообщений: 516
Вес репутации: 1151/63
Mario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud of
По умолчанию Ответ: Точная задержка

Мне тоже не совсем понравился хайтековский пример с Delay.c и Delay.h из-за высоких погрешностей.
Поэтому предложу свой вариант. Отличия от хайтековского: добавлено приведение типов дроби к (float) чтобы повысить точность (важно для случаев когда частота кварца близка к 12МГц, например 11059200Гц), а также вывод предупреждений о максимальном значении параметра _х_ в DelayUs(x) (чтобы можно было получить DelayMs для разных частот кварца и отсчитать 20 задержек по 50мкс для случая >12МГц или 4 задержки по 250мкс для случая <12МГц). В проект включить три файла: HardwareProfile.h, Delay.c, Delay.h.
OSC_FREQ не должно быть больше 40МГц. В своем файле я включил также работу задержек и для случаев больше 40 и 120МГц для симуляции в протеусе, но сюда не включил.
Согласен с Vanizma, не стоит включать в код слишком длинные задержки более 1000 машинных циклов.
Код:
 //HardwareProfile.h 
#ifndef __HARDWARE_PROFILE_H
#define __HARDWARE_PROFILE_H

#define    XTAL_FREQ        11059200L    // Crystal frequency in Hz
#define    XTAL_PLL        0        //

#if XTAL_PLL == 1
    #define    OSC_FREQ        (XTAL_FREQ*4)
    #define    CLOCK_FREQ        (XTAL_FREQ)
#elif XTAL_PLL == 0
    #define    OSC_FREQ        (XTAL_FREQ)
    #define    CLOCK_FREQ        (XTAL_FREQ/4)
#endif

#endif    //__HARDWARE_PROFILE_H
Код:
 //Delay.h
#ifndef __DELAY_H
#define __DELAY_H

#define    MHZ    *1000000L        /* number of Hz in a MHz */
#define    KHZ    *1000L            /* number of Hz in a kHz */

#if    OSC_FREQ >= 12MHZ
    #if (OSC_FREQ/(12MHZ)) == 1
        #warning In DelayUs(x) the x must be lower than 128.
    #elif (OSC_FREQ/(12MHZ)) == 2
        #warning In DelayUs(x) the x must be lower than 85.
    #elif (OSC_FREQ/(12MHZ)) == 3
        #warning In DelayUs(x) the x must be lower than 64.
    #endif
#else
    #if ((12MHZ)/OSC_FREQ) == 1
        #warning In DelayUs(x) the x must be lower than 256.
    #elif ((12MHZ)/OSC_FREQ) == 2
        #warning In DelayUs(x) the x must be lower than 512.
    #elif ((12MHZ)/OSC_FREQ) == 3
        #warning In DelayUs(x) the x must be lower than 768.
    #elif ((12MHZ)/OSC_FREQ) == 4
        #warning In DelayUs(x) the x must be lower than 1024.
    #endif
#endif

#if OSC_FREQ >= 12MHZ
    #define    DelayUs(x)                                                \
        {                                                            \
            unsigned char _dcnt;                                    \
            _dcnt = (unsigned char)((x)*((float)OSC_FREQ/(12MHZ)));    \
            while(--_dcnt != 0)                                        \
                continue;                                            \
        }
#else
    #define    DelayUs(x)                                                \
        {                                                            \
            unsigned char _dcnt;                                    \
            _dcnt = (unsigned char)((x)/((float)(12MHZ)/OSC_FREQ));    \
            while(--_dcnt != 0)                                        \
                continue;                                            \
        }
#endif

extern void DelayMs(WORD);

#endif // __DELAY_H
Код:
 //Delay.c 
#define __DELAY_C

#include "Header.h"

void
DelayMs(WORD cnt){
    unsigned char    i;
    while(cnt--){
        #if    OSC_FREQ >= 12MHZ
            i = 20;
            while(i--){
                DelayUs(50);
            }
        #else
            i = 4;
            while(i--){
                DelayUs(250);
            }
        #endif
    }
}
__________________
if(!Operate) Read(pDatasheet);
Mario вне форума   Ответить с цитированием
Старый 07.10.2008, 12:13   #6
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/103
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Ответ: Точная задержка

Все уже написано до нас. Поиск #define DelayUs(x) Кстати метки также присутствуют.
DL36 вне форума   Ответить с цитированием
Старый 02.12.2008, 18:48   #7
Pirat
Member
 
Аватар для Pirat
 
Регистрация: 06.10.2008
Адрес: Донецк
Возраст: 33
Сообщений: 40
Вес репутации: 105/43
Pirat will become famous soon enoughPirat will become famous soon enough
По умолчанию Ответ: Точная задержка

Или я чего-то не понял, или меня не поняли... Мне нужно следующее.

while(1){
+
PortB=0b00001110;
....// еще две-три команды
+
// такая задержка, чтобы все это было равным 1 секунде.
}

Вот Вы говорите, таймер. А не подскажите, где можно посмотреть простенькие проги на любой вкус (в т. ч. и таймер). Чтобы разобратся как именно он работает в реализации.
И еще. При подключении тех двух кодов, что описаны выше появляется ошибки
e:/pic/XXX/delay.c:10: error: Not an integer "12MHZ"
#if OSC_FREQ >= 12MHZ
from e:/pic/XXX/pr.c: 1: #include "delay.c"
from E:/PIC/XXX/Taimer.c: 1: #include "PR.c"
1 error in preprocessor.
Это из-за того, что OSC_FREQ нигде не объявленная?
Кстати работаю в среде microC

Последний раз редактировалось Pirat; 03.12.2008 в 01:01.
Pirat вне форума   Ответить с цитированием
Старый 03.12.2008, 09:49   #8
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/103
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от Pirat Посмотреть сообщение
Кстати работаю в среде microC
Смотрите в папке с примерами своего компилятора.
DL36 вне форума   Ответить с цитированием
Старый 04.12.2008, 10:11   #9
Mario
Senior Member
 
Аватар для Mario
 
Регистрация: 21.04.2007
Сообщений: 516
Вес репутации: 1151/63
Mario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud of
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от Pirat Посмотреть сообщение
Или я чего-то не понял, или меня не поняли... Мне нужно следующее.
Каков вопрос - таков ответ.

Цитата:
Сообщение от Pirat Посмотреть сообщение
Это из-за того, что OSC_FREQ нигде не объявленная?
Кстати работаю в среде microC
Посмотрите внимательнее, OSC_FREQ объявляется в HardwareProfile.h. Я приводил примеры для HI-TECH, на счет microC ничего не подскажу.

Цитата:
Сообщение от Pirat Посмотреть сообщение
while(1){
+
PortB=0b00001110;
....// еще две-три команды
+
// такая задержка, чтобы все это было равным 1 секунде.
}
Может быть тут стоит задать вопрос по другому, не "как сделать точную подпрограмму задержки"? А как организовать вызов программы через точные промежутки времени? Или опишите конечную задачу, что вам нужно - динамически выводить индикацию, обмен данными, опрос датчиков?
__________________
if(!Operate) Read(pDatasheet);
Mario вне форума   Ответить с цитированием
Старый 04.12.2008, 18:34   #10
Pirat
Member
 
Аватар для Pirat
 
Регистрация: 06.10.2008
Адрес: Донецк
Возраст: 33
Сообщений: 40
Вес репутации: 105/43
Pirat will become famous soon enoughPirat will become famous soon enough
По умолчанию Ответ: Точная задержка

Программа управления светофором по вызову. Плюс выводить на экран сколько пешеходу остлалось времени (в сек.), чтобы перейти дорогу, либо сообщение STOP. Вроде через таймер сделал вывод на индикатор и управляю светофором, но теперь другая проблема, не реализуется прерывание со входа RB0 (Хочу запустить переключение светофора). Не пойму в чем дело. Делаю как в документации написано, а оно все равно в протеусе показывает, что нету прерывания.

Последний раз редактировалось Pirat; 04.12.2008 в 19:00.
Pirat вне форума   Ответить с цитированием
Старый 04.12.2008, 21:38   #11
Pirat
Member
 
Аватар для Pirat
 
Регистрация: 06.10.2008
Адрес: Донецк
Возраст: 33
Сообщений: 40
Вес репутации: 105/43
Pirat will become famous soon enoughPirat will become famous soon enough
По умолчанию Ответ: Точная задержка

Код:
void Init(){
  INTCON = 0;
  INTCON.GIE = 1;       //Глобальное разрешение прерываний.
  INTCON.T0IE = 1;      //Разрешены прерывания по переполнению TMR0
//  INTCON.INTE = 1;      //Разрешение внешнего прерывания INT
  TRISC = 0;            // PORTB is output
  PORTC = 0xFF;            // Initialize PORTC
  TRISB = 0b10000000;            // PORTB is output
  PORTB = 0b00000000;            // Initialize PORTC
  TRISA = 0b11110000;   // PORTA is output
  PORTA = 0;            // Initialize PORTB
  interrupt_STOP = 0;    // Initialize cnt
  interrupt_RB0 = 0;


 OPTION_REG = 10000001;     //Бит 7 - подтягивающие резисторы отключены.
                            //Бит 6 - прерывание по переднему фронту
                            //Биты 2-0 - установка предделителя. (1:4)
}

Последний раз редактировалось Pirat; 04.12.2008 в 21:45.
Pirat вне форума   Ответить с цитированием
Старый 05.12.2008, 00:18   #12
Pirat
Member
 
Аватар для Pirat
 
Регистрация: 06.10.2008
Адрес: Донецк
Возраст: 33
Сообщений: 40
Вес репутации: 105/43
Pirat will become famous soon enoughPirat will become famous soon enough
По умолчанию Ответ: Точная задержка

А можно ли формировать задержку на 1 секунду с помощью таймера?
Pirat вне форума   Ответить с цитированием
Старый 05.12.2008, 00:59   #13
Pirat
Member
 
Аватар для Pirat
 
Регистрация: 06.10.2008
Адрес: Донецк
Возраст: 33
Сообщений: 40
Вес репутации: 105/43
Pirat will become famous soon enoughPirat will become famous soon enough
По умолчанию Ответ: Точная задержка

А ничего, если я это все запхаю в interrupt?
Код:
void STOP (void){               // Засветить на ЗСИ STOP

       if(interrupt_STOP == 2) {
        PORTA = 0b00000001; Delay_10us; PORTC = Numeral('S');
        }

       if(interrupt_STOP == 4) {
        PORTA = 0b00000010; Delay_10us; PORTC = Numeral('T');
        }

       if(interrupt_STOP == 6) {
        PORTA = 0b00000100; Delay_10us; PORTC = Numeral('O');
        }

       if(interrupt_STOP == 8) {
         PORTA = 0b00001000; Delay_10us; PORTC = Numeral('P');
            interrupt_STOP = 0;
        }
}
Pirat вне форума   Ответить с цитированием
Старый 05.12.2008, 02:29   #14
majorPAE
Super Moderator
 
Аватар для majorPAE
 
Регистрация: 26.02.2007
Возраст: 58
Сообщений: 2,221
Вес репутации: 2214/92
majorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond repute
Отправить сообщение для majorPAE с помощью ICQ Отправить сообщение для majorPAE с помощью Skype™
По умолчанию Ответ: Точная задержка

Задержки в прерываниях? ИМХО, это очень нехорошо...
__________________
ЗАКОH ТРУДHОСТЕЙ БИЛЛИHГСА: Большинство тpyдностей пpоисходит оттого, что мы слишком быстpо говоpим ДА и недостаточно быстpо - НЕТ.(с)
"Очередной шаг вперед, как правило, результат хорошего пинка в зад!"(С)
majorPAE вне форума   Ответить с цитированием
Старый 05.12.2008, 09:51   #15
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,925
Вес репутации: 5709/174
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от Pirat Посмотреть сообщение
А можно ли формировать задержку на 1 секунду с помощью таймера?
да, можно. Таймер переполняется, и эти переполнения надо считать в прерваниях
Greg вне форума   Ответить с цитированием
Старый 05.12.2008, 10:35   #16
Mario
Senior Member
 
Аватар для Mario
 
Регистрация: 21.04.2007
Сообщений: 516
Вес репутации: 1151/63
Mario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud of
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от Pirat Посмотреть сообщение
А можно ли формировать задержку на 1 секунду с помощью таймера?
Как и сказал Greg нужно считать переполнения таймера, которые зависят от частоты кварца, PLL, разрядности таймера и коэффициента деления предделителя. Заводите в прерываниях переменную и увеличиваете ее на один, так считается системное время (тики). А в основном цикле программы сравниваете эти тики для каждого отдельного процесса. При этом вам не нужно все пихать в прерывания ведь индикация светофора не требует такой точности.
Вот я тут накидал очень общий пример. От вас только требуется переделать его под себя и настроить прерывание таймера. Погоняйте в протеусе, разберитесь хорошенько, вы ведь все-таки делаете светофор, а не новогоднюю гирлянду.

Код:
#include <pic.h>

typedef unsigned long long    TICK;

static volatile TICK TickCount = 0;

#define TICKS_PER_SECOND        (1000)                            // 1ms
#define TICK_SECOND                ((TICK)TICKS_PER_SECOND)
#define T_LIGHT_BLINK_TIMEOUT    TICK_SECOND*1

void TickUpdate(void)
{
    TickCount++;
}

TICK TickGet(void)
{
    return TickCount;
}

void
main(void){
    static TICK t_Light_Blink;

    if(TickGet() - t_Light_Blink >= T_LIGHT_BLINK_TIMEOUT){
        t_Light_Blink = TickGet();
        // Делаете что вам нужно раз в секунду.
    }
}

static void interrupt
isr(void){        // Here be interrupt function - the name is unimportant.
    if(T0IE && T0IF){
        T0IF = 0;                // clear the interrupt flag
        TMR0 = 0;
        TickUpdate();
    }
}
P.S. Пример для HI-TECH. Что у вас там с микроси, я хз.
__________________
if(!Operate) Read(pDatasheet);
Mario вне форума   Ответить с цитированием
Старый 05.12.2008, 12:17   #17
Pirat
Member
 
Аватар для Pirat
 
Регистрация: 06.10.2008
Адрес: Донецк
Возраст: 33
Сообщений: 40
Вес репутации: 105/43
Pirat will become famous soon enoughPirat will become famous soon enough
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от Mario Посмотреть сообщение
P.S. Пример для HI-TECH. Что у вас там с микроси, я хз.
С он везде С.
Спасибо.

А обязательно ставить кварц для пика, в реальности? Или он сам по себе может работать с определенной частотой?
Pirat вне форума   Ответить с цитированием
Старый 05.12.2008, 12:43   #18
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 43
Сообщений: 3,577
Вес репутации: 4386/126
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от Mario Посмотреть сообщение
Вот я тут накидал очень общий пример.
Код:
#include <pic.h>
 
typedef unsigned long long    TICK;
 
static volatile TICK TickCount = 0;
 
#define TICKS_PER_SECOND        (1000)                            // 1ms
#define TICK_SECOND                ((TICK)TICKS_PER_SECOND)
#define T_LIGHT_BLINK_TIMEOUT    TICK_SECOND*1
 
void TickUpdate(void)
{
    TickCount++;
}
 
TICK TickGet(void)
{
    return TickCount;
}
 
void
main(void){
    static TICK t_Light_Blink;
 
    if(TickGet() - t_Light_Blink >= T_LIGHT_BLINK_TIMEOUT){
        t_Light_Blink = TickGet();
        // Делаете что вам нужно раз в секунду.
    }
}
 
static void interrupt
isr(void){        // Here be interrupt function - the name is unimportant.
    if(T0IE && T0IF){
        T0IF = 0;                // clear the interrupt flag
        TMR0 = 0;
        TickUpdate();
    }
}
Хороший пример. Но нужно быть осторожнее с чтением многобайтовой переменной, которая меняется в прерывании. PICC не блокирует прерывания при работе с volatile переменными. Поэтому может получиться так, что в момент чтения произойдет прерывание, и старшие байты могут измениться уже после того, как младшие прочитаны. Так что нужно запрещать прерывания на момент чтения переменной.
tester вне форума   Ответить с цитированием
Старый 05.12.2008, 13:07   #19
masterzx
Senior Member
 
Аватар для masterzx
 
Регистрация: 21.09.2007
Адрес: Барнаул
Возраст: 34
Сообщений: 1,507
Вес репутации: 826/69
masterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to behold
Отправить сообщение для masterzx с помощью ICQ
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от Pirat Посмотреть сообщение
С он везде С.
Спасибо.

А обязательно ставить кварц для пика, в реальности? Или он сам по себе может работать с определенной частотой?
Смотря какой пик... Если в нем есть встроиный генератор то не обезательно... Но надо учитывать что пик ставится в светофоре который работает на улице... В минусовую температуру внутриний генератор может не запустится...
__________________
Если проблему можно решить за деньги, то это не проблема, это расходы. Еврейская мудрость.
masterzx вне форума   Ответить с цитированием
Старый 05.12.2008, 16:03   #20
Pirat
Member
 
Аватар для Pirat
 
Регистрация: 06.10.2008
Адрес: Донецк
Возраст: 33
Сообщений: 40
Вес репутации: 105/43
Pirat will become famous soon enoughPirat will become famous soon enough
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от tester Посмотреть сообщение
Так что нужно запрещать прерывания на момент чтения переменной.
То есть не сбрасывать флаг прерывания TOIF? Или Запретить прерывание таймера по переполнению?
Pirat вне форума   Ответить с цитированием
Старый 05.12.2008, 17:34   #21
Mario
Senior Member
 
Аватар для Mario
 
Регистрация: 21.04.2007
Сообщений: 516
Вес репутации: 1151/63
Mario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud ofMario has much to be proud of
По умолчанию Ответ: Точная задержка

Как вам такой вариант отключения прерывания?
Код:
TICK TickGet(void)
{
    TICK Tick_Temp;
    static bit GIE_temp;
    GIE_temp = GIE;
    GIE = 0;
    Tick_Temp = TickCount;
    GIE = GIE_temp;
    return Tick_Temp;
}
__________________
if(!Operate) Read(pDatasheet);
Mario вне форума   Ответить с цитированием
Старый 05.12.2008, 17:42   #22
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,925
Вес репутации: 5709/174
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от Mario Посмотреть сообщение
Как вам такой вариант отключения прерывания?
Код:
TICK TickGet(void)
{
    TICK Tick_Temp;
    static bit GIE_temp;
    GIE_temp = GIE;
    GIE = 0;
    Tick_Temp = TickCount;
    GIE = GIE_temp;
    return Tick_Temp;
}
в качестве GIE_temp обычно используют бит СARRY
вот пример от того же хайтка

Код:
 
		CARRY=0;if(GIE)CARRY=1;GIE=0;		\
....
		if(CARRY)GIE=1;	
....
и в хайтеке биты всегда глобальные
Greg вне форума   Ответить с цитированием
Старый 05.12.2008, 17:44   #23
Pirat
Member
 
Аватар для Pirat
 
Регистрация: 06.10.2008
Адрес: Донецк
Возраст: 33
Сообщений: 40
Вес репутации: 105/43
Pirat will become famous soon enoughPirat will become famous soon enough
По умолчанию Ответ: Точная задержка

Попробую.
А почему при больших задержках при стандартной функции Delay_Ms, происходит сбрасывание пика? Я понимаю, что это из-за таймера WDT. Но читал, что его отключать нельзя. Как с ним тогда боротся? Постоянно очищать в п/п задержки?
Pirat вне форума   Ответить с цитированием
Старый 05.12.2008, 17:47   #24
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 43
Сообщений: 3,577
Вес репутации: 4386/126
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Ответ: Точная задержка

Цитата:
Сообщение от Mario Посмотреть сообщение
Как вам такой вариант отключения прерывания?
Код:
TICK TickGet(void)
{
    TICK Tick_Temp;
    static bit GIE_temp;
    GIE_temp = GIE;
    GIE = 0;
    Tick_Temp = TickCount;
    GIE = GIE_temp;
    return Tick_Temp;
}
Нормально. Хотя, еще поправлю: для PIC16 рекомендуется GIE сбрасывать с проверкой.
Код:
do { GIE = 0;} while (GIE);
tester вне форума   Ответить с цитированием
Старый 05.12.2008, 17:48   #25
urry
Senior Member
 
Аватар для urry
 
Регистрация: 11.10.2007
Возраст: 57
Сообщений: 462
Вес репутации: 228/51
urry has a spectacular aura abouturry has a spectacular aura abouturry has a spectacular aura about
По умолчанию Ответ: Точная задержка

Greg, а не проще ли сравнивать в прерывании и выставлять флаг результата ?
Pirat, существует подпрограмма задержки, сбрасывающая собаку.
urry вне форума   Ответить с цитированием
Ответ

Метки
delayus(x)


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите - задержка на 4 мин. MonstroNB Вопросы начинающих 6 04.08.2008 23:24


Часовой пояс GMT +3, время: 19:58.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot