Autor Tópico: CLOCK em microsegundos  (Lida 17829 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

matrixlan1

  • Visitante
CLOCK em microsegundos
« Online: 02 de Outubro de 2009, 11:33 »
Ola amigos da programação, estou programando um sinal de clock na porta paralela para acionar o motor a passo na CNC3AX, que é o seguinte:

outport(0x378, 2); pino 2 da porta paralela em nivel "1")
sleep(10) causa atraso de 10 ms
outport(0x378, 0); (pino 2 da porta paralela em nivel "0")
sleep(10) causa atraso de 10 ms

as linhas do programa acima se  repetem de "1" para "0" numa frequencia determinada pelo comando sleep()

o L297 recebe os pulsos normalmente so que com baixa rotação no motor.

quando ligo a cnc3ax no mach2 o motor roda em toda sua potencia, com isso me conscientizei que o erro pode estar no meu codigo.alguem pode me da uma força?

percebi que o mach2 trabalha numa frequencia muito nais alta do que e apenas ms (milisegundo) ele deve trabalhar em us(microsegunds).



Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #1 Online: 02 de Outubro de 2009, 13:02 »

Qual versão de Windows está usando?

O Windows só roda o seu programa?

Coloque um frequencímetro ou osciloscópio no pino que vai para o L-297. Ajuste o delay em seu programa para 1000ms (Ton e Toff) e vá baixando de 100 em 100ms e meça a frequência. Quando chegar em 100ms baixe de 10 em 10 ms. Meça e informe os resultados...

Veja se o motor acompanha a temporização ajustada, de maneira coerente na rotação, voce pode medir a rotação usando um frequencímetro e um sensor óptico.

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #2 Online: 02 de Outubro de 2009, 16:30 »
"Qual versão de Windows está usando?"

estou usando o wundows XP

"O Windows só roda o seu programa?"

nao, meu windows roda outros tambem, inlusive testo a cnc3ax nele

"Coloque um frequencímetro ou osciloscópio no pino que vai para o L-297. Ajuste o delay em seu programa para 1000ms (Ton e Toff) e vá baixando de 100 em 100ms e meça a frequência. Quando chegar em 100ms baixe de 10 em 10 ms. Meça e informe os resultados..."

com ajuste de 1000ms (1 segundo) o motor da giros bem demorados, de 1 em 1 segundo e funciona bem, fui baixando o delay como voce disse o maximo que se consegue é 1ms, o motor vai girando cada vez mais rapido (mais raquiticamente) a rotação nem se compara com a do mach2, que é pelo menos 10x mais rapido, acredito que esse programa não emita clock para CNC3AX em milisegundos e sim em microsegundos, por isso ele consegue velocidades mais rápidasno motores do que o meu programa, mas pude observar o C++ não tem microsegundos só milisegundos.

Voce por acaso teria alguma rotina em C++com delay em microsegundos?

abaixo esta a largura dos pulsos que uso e mais a frentena mesma foto a do L297

« Última modificação: 02 de Outubro de 2009, 16:36 por matrixlan1 »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #3 Online: 02 de Outubro de 2009, 16:56 »
Matrixlan1,

Qual o seu nome? O meu é Gil...

O que voce quer dizer com "rodar raquiticamente"? Devagar(lento) ? Ou com pouco torque?

É complicado tentar temporizar com microssegundos usando o Windows, é algo do tipo: "me engana que eu gosto"...  :)

Desconheço alguma instrução do compilador que temporize abaixo de 1 ms.

Mas pense no seguinte... o comando sleep gasta um certo tempo do processador, mas o tempo do processador também pode ser "gasto" de outras maneiras. Tente retirar o comando sleep, aí a temporização entre o nível 1 e o nível 0 será a quantidade de instruções (ciclos de máquina) do processador + latência do Windows. Será algo bem pequeno mas talvez imprevisível, devido ao Windows, que passa a ser "o fator limitante".

