Ir ao conteúdo
  • Cadastre-se

Instrumentaçãp (i/o) ! Builder C++!


wragostinho

Posts recomendados

Estou desenvolvendo um software para controle de Temperatura de um Forno de Tratamento Térmico. Preciso monitorar a temperatura para isso. Esse monitoramento é feito por termopares que emitem uma variação de tensão em milivolts para a porta paralela através de um conversor AD. Bem até aí tudo bem certo?

Estou desenvolvendo o software em plataforma NT e para isso peguei a biblioteca PortTalk para fazer o acesso as portas. Lembrando sempre que estou usando o Builder 5.0.

Bem vamos direto ao assunto...

Gero um loop que fica lendo as portas de 1 em 1 segundo o tempo é limitado por um "timer", o loop se mantem enquanto uma variavel boleana for verdadeira o loop deve continuar. Dentro do loop coloquei um analisador de eventos ou melhor, o comando já conhecido ( Applicaton->ProcessMessages(); ) ou seja este comando analisa qualquer evento executado pelo sistema, ou seja, até o clique do mouse deve ser interpretado. Criei um botao "Close" que tem no evento Click a ação de setar a variavel boleana como falsa e assim finalizar o loop.

Bem, tudo funciona, mas quando clico no botao Close o software não executa a ação deste botao.

Alguem tem uma sugestao?

Aqui esta colado este programinha de teste que gerei e não funciona....

Por Favor qualquer sugestão será bem vinda, até mesmo de alguma outra biblioteca que não seja a PortTalk.

Obrigado

Wesley

//---------------------------------------------------------------------------

#include <dos.h>

#include <vcl.h>

#include <stdio.h>

#pragma hdrstop

#include "Unit1.h"

#include "pt_ioctl.c"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

//---------------------------------------------------------------------------

unsigned char i,j,n,ganho[8];

unsigned int result_ad[8], contador, media;

unsigned long acumulador[8];

bool roda=1;

float resultado;

TEdit *valor0,*valor1,*valor2,*valor3,*valor4,*valor5,*valor6,*valor7;

//---------------------------------------------------------------------------

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

float condiciona(unsigned int index)

{

float resultado;

resultado=result_ad[index]*1230000/(4096*10);

return 3.00710844e-11*resultado*resultado*resultado-3.076861506e-7*resultado*resultado+2.5174682e-2*resultado + 6.121802143e-2;

}

//---------------------------------------------------------------------------

unsigned int ad(unsigned char ncanal, TTimer *Timer1)

{

unsigned char clk_low, clk_high;

for(i=0; i < ncanal; i++)

{

outportb(0x37A, (i << 1) ^ 0x0A);

outportb(0x378, ganho); /* programa o ganho*/

Timer1->Enabled=1; /* espera 1 ms para amp estabilizar */

clk_low = ganho & 0xcf;

clk_high = ganho & 0xdf;

for(contador = 0; contador < media; contador ++)

{

outportb(0x378, clk_high); /* CS - low */

outportb(0x378, clk_low); /* CLOCK - low */

outportb(0x378, clk_high); /* CLOCK - high */

outportb(0x378, clk_low); /* CLOCK - low */

outportb(0x378, clk_high); /* CLOCK - high */

outportb(0x378, clk_low); /* CLOCK - low */

outportb(0x378, clk_high); /* CLOCK - high */

result_ad = 0;

for (j=11; j<12; j--)

{

outportb(0x378, clk_low); /* CLOCK - low */

result_ad = result_ad | (((int)((inportb(0x379) & 0x20) >> 5)) << j);

outportb(0x378, clk_high); /* CLOCK - high */

}

acumulador = result_ad + acumulador;

outportb(0x378, ganho); /* CS - high */

}

result_ad = acumulador/media;

acumulador = 0;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::OKClick(TObject *Sender)

{

unsigned char value;

OpenPortTalk();

outportb(0x378, 0xFF);

for(i = 0; i < 8; i++) ganho = 0xBF;

ClosePortTalk();

n = 8;

media = 100 ;

do

{

OpenPortTalk();

SetPriorityClass(GetCurrentProcess(),PROCESS_ALL_ACCESS);

ad(n,Timer1); /* coloca o resultado de n canais em result_ad[8] */

ClosePortTalk();

for (i=0; i< n; i++)

{

valor0->Text=FloatToStr(condiciona(0));

valor1->Text=FloatToStr(condiciona(1));

valor2->Text=FloatToStr(condiciona(2));

valor3->Text=FloatToStr(condiciona(3));

valor4->Text=FloatToStr(condiciona(4));

valor5->Text=FloatToStr(condiciona(5));

valor6->Text=FloatToStr(condiciona(6));

valor7->Text=FloatToStr(condiciona(7));

Application->ProcessMessages();

}

// resultado*1230000/(4096*10)

}while(roda);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::closeClick(TObject *Sender)

{

roda=0;

ShowMessage("OK!");

ClosePortTalk();

Application->Terminate();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

Timer1->Enabled=0;

}

//---------------------------------------------------------------------------

Link para o comentário
Compartilhar em outros sites

Coloque um Sleep() depois do ProcessMessages

E faça a leitura usando uma thread separada... (Se bem que usando o timer deveria, teoricamente, ser uma thread separada)

Se a temporização não for crítica não precisa usar timers, basta fazer

while(1)

{

le();

::Sleep(1000);

}

Isso já é suficiente.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!