View previous topic :: View next topic |
Author |
Message |
Guard
Joined: 20 Jan 2005 Posts: 43
|
COMPARATOR INTERRUPT!!!!! |
Posted: Mon Feb 07, 2005 8:52 am |
|
|
hI,
I am using the comparator 2 of the PIC16c781.
In the wizard interrupt comparator dosn't exist.
then I used device editor , but in the list of the interrupts there are six or more "comp" options:
COMP 0C.7/8C.7
COMP 0C.6/8C.6
COMP 0C.3/8C.3
COMP2 0C.4/8C.4
COMP 0D.5/8D.5
COMP2 0D.6/8D.6
8ch is the register address for PIE1 and 0Ch is the PIR1
8c.5 enable interrupt Comparator 2
0c.5 is the flag for interrupt
Can you tell me which option I have to check for ???
Thank
PCW 3.218 - Mplab 7.01 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Feb 07, 2005 11:14 pm |
|
|
Quote: |
I used device editor , but in the list of the interrupts there are six or
more "comp" options. Can you tell me which option I have to check for ? |
You would like to see this choice, but you don't have it:
COMP2 0C.5/8C.5
This means you can't add the Comp2 interrupt with the Device Editor.
Here is post in which I show how to add support for an interrupt
which you can't add with the Device Editor.
http://www.ccsinfo.com/forum/viewtopic.php?p=6680
Let's modify that code to work with the 16C781 comparator #2.
Code: | #include <16C781.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT
#use delay(clock = 4000000)
#bit C2IF_BIT = 0x0C.5
#bit C2IE_BIT = 0x8C.5
#int_default
void default_isr(void)
{
if(C2IE_BIT) // Is the interrupt enabled ?
{
if(C2IF_BIT) // If so, is the interrupt flag set ?
{
// Put your own code here, to service the interrupt.
C2IF_BIT = 0; // Clear the interrupt flag
}
}
}
//===================================
void main()
{
// Put code here to setup the comparators.
// Put code here to enable the Comp2 interrupt
// and also enable Global interrupts.
while(1);
} |
|
|
|
Guard
Joined: 20 Jan 2005 Posts: 43
|
|
Posted: Tue Feb 08, 2005 10:20 am |
|
|
Hi,
This is my main().
I used C2IE_bit for enable interrupt, but it doesn't function.
Note:
I am using both comparators for PSMC
Code: |
TRISA=255;
TRISB=37;
WPUB=0;
setup_adc_ports( sAN4|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_32);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,2,1);
disable_interrupts(INT_RB);
disable_interrupts(INT_RTCC);
C2IE_BIT =1; // Interrupt Comparator
enable_interrupts(GLOBAL)
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Feb 08, 2005 11:37 am |
|
|
I don't see any code that sets up the comparators.
Since your version of the compiler apparently doesn't support
those comparators, you need to setup them up by yourself, with code.
You need to read the data sheet section on comparators, in detail.
You need to use #byte and #bit statements to define the comparator
registers and important bits.
You need to decide what mode you want to put to the comparators in.
You need to study the ASM code examples in the data sheet, which
show how to setup the comparators. You need to learn how to
translate that code into simple C statements.
You need to do this. |
|
|
Guard
Joined: 20 Jan 2005 Posts: 43
|
|
Posted: Tue Feb 08, 2005 12:02 pm |
|
|
Hi,
My post is part of my code...
The PSMC is ok, I am studying the asm example code for interrupt |
|
|
Guard
Joined: 20 Jan 2005 Posts: 43
|
|
Posted: Tue Feb 08, 2005 12:25 pm |
|
|
Code: |
#include "C:\TEST\PSMC.h"
static short int Camp;
static int Answer;
////////////////////////////////////////// Ports
#byte Port_b = 0x06
#byte TRISB =0x86
#byte TRISA =0x85
#byte wpub =0x95
#byte Ansel =0x9d
#bit Fan = Port_B.7
#bit Gate = Port_B.6
#bit pin_datain = Port_B.5
#bit pin_dataout = Port_B.4
///////////////////////////////// A/D
#byte REFCON=0X9B
#byte ADCON0 =0X1F
#bit ADCSL= ADCON0.6
#bit ADCSH= ADCON0.7
#bit CHSH= ADCON0.5
#bit CHSM= ADCON0.4
#bit CHSL= ADCON0.3
#bit GODONE= ADCON0.2
#bit CHS3= ADCON0.1
#bit ADON= ADCON0.0
#byte ADCON1=0X9F
#bit VCFGH= ADCON1.5
#bit VCFGL= ADCON1.4
//////////////////////////////////////// Comparator interrupt
#byte INTCON = 0x0b
#bit PEIE = INTCON.6
#bit C2IF_BIT = 0x0C.5
#bit C1IF_BIT = 0x0C.4
#bit C2IE_BIT = 0x8C.5
#bit C1IE_BIT = 0x8C.4
//////////////////////////////////////// PSMC
// Register control 0
#byte PSMCCON0 = 0x111
#bit SMCCLH = 0x111.7
#bit SMCCLL = 0x111.6
#bit MINDCH = 0x111.5
#bit MINDCL = 0x111.4
#bit MAXDCH = 0x111.3
#bit MAXDCL = 0x111.2
#bit DCH = 0x111.1
#bit DCL = 0x111.0
/////////////////////////////////////// PSMC
// Register control 1
#byte PSMCCON1 = 0x112
#bit SMCON = 0x112.7
#bit S1APOL = 0x112.6
#bit S1BPOL = 0x112.5
#bit NOTUSED = 0x112.4
#bit SCEN = 0x112.3
#bit SMCOM = 0x112.2
#bit PWMPSM = 0x112.1
#bit SMCCS = 0x112.0
//////////////////////////////////////// OP AMP
#byte OPACON = 0x11C
#byte CALCON = 0x110 //
#bit CMPEN=OPACON. 6
#bit OPAON=OPACON. 7
#bit GBWP =OPACON. 0
#bit CAL = CALCON.7
#bit CALREF= CALCON.5
/////////////////////////////////////// comparator 1
#byte CM1CON0 = 0x119 // comparator 1
#bit C1ON = 0X119.7
#bit C1OUT = 0X119.6
#bit C1OE = 0X119.5
#bit C1POL = 0X119.4
#bit C1SP = 0X119.3
#bit C1R = 0X119.2
#bit C1CHH = 0X119.1
#bit C1CHL = 0X119.0
/////////////////////////////////////// comparator 2
#byte CM2CON0 = 0x11A // comparator 2
#bit C2ON = 0X11A.7
#bit C2OUT = 0X11A.6
#bit C2OE = 0X11A.5
#bit C2POL = 0X11A.4
#bit C2SP = 0X11A.3
#bit C2R = 0X11A.2
#bit C2CHH = 0X11A.1
#bit C2CHL = 0X11A.0
////////////////////////////////////// DAC
#byte DAC = 0x11E
#byte DACON0 = 0x11F
#byte ANSEL = 0x9D
#bit DAON= DACON0.7
#bit DAOE= DACON0.6
#bit DARSH= DACON0.1
#bit DARSL= DACON0.0
///////////////////////////////////////////////// Prototipe
short int calibrate_opamp_internal(void) ;
void setup_comparators (void);
void setup_psmc(void);
void setup_dac(void);
void config_mcu(void);
////////////////////////////////////////////////Interrupt
#int_default
void default_isr(void)
{
if(C2IE_BIT) // Is the interrupt enabled ?
{
if(C2IF_BIT) // If so, is the interrupt flag set ?
{
C1ON=0;
C2ON=0;
Gate off
Fan Off
SMCON =0 ; // PSMC OFF
C2IF_BIT = 0; // Clear the interrupt flag
do
{
pin_dataout=1;
delay_ms(100);
pin_dataout=0;
delay_ms(100);
}
while(1); // ERROR SIGNAL
}
}
}
#int_RTCC
void RTCC_isr()
{
}
//////////////////////////////////////////
#int_RB
void RB_isr(void)
{
int changes;
int last_b;
changes = last_b ^ port_b;
last_b = port_b;
if (bit_test(changes,5)&& !bit_test (last_b,5))
{
}
}
////////////////////////////////////
void main()
{
Config_mcu();
Gate Off
pin_dataOut Off
FAN Off
Answer = 0;
delay_ms(500);
do
{
Camp = calibrate_opamp_internal();
}
while ( !Camp);
Dac =51;
C2IE_BIT =1; // Interrupt Comparator 2 Enabled
PEIE=1;
enable_interrupts(GLOBAL);
while(1);
}
void Config_mcu(void)
{
TRISA=255;
TRISB=37;
WPUB=0;
setup_adc_ports( sAN2| sAN3|sAN4| sAN6|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_32);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,2,1);
disable_interrupts(INT_RB);
disable_interrupts(INT_RTCC);
disable_interrupts(GLOBAL);
C2IE_BIT =0;
C1IE_BIT =0;
PEIE=0;
setup_dac();
setup_comparators ();
setup_psmc();
}
void setup_dac()
{
DARSL=0;
DARSH=0;
DAOE =1;
DAC =0;
DAON =1;
}
void setup_comparators (void)
{
C1CHH =1; // AN6
C1CHL =0;
C1R =0;
C1POL=0;
C1SP =1;
C1OE =1;
C1ON =1;
C2CHH =1; // AN6
C2CHL =0;
C2R =0;
C2SP =1;
C2POL=0;
C2OE =0;
C2ON =1; //
}
void setup_psmc(void)
{
SMCON =0 ;
DCH = 0; // no PSM
DCL = 0; // no used
MAXDCH = 0; //50% D.C.
MAXDCL = 0;
MINDCH = 0; // 0% D.C.
MINDCL = 0;
SMCCLH = 0;
SMCCLL = 0;
SMCCS =1 ;
PWMPSM =1 ; // PWM MODE
SMCOM =0 ; // SINGLE OUT
SCEN =0;
S1APOL =0;
S1BPOL =0;
SMCON =1 ;
}
boolean calibrate_opamp_internal(void)
{
CMPEN =0; //
OPAON =1; // OP AMP
GBWP =0; // 70kHz
CALREF=0;
delay_ms(20);
CAL=1; // Start
while( bit_test(CALCON, 7) );
if (bit_test(CALCON, 6))
return(false);
else
return(true);
}
|
|
|
|
Guard
Joined: 20 Jan 2005 Posts: 43
|
|
Posted: Wed Feb 09, 2005 2:29 am |
|
|
HI
To fix the problem I used MC2OUT |
|
|
|