Se voce colocar uma instrução do tipo a=10 também gasta tempo do processador. Não sei te dizer quanto, mas gasta, teria que medir (usando um osciloscópio). Depende de como o compilador traduziu em códigos de máquina, da velocidade do processador,... Programação neste nível requer ferramental e saber o que está fazendo e como toda a coisa funciona (Sistema Operacional, o Procesador do PC, a Porta Paralela,...), neste nível de microssegundos, a coisa não se resume ao compilador e às instruções do programa em C.

Mas se voce quiser mesmo tentar temporizar em microssegundos, indo além, deverá usar comandos em assembly no meio do seu código C. Não sei se o C++ Builder aceita isso, por exemplo, existe um comando do compilador Turbo C (em DOS) que permite inserir uma ou mais linhas de código assembly num programa em C, mas aí a coisa começa a ficar cabeluda!! Essas linhas não são compiladas, mas executadas diretamente pela CPU...

O certo mesmo seria fazer a parte que exige velocidade do código em assembly e aí linkar essa parte com o resto do programa.

Outra opção é fazer programa multitarefa em tempo real (usando o RT-Linux) e criar uma Task ou uma Thread em assembly, rodando de maneira concorrente com os outros módulos (tarefas) do programa de alto nível. É assim que os programas profissionais funcionam.

Em resumo, se queres mais velocidade, tem que ir além... usar assembly, dominar a máquina, o sistema operacional...
« Última modificação: 02 de Outubro de 2009, 17:05 por minilathe »

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #4 Online: 03 de Outubro de 2009, 13:23 »
Qual o seu nome? O meu é Gil...[/i]

ola GIL meu nome é Odail, prazer em conhecer

O que voce quer dizer com "rodar raquiticamente"? Devagar(lento) ? Ou com pouco torque?[/i]

O motor roda muito devagar em relação a outro de uma maquina cnc que roda em 10x a mais

É complicado tentar temporizar com microssegundos usando o Windows, é algo do tipo: "me engana que eu gosto"...  :)

verdade amigo, eu estava fazendo uma pesquisa no google sobre isso e tem pouca coisa sobre o assunto mas eu achei em linguagem "C" o comando usleep() que funciona em micro segundos (é isso que procuro)mas eu fui ver no C++ Builder e ele nao tinha esse comando, so tinha o sleep() comum.

Desconheço alguma instrução do compilador que temporize abaixo de 1 ms.

em interface C++ é ate dificil mesmo mas em compiladores para PIC por exemplo tem essa função e ja usei bastante, e o mais interessante é que funciona....

Tente retirar o comando sleep, aí a temporização entre o nível 1 e o nível 0 será a quantidade de instruções (ciclos de máquina) do processador + latência do Windows.

ja coloquei "0" nos delays ele simplesmente nao funcionam o motor fica parado??


Se voce colocar uma instrução do tipo a=10 também gasta tempo do processador. é exatamente isso que estou fazendo dentro do meu delays declarei uma variavel chamada:

int tempo;

depois dentro do delay (sleep):

sleep(tempo)

a variavel "tempo" esta adicioanada em um botão SLIDER no C++ BUILDER (tipo aqueles de volume de audio) toda vez que que aumento esse SLIDER ele incrementa ou decrementa a variavel "tempo" neese caso as variaveis quando se acrescenta um valor tipo: tempo=10; ela vai atrasar 10 milisegundos...

Mas se voce quiser mesmo tentar temporizar em microssegundos, indo além, deverá usar comandos em assembly no meio do seu código C.

Assembly é muito massa de programar muitos dizem isso, mas eu sinceramente teria que começar do zero e aprender outra linguagem, nao sei se teria tempo pra isso, mas é uma otima ideia GIL.....

Outra opção é fazer programa multitarefa em tempo real (usando o RT-Linux) e criar uma Task ou uma Thread em assembly,

