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

CCP2 в PIC18F4520 не поддается укращению :)

не удается запустить модуль захвата CCP2. А вот CCP1 можно, но нужен второй, как быть где непонимание ??

компилятор HI-Tech 9.5PL3

__CONFIG(1,IESODIS & FCMDIS & ECCLKO & XT); //HS/HSPLL-HS with PLL enabled
// #define ECCLKO     0xF4FF  // EC, RA6=CLKOUT
__CONFIG(2,BORDIS & PWRTEN & WDTDIS);// & WDTEN & WDTPS128); //BORDIS
__CONFIG(3,CCP2RB3 & PBDIGITAL & LPT1DIS & MCLREN);
__CONFIG(4,XINSTEN & STVREN & DEBUGDIS & LVPDIS);
__CONFIG(5,CP0 & CP1 & CP2 & CP3);
//__CONFIG(6,WP0 & WP1 & WP2 & WP3 & WPB & WPC);
//__CONFIG(7,TRU);

volatile unsigned char str1[10];
volatile near unsigned char EventFlags,EventFlags2,  EventFlags3;

//
//  переменные датчика температуры
//
unsigned int new_cap, old_cap, OldTemp;
unsigned char IndexTemp = 0;
float ArrayTemp[8];               //массив значений с термодатчика для усреднения скользящим средним

void main(void)
{
    InitPeripherial();
    while(1){}
}

