Моя программа (с использованием примера TI LCD):
#include <msp430fg4618.h>
int T=0;
int o=0;
const int delta=60;
#define BIT10 0x400
#define BIT11 0x800
#define BIT12 0x1000
#define BIT13 0x2000
#define BIT14 0x4000
#define BIT15 0x8000
unsigned int max;
unsigned int min;
unsigned int firstmin=0;
void init_ADC(void)
{
ADC12CTL0 = ADC12ON;
ADC12CTL0&=~ENC;
ADC12CTL0|=REF2_5V|REFON|MSC|SHT0_0|SHT1_0;
ADC12CTL0&=(~ADC12SC)&(~ADC12TOVIE)&(~ADC12OVIE);
ADC12CTL1=ADC12DIV_0|ADC12SSEL_0|CONSEQ_0|SHS_0|CSTARTADD_0;
ADC12CTL1&=(~ADC12BUSY)&(~ISSH)&(~SHP);
ADC12MCTL0=EOS|SREF_1|INCH_0;
P6SEL|=0x01;
P6DIR&=~0x01;
}
void restore_DAC1(void)
{
DAC12_1CTL&=~DAC12GRP;
DAC12_1CTL|=DAC12ENC;
}
void restore_DAC0(void)
{
DAC12_0CTL|=DAC12GRP|DAC12ENC;
}
void init_DAC0(void)
{
DAC12_0CTL&=~DAC12ENC;
DAC12_0CTL|=DAC12SREF_0|DAC12LSEL_1|DAC12IR|DAC12AMP_2;
DAC12_0CTL&=(~DAC12RES)&(~DAC12DF)&(~DAC12IE)&(~DAC12IFG);
restore_DAC0();
DAC12_0CTL|=DAC12CALON;
while((DAC12_0CTL&BIT9)==1);
}
//конфигурация OA
void init_OA0(void)
{
OA0CTL1=OAFC_0|OAFBR_0;
OA0CTL1&=~OARRIP;
OA0CTL0=OAPM_1|OAN_2|OAP_0|OAADC1;
OA0CTL0&=~OAADC0;
P6SEL|=0x02;
P6DIR|=0x02;
P6SEL|=0x40;
P6DIR&=~0x40;
}
void init_OA1(void)
{
OA1CTL1=OAFC_0|OAFBR_0;
OA1CTL1&=~OARRIP;
OA1CTL0=OAPM_1|OAN_0|OAP_3|OAADC1;
OA1CTL0&=~OAADC0;
P6SEL|=0x08;
P6DIR|=0x08;
P6SEL|=0x80;
P6DIR&=~0x80;
}
void init_DAC1(void)
{
DAC12_1CTL&=~DAC12ENC;
DAC12_1CTL|=DAC12SREF_0|DAC12LSEL_1|DAC12IR|DAC12AMP_2;
DAC12_1CTL&=(~DAC12RES)&(~DAC12DF)&(~DAC12IE)&(~DAC12IFG);
restore_DAC1();
DAC12_1CTL|=DAC12CALON;
while((DAC12_1CTL&BIT9)==1);
}
void write_DAC0(unsigned int val)
{
restore_DAC0();
if (val>4095)
DAC12_0DAT = 4095;
else DAC12_0DAT = val;
}
void write_DAC1(unsigned int val)
{
restore_DAC1();
if(val>4095)
DAC12_1DAT = 4095;
else DAC12_1DAT = val;
}
unsigned int sampling_ADC(void)
{
ADC12CTL0 |= ADC12SC+ ENC;
ADC12CTL0 &= ~ADC12SC;
while ((ADC12CTL1 & ADC12BUSY) == 1);
return(ADC12MEM0);
}
void PrintTemperature(void)
{
clrLCD();
dispTemperature(o);
}
void setLowPower(void)
{
_BIS_SR(LPM3_bits+GIE);
}
void init_Port1(void)
{
P1SEL&=0x01;
P1DIR&=0x01;
P1IES&=~0x01;
P1IE|=0x01;
}
void init_Port2(void)
{
P2SEL&=~0x01;
P2DIR&=~0x01;
P2IES|=0x01;
P2IE|=0x01;
}
void goADC(void)
{
o= sampling_ADC();
if((min==0)&(firstmin==0))
{
min=o;
firstmin=1;
}
if(o>max)
{
max=o;
}
else if(o<min)
min=o;
write_DAC0(o+delta);
write_DAC1(o-delta);
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
PrintTemperature();
P1IFG&=~0x01;
P1IE|=0x01;
goADC();
}
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
PrintTemperature();
P2IFG&=~0x01;
P2IE|=0x01;
goADC();
}
void main ( void ){
max=0;
min=0;
WDTCTL = WDTPW | WDTHOLD;
FLL_CTL0 |= XCAP18PF;
initPortPins();
initBasicTimer();
initLCD_A();
init_ADC();
init_DAC0();
init_DAC1();
init_OA0();
init_OA1();
init_Port1();
init_Port2();
setLowPower();
}
Моя схема http://i024.radikal.ru/1312/65/d5d1c5b8e7a9.jpg
При нагревании на дисплее отображается повышение температуры и регистрируются прерывания по 1 порту, но при остывании датчика преываний не происходит. Почему ?