GIl, meu programa funciona com sistema multitarefa Thread, uso dois Thread's e funciona em tempo real da pra definir a prioridade alta, media e baixa......


Em resumo, se queres mais velocidade, tem que ir além... usar assembly, dominar a máquina, o sistema operacional...

Nos que começamos a programar em uma linguagem as vezes pensamos que vai ser facil, "dominar a maquina" é um assunto que realmente ainda não faz parte da minha realidade de programador hobysta....preciso de ajuda.....

VOU POSTAR EM SEGUIDA O MEU PROGRAMA, COMO FICOU A INTERFACE ETC, pode ser que assim fique mais facil obter uma ajuda de como fazer esse motor a passo rodar na mesma velocidade de um programa CNC.



[/quote]
« Última modificação: 03 de Outubro de 2009, 13:29 por matrixlan1 »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #5 Online: 03 de Outubro de 2009, 13:46 »
Odail,

Olhe a função a seguir:

int comanda_motor( void )
{
   outport(0x378, 2); // pino 2 da porta paralela em nivel "1"
   // sleep(10) causa atraso de 10 ms
   outport(0x378, 0); // pino 2 da porta paralela em nivel "0"
   // sleep(10) causa atraso de 10 ms
}

E agora olha essas duas instruções de setar bits da porta de um PIC:

bsf PORTB,2
bcf PORTB,2

Assumindo que antes de cada programa o nível de cada bit era zero, os dois programas ajustam um bit de uma porta no nível 1 e depois no nível zero. Pergunto, qual a duração (largura) do pulso nível 1? Como voce pode determiná-la?

A largura do pulso não é zero...

Qual a diferença entre os dois programas? Qual deve gerar o pulso de menor duração?

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #6 Online: 03 de Outubro de 2009, 15:41 »
Odail,

Olhe a função a seguir:

int comanda_motor( void )
{
   outport(0x378, 2); // pino 2 da porta paralela em nivel "1"
   // sleep(10) causa atraso de 10 ms
   outport(0x378, 0); // pino 2 da porta paralela em nivel "0"
   // sleep(10) causa atraso de 10 ms
}


Perfeito amigo GIL na minha linguagem C++ as linhas de programa acima para acessar o pino 2 da porta paralela estao corretissimas.....

E agora olha essas duas instruções de setar bits da porta de um PIC:

bsf PORTB,2
bcf PORTB,2


Muito massa isso amigo realmente o que esta me passando é algo novo, é assembly correto? em meu compilador pra pic ele ficaria assim:

output_high_PIN2;
output_low_PIN2;

Assumindo que antes de cada programa o nível de cada bit era zero, os dois programas ajustam um bit de uma porta no nível 1 e depois no nível zero. Pergunto, qual a duração (largura) do pulso nível 1? Como voce pode determiná-la?
A largura do pulso não é zero...


Agora sim, estamos chegando a um entendimento, realmente GIL parece que o meu programa so esta determinando a "FREQUENCIA" correto? porque ms (milisegundos) determina a frequencia e não a largura dos dos pulsos correto?

pode ser o erro do meu raciocinio que esta acarretando em um desempenho de baixa rotação do motor...eu nao tenho OSCILOSCOPIO AQUI para determinar a largura dos Lpulsos que saem do meu programa, dou um outro palpite abaixo:

  outport(0x378, 2);
  sleep(35) //causa atraso de 30 ms SENDO ASSIM o nivel alto (ligado) fica por ativo   por mais tempo
  outport(0x378, 0);
  sleep(5) // causa atraso de 5 ms, da mesma forma o sinal de clock fica em nivel baixo (desligado) por menos tempo. uma ilustração abaixo: é mais ou menos assim que esta no datashet do L297..
     ____   ____
    |      | |     |
    |      | |     |


Qual a diferença entre os dois programas? Qual deve gerar o pulso de menor duração?


