компилятор 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
}
// #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
}