Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работает схема сравнения
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Иван Иванов
Моя программа (с использованием примера 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 порту, но при остывании датчика преываний не происходит. Почему ?
rezident
Такие "простыни" исходников следует ограничивать, заключая их в теги CODEBOX, либо прикрепляя к сообщению в виде файла. См. п.3.4 Правил форума.
Опишите словами реализованный у вас алгоритм, чтобы исследовать ваш исходник можно было как-то осмысленно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.