è justamente isso que queria saber como faço pra manter um pulso LARGO e outro e outro MENOS LARGO e ainda por cima ainda controlar a frequencia dos mesmo no estado em que eles se encontram.......... ...



[/quote]
« Última modificação: 03 de Outubro de 2009, 15:43 por matrixlan1 »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #7 Online: 03 de Outubro de 2009, 17:16 »
Odail,

Para voce gerar uma onda retangular como a figura abaixo. A frequência, em Hertz, é dada por:

f = 1 / (Toff+Ton)

Sendo os tempos em segundos.

O trecho de programa para gerar uma onda retangular seria conforme a seguir:

    while(1)
    {
          outport(0x378, 0x2); // Setar pino 2 da porta paralela em nivel "1" e o resto em "0"
          sleep(Ton);             //  Duração do nível "1"
          outport(0x378, 0);   //  Setar todos os pinos da paralela para "0")
          sleep(Toff);            //  Duração do nível "0"
    }

Observe o seguinte:
(1) A duração do nível "0" é o tempo necessário para executar as instruções "sleep(Toff) e o while". Atente que, para pequenos valores de Toff (um ou dois milissegundos), o tempo necessário para executar o while pode ser significativo. Mas isso depende do compilador (por isso assembly é melhor, voce não fica imaginando coisas), ou então usa um osciloscópio ou frequencimetro, pelo menos.

(2) Se voce ligar um frequencímetro no pino 2 poderá determinar f. Voce não consegue um multímetro com frequencímetro?
 
« Última modificação: 03 de Outubro de 2009, 17:18 por minilathe »

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #8 Online: 03 de Outubro de 2009, 18:35 »
O trecho de programa para gerar uma onda retangular seria conforme a seguir:

    while(1)
    {
          outport(0x378, 0x2); // Setar pino 2 da porta paralela em nivel "1" e o resto em "0"
          sleep(Ton);             //  Duração do nível "1"
          outport(0x378, 0);   //  Setar todos os pinos da paralela para "0")
          sleep(Toff);            //  Duração do nível "0"
    }


Caro Gil, com base no codigo acima que parametros você usaria (linhas de programa) pra gerar um sinal de clock  com frequencia de 5000 hz?

andei fazendo uns testes tipo assim:

se 10ms é igual ou aproximadamente 100 hz, entao 1ms seria = a 1000 hz, nesse caso so conseguiria no máximo 1khz usando o codigo C++ com o comando sleep(), se for assim meu projeto ta perdido?

Observe o seguinte:
(1) A duração do nível "0" é o tempo necessário para executar as instruções "sleep(Toff) e o while". Atente que, para pequenos valores de Toff (um ou dois milissegundos), o tempo necessário para executar o while pode ser significativo. Mas isso depende do compilador (por isso assembly é melhor, voce não fica imaginando coisas), ou então usa um osciloscópio ou frequencimetro, pelo menos.


entendi pefeitamente o que quis dizer amigo.......

(2) Se voce ligar um frequencímetro no pino 2 poderá determinar f. Voce não consegue um multímetro com frequencímetro?

Dei uma olhada no meu multiteste e ele tem frequencimetro sim, vou tentar medir e posto aqui....

[/quote]
« Última modificação: 03 de Outubro de 2009, 18:40 por matrixlan1 »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #9 Online: 03 de Outubro de 2009, 19:23 »
O trecho de programa para gerar uma onda retangular seria conforme a seguir:

    while(1)
    {
          outport(0x378, 0x2); // Setar pino 2 da porta paralela em nivel "1" e o resto em "0"
          sleep(Ton);             //  Duração do nível "1"
          outport(0x378, 0);   //  Setar todos os pinos da paralela para "0")
          sleep(Toff);            //  Duração do nível "0"
    }


Caro Gil, com base no codigo acima que parametros você usaria (linhas de programa) pra gerar um sinal de clock  com frequencia de 5000 hz?