void interrupt low_priority LOW_ISR(void)
{
    unsigned char TmpByte,TmpByte1;
    float TempSensor;

    //
    // прерывание по SPI (обслуживание АЦП)
    //
  #if (_TempSensorUseCCP2_ == 1)
    if(CCP2IE && CCP2IF){
    asm("btg    latd,1");
        new_cap = CCPR2;
        TMR3 = 0;
        CCP2IF = 0;                           //cсбрасываем флаг возникновения завхвата
        CCP2CON ^= 0x01;                      //захват по каждому переднему/заднему фронту 0x05/0x04
        if (CCP2M0){                          //после принятия паузы вычисляем температуру
  #else
    if(CCP1IE && CCP1IF){
        new_cap = CCPR1;
        TMR3 = 0;
        CCP1IF = 0;                           //cсбрасываем флаг возникновения завхвата
        CCP1CON ^= 0x01;                      //захват по каждому переднему/заднему фронту 0x05/0x04
        if (CCP1M0){                          //после принятия паузы вычисляем температуру
  #endif
    asm("btg    latd,2");
            TempSensor = 400*(unsigned long)new_cap;  //        T=(235-(400*T1/T2));
            TempSensor/= old_cap;
            TempSensor = 235.0 - TempSensor;
            ArrayTemp[IndexTemp] = TempSensor;
            IndexTemp = ++IndexTemp & 0x07;
//            EventFlags3 |= fRxCaptureTermo;
        }
        else                                  // после принятия импульса
            old_cap = new_cap;                // store this capture value
    }
}



void InitPeripherial(void)
{   //////////////////////////////////////////////////////////////////////////
    //  Настройка регистров для задание режима работы (послед по мануалу :))
    //////////////////////////////////////////////////////////////////////////
//    OSCCON = 0x70;          //Настройка рабочего генератора процессора с частотой 8 МГц с выходом Fosc/4 на RA6

    INTCON = 0;
    ADCON1 = 0x0F;              //All PORTB pin - is digital (PB3..PB0)

    #if (_TempSensorUseCCP2_ == 1)  //CCP1 используем для датчика тепературы
        TRISA = 0x09;   TRISB = 0x0F;   TRISC = 0xD7;   TRISD = 0x00;   TRISE = 0x00;
    #else
        TRISA = 0x09;   TRISB = 0x0F;   TRISC = 0xD3;   TRISD = 0x00;   TRISE = 0x00;
    #endif
        PORTA = 0xFF;   PORTB = 0x00;   PORTC = 0x90;   PORTD = 0x00;   PORTE = 0xFF;
        LATA  = 0xFF;   LATB  = 0x00;   LATC  = 0x90;   LATD  = 0x00;   LATE  = 0xFF;

    //---- Initialise ADC ----
    //выравнивание Result-а по левому. краю, (не запол. млад. разряды ADRESL) и режим 0xb - три аналоговых вх. AI0..AI3)
    ADCON0 = 0x00;              //-- Reset to defaults fosc/32 AN0
    ADCON1 = 0x1B;              //VCFG0 | PCFG3 | PCFG1 | PCFG0; //RA1 и RA3 - аналоговый, RA3 - REF
//    ADCON2 = 0x08;              //ADFM  | ACQT1 | ACQT0; //время заряда кондера 6Tad Tconv = Fos/2
    ADCON2 = 0x3E;
    ADIE=0;                     // not interrupt driven
    ADON=0;                     //-- Turn ADC ON

    INTCON2 = 0x00;
    INTCON3 = 0x00;             //запретили прерывания по вх. Int 1,2
    PIR1 = 0x00;                //флаги периферийных прерываний.
    PIR2 = 0x00;                //флаги периферийных прерываний.
    #if (_TempSensorUseCCP2_ == 1)  //CCP2 используем для датчика тепературы
        PIE1 = 0x60;            //разрешения периферийных прерываний.
                                //b.7 PSPIE : Parallel Slave Port Read/Write Interrupt Enable bit(1)
                                //b.6 ADIE  : A/D Converter Interrupt Enable bit
                                //b.5 RCIE  : Разрешение прерывания от приемника USART
                                //b.4 TXIE  : Разрешение прерывания от передатчика USART
                                //b.3 SSPIF : Флаг прерываний от модуля MSSP
                                //b.2 CCP1IE: CCP1 Interrupt Enable bit
                                //b.1 TMR2IE: Разрешение прерывания по переполнению таймера TMR2
                                //b.0 TMR1IE: Разрешение прерывания по переполнению таймера TMR1

        PIE2 = 0x01;            //разрешения периферийных прерываний.
                                //b.7 OSCFIE: Oscillator Fail Interrupt Enable bit
                                //b.6 CMIE  : Comparator Interrupt Enable bit
                                //b.5 Reserved 0
                                //b.4 EEIE: Data EEPROM/Flash Write Operation Interrupt Enable bit
                                //b.3 BCLIE: Bus Collision Interrupt Enable bit
                                //b.2 2 HLVDIE: High/Low-Voltage Detect Interrupt Enable bit
                                //b.1 TMR3IE: TMR3 Overflow Interrupt Enable bit
                                //b.0 CCP2IE: CCP2 Interrupt Enable bit
    #else
        PIE1 = 0x64;            //разрешения периферийных прерываний.
        PIE2 = 0x00;            //разрешения периферийных прерываний.
    #endif

    IPR1 = 0x20;                //приоритета периферийных прерываний.
                                //b.7 PSPIP : Parallel Slave Port Read/Write Interrupt Priority bit(1)
                                //b.6 ADIP  : A/D Converter Interrupt Priority bit
                                //b.5 RCIP  : Выбор приоритета прерывания от приемника USART
                                //b.4 TXIP  : Выбор приоритета прерывания от передатчика USART
                                //b.3 SSPIP : Выбор приоритета прерывания от модуля MSSP
                                //b.2 CCP1IP: CCP1 Interrupt Priority bit
                                //b.1 TMR2IP: Выбор приоритета прерывания TMR2 (низкий)
                                //b.0 TMR1IP: Выбор приоритета прерывания TMR1 (высший)

    IPR2 = 0x00;                //приоритета периферийных прерываний.
                                //b.7 OSCFIP: Oscillator Fail Interrupt Priority bit
                                //b.6 CMIP  : Comparator Interrupt Priority bit
                                //b.5 Reserved 0
                                //b.4 EEIP  : Data EEPROM/Flash Write Operation Interrupt Priority bit
                                //b.3 BCLIP : Bus Collision Interrupt Priority bit
                                //b.2 HLVDIP: High/Low-Voltage Detect Interrupt Priority bit
                                //b.1 TMR3IP: TMR3 Overflow Interrupt Priority bit
                                //b.0 CCP2IP: CCP2 Interrupt Priority bit

    RCON = 0x80;                //b.7 IPEN  : приоритетная система прерываний включена
                                //            TMR1 -  обладает высшим приоритетом
    //
    //  Настраиваем модуль захвата ССP2 для работ ы с темп. датчиком TMP04
    //
    #if (_TempSensorUseCCP2_ == 1)  //CCP1 используем для датчика тепературы
        CCP2CON = 0x05;         //захват по каждому переднему фронту
                                //0100 = захвата по каждому заднему фронту сигнала
                                //0101 = захват по каждому переднему фронту сигнала
                                //0110 = захват по каждому 4-му переднему фронту сигнала
    #else                       //0111 = захват по каждому 16-му  переднему фронту сигнала
        CCP1CON = 0x05;
    #endif

    T3CCP2 = 1;                 //Fos/4, модуль используется для модулей CCP1 и CCP2
    TMR3 =  0;                  //таймерный тик по ... мкс
    TMR3ON = 1;                 // и включили таймер 3
    INTCON = 0xC0;              //allow interrupts      !!!!! вкл.  INT0IE
}

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


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

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

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

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

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

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

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

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

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

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