Para 5000 Hz, período será de 0,2 ms, e deveria usar a seguinte rotina:

    while(1)
    {
          outport(0x378, 0x2); // Setar pino 2 da porta paralela em nivel "1" e o resto em "0"
          sleep(0.1);             //  Duração do nível "1"
          outport(0x378, 0);   //  Setar todos os pinos da paralela para "0")
          sleep(0.1);            //  Duração do nível "0"
    }


Masssss, fica a pergunta, o sleep do C++ poderia ser menor do que 1 ou então 0.1?

Se o valor mínimo for 1, então a frequência máxima obtida com esse comando no C++ é de 500 Hz, pois são 1ms no nível 1 e 1 ms no nível 0.

Esse comando sleep não é padronizado, há compiladores em que o valor é em segundos, aceitando-se valores menores do que um.

se 10ms é igual ou aproximadamente 100 hz, entao 1ms seria = a 1000 hz, nesse caso so conseguiria no máximo 1khz usando o codigo C++ com o comando sleep(), se for assim meu projeto ta perdido?

Para sleep(1), a frequência máxima é de 500Hz, conforme expliquei acima..

Se o seu projeto está perdido eu não sei  :)

Pois ainda há várias opções: usar assembly, não usar o sleep, usar outra linguagem......

Dei uma olhada no meu multiteste e ele tem frequencimetro sim, vou tentar medir e posto aqui....

Há uma luz no fim do túnel...  :)

Voce poderia testar qual a frequencia que esse programa abaixo gera em teu sistema:

    while(1)
    {
          outport(0x378, 0x2); // Setar pino 2 da porta paralela em nivel "1" e o resto em "0"
          outport(0x378, 0);   //  Setar todos os pinos da paralela para "0")
    }


matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #10 Online: 03 de Outubro de 2009, 20:53 »
Citar
Para 5000 Hz, período será de 0,2 ms, e deveria usar a seguinte rotina:

    while(1)
    {
          outport(0x378, 0x2); // Setar pino 2 da porta paralela em nivel "1" e o resto em "0"
          sleep(0.1);             //  Duração do nível "1"
          outport(0x378, 0);   //  Setar todos os pinos da paralela para "0")
          sleep(0.1);            //  Duração do nível "0"
    }


Amigão Gil eu estou torcendo para que o C++ BUILDER aceite sleep menor do que 1ms, vou chegar em casa hoje e ja vou direto testar.......

Citar
Se o valor mínimo for 1, então a frequência máxima obtida com esse comando no C++ é de 500 Hz, pois são 1ms no nível 1 e 1 ms no nível 0.


Sinceramente uma frequencia muito pequena pra rodar um motor a passo que tem um clock como tipo de acionamento......na o sei muito bem como calcula isso pra rodar o motor a passo..seria dividir as especificações do motor pela frequencia? deve haver um calculo :-\

Citar
Esse comando sleep não é padronizado, há compiladores em que o valor é em segundos, aceitando-se valores menores do que um.


Isso é verdade Gil, observando aqui na internet achei ate comando de tempo  como por exemplo "usleep" e disseram no forum que era pra frequencias abaixo de 1ms ou seja, microsegundos..

Citar
Se o seu projeto está perdido eu não sei  :)

Caro amigo Gil, so ainda não estou perdido porque pessoas como você não desistem de mim :D senão talvez ja teria apagado todo o meu codigo e desistido de tudo.
parabens por ser assim.

Citar
Pois ainda há várias opções: usar assembly, não usar o sleep, usar outra linguagem......

So apenas ainda nao usei o PIC 16F877A para esse projeto que inclusive tem comando de tempo abaixo de 1ms, porque eu preciso de uma interface pra operar os sistema o C++ BUILDER é um "animal" nisso muito bom mesmo.

Voce poderia testar qual a frequencia que esse programa abaixo gera em teu sistema:

Citar
    while(1)
    {
          outport(0x378, 0x2); // Setar pino 2 da porta paralela em nivel "1" e o resto em "0"
          outport(0x378, 0);   //  Setar todos os pinos da paralela para "0")
    }

posso sim amigo, so não faço agora porque simplesmente meus equips de eletronica estão em casa..mas nao perde por esperar.. ja estou correndo pra casa pra efetuar todos esses testes e posto em seguida....abração.
[/quote]

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #11 Online: 04 de Outubro de 2009, 13:17 »
Citar
Voce poderia testar qual a frequencia que esse programa abaixo gera em teu sistema:

Citar
    while(1)
    {
          outport(0x378, 0x2); // Setar pino 2 da porta paralela em nivel "1" e o resto em "0"
          outport(0x378, 0);   //  Setar todos os pinos da paralela para "0")
    }

Caro amigo, eu testei as linhas de programa acima  e nao acontece nada, nao existe nenhum sinal de clock na entrada.

Depois disso eu adicionei um Sleep com uma atraso de 1ms e testei com o frequencimentro do meu multimetro e tive uma grande surpresa!!! tava dando 035 hz, isso ja com com o menor atraso que é de 1ms, impressionante como esta baixa a frequencia, desse jeito o motor nao roda rapido de jeito nenhum....

depois eu abri o kcam  e testei o eixo "Y" e a velocidade do motor foi estarrecedoramente alta, sendo assim resolvi testar a frequencia que o KCAM e estava mandando para o L297, outra surpresa!!! estava dando 435 hz, ou seja 12,5X a mais do que o meu programa, com isso cheguei  a conclusao que preciso mudar a forma de gerar o clock que quero

mas em tese o comando sleep nao era pra da so 35hz com os parametros que usei.....agora encucou tudo...
« Última modificação: 04 de Outubro de 2009, 13:29 por matrixlan1 »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #12 Online: 04 de Outubro de 2009, 13:39 »
Citar
    while(1)
    {
          outport(0x378, 0x2); // Setar pino 2 da porta paralela em nivel "1" e o resto em "0"
          outport(0x378, 0);   //  Setar todos os pinos da paralela para "0")
    }

Caro amigo, eu testei as linhas de programa acima  e nao acontece nada, nao existe nenhum sinal de clock na entrada.

Eu não afirmaria isso categoricamente, já fiz programa desse tipo em DOS e algo deveria ser gerado. Mas também não vou afirmar que voce está errado. A verdade.... só com um osciloscópio.

As coisas não são tão simples assim....

Depois disso eu adicionei um Sleep com uma atraso de 1ms e testei com o frequencimentro do meu multimetro e tive uma grande surpresa!!! tava dando 035 hz, isso ja com com o menor atraso que é de 1ms, impressionante como esta baixa a frequencia, desse jeito o motor nao roda rapido de jeito nenhum....

depois eu abri o kcam  e testei o eixo "Y" e a velocidade do motor foi estarrecedoramente alta, sendo assim resolvi testar a frequencia que o KCAM e estava mandando para o L297, outra surpresa!!! estava dando 435 hz, ou seja 12,5X a mais do que o meu programa, com isso cheguei  a conclusao que preciso mudar a forma de gerar o clock que quero

mas em tese o comando sleep nao era pra da so 35hz com os parametros que usei.....agora encucou tudo...

O problema é o velho e bom Windows. Programação em tempo real com Windows é coisa "cabeluda" mesmo... É por isso que os desenvolvedores de programas desse tipo usam o DOS ou o Linux (que permitem acessar o hardware diretamente, tendo controle total do PC.
 
Para usar o Windows, tem que fazer alguns truques "sujos"...


matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #13 Online: 05 de Outubro de 2009, 20:28 »
Citar
O problema é o velho e bom Windows. Programação em tempo real com Windows é coisa "cabeluda" mesmo... É por isso que os desenvolvedores de programas desse tipo usam o DOS ou o Linux (que permitem acessar o hardware diretamente, tendo controle total do PC.

Eu gosto muito do C++ BUILDER amigo, acho que por ser uma ferramenta de programação dedicada a interface fica devendo algumas outras coisas como por exemplo esse problema que estou enfrentando.
Qual programa outra plataforma você me indicaria pra terminar meu projeto} delphi?

Bem vindo à "selva"... 

OOOPPPPAAAA!!!! é nessa selva que eu estou ja quase morrendo, vou ter que ver como faço pra sobreviver
 
Citar
Para usar o Windows, tem que fazer alguns truques "sujos"...

Pelo meu modo de ver o tio bill gates se encarregou de deixar a nossa vida muito pior na versao do winxp....

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #14 Online: 06 de Outubro de 2009, 04:37 »
Eu gosto muito do C++ BUILDER amigo, acho que por ser uma ferramenta de programação dedicada a interface fica devendo algumas outras coisas como por exemplo esse problema que estou enfrentando.
Qual programa outra plataforma você me indicaria pra terminar meu projeto} delphi?

Pois é, o Windows foi feito basicamente para ser uma grande interface gráfica.... Acredito que o C++ Builder vai um pouco nessa linha. O Builder também possui funções de gerenciamento de arquivos, redes, imagem, som, ... mas tempo real mesmo é uma outra história. Aplicações de tempo real requerem mais controle do PC (para garantir a temporização) e isso é uma coisa na contramão do que o Windows faz, que é também ter controle da máquina, mas dentro desse contexto de interface gráfica.

Tirei esse trecho da página da Microsoft (http://support.microsoft.com/kb/22523):

Windows não oferece suporte a programação em tempo real

Em nenhum sentido pode Microsoft Windows ser considerada um sistema "em tempo real". Ele é um sistema orientado a mensagem, pesquisa de evento, com o agendamento nonpreemptive.

O Windows é um sistema que essencialmente baseia-se em eventos do tipo: cliques e rolagem do mouse, acionamento do teclado, ....), ou seja, interface com o usuário. Já sistemas de tempo real precisam atender a restrições de tempo de resposta, eventos periódicos, baixo tempo de latência, priorização de interrupções, preempção, ....

Já fiz alguns programas em VB 3.0 em Windows 3.11, que efetuavam controle do tipo PID (proporcional, integral, derivativo) em malha fechada (bons tempos...) acho que o mais rápido era 100 ou 200 ms. Acho que isso só era possível porque, essas primeiras versões de Windows eram "cascas gráficas" em cima do DOS.

Bem vindo à "selva"... 

OOOPPPPAAAA!!!! é nessa selva que eu estou ja quase morrendo, vou ter que ver como faço pra sobreviver
 
Citar
Para usar o Windows, tem que fazer alguns truques "sujos"...

Pelo meu modo de ver o tio bill gates se encarregou de deixar a nossa vida muito pior na versao do winxp....

Não acho que o Bill Gates esteja muito interessado no mercado de sistemas de tempo real (acredito que o mercado é relativamente pequeno face aos sistemas de multimídia, jogos, ...). Mas também não tenho experiência em programar em Windows nesse nível de milissegundos, para controlar um motor de passo. Aliás, acho que é uma tarefa hercúlea e que requer muitas ferramentas, compiladores e conhecimentos mais específicos. E também creio que o esforço para uma atividade de programação em tempo real, do tipo hobby, teria mais retorno usando o DOS (Ex.: FreeDOS) ou o Linux.

Uma outra abordagem é tratar o Windows naquilo que é mais indicado, que é ser uma boa interface com o usuário e acoplar a esse sistema um outro processador (PIC, PC) para as aplicações de baixo nível e de baixo tempo de resposta. Nesse sistema poderia ser empregado DOS, LINUX ou nenhum sistema operacional.