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

Description:

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

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #60 Online: 13 de Outubro de 2009, 14:32 »
Citar
crie variáveis do tipo double:

double Ton, Toff;

quando atualizar o valor do slider, jogue nessas varáveis.

no caso eu teria que incrementar uma unica variavel tipo long e o Ton e Toff teriam o mesmo tamanho e largura assim:

long  VELOCIDADE;

 VELOCIDADE = TrackBar1->Position;

e ficaria assim?
................... .............
      } while( (double(stop.QuadPart - start.QuadPart) / freq.QuadPart * 1000000) <= VELOCIDADE );
................... ..................
           } while( (double(stop.QuadPart - start.QuadPart) / freq.QuadPart * 1000000) <= VELOCIDADE );

se eu quisesse tempos diferentes pra Ton e Toff teria que usar duas variaveis do tipo long?




Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re: CLOCK em microsegundos
« Resposta #61 Online: 13 de Outubro de 2009, 23:24 »
Odail,

Citar
no caso eu teria que incrementar uma unica variavel tipo long e o Ton e Toff teriam o mesmo tamanho e largura assim:

long  VELOCIDADE;

 VELOCIDADE = TrackBar1->Position;

e ficaria assim?
................... .............
      } while( (double(stop.QuadPart - start.QuadPart) / freq.QuadPart * 1000000) <= VELOCIDADE / 2); // Ton = 50%;
................... ..................
           } while( (double(stop.QuadPart - start.QuadPart) / freq.QuadPart * 1000000) <= VELOCIDADE / 2); Toff = 50%;

Citar
se eu quisesse tempos diferentes pra Ton e Toff teria que usar duas variaveis do tipo long?
exato.

fiz umas modificações no prog, oia como ficou:

Código: [Selecionar]
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define MAIN_CAPTION "uTimer v1.0"

#define fMin 10
#define fMax 5000

HINSTANCE hInst;

HWND hMain;
HWND hLabel_Freq, hLabel_Duty, hLabel_Ton, hLabel_Toff;
HWND hScroll_Duty, hScroll_Freq;

HANDLE hThread;

unsigned long Freq, Measuring;
unsigned long Duty, Ton, Toff;

char buffer[25];

DWORD WINAPI Thread_uTimer(LPVOID lpParam){
LARGE_INTEGER freq, start, stop;
LARGE_INTEGER start_measure, stop_measure;

SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

QueryPerformanceFrequency(&freq);

QueryPerformanceCounter(&start_measure);
while(1){

_outp(0xA800, 2);
QueryPerformanceCounter(&start);
do{
SwitchToThread();
QueryPerformanceCounter(&stop);
} while(((stop.QuadPart - start.QuadPart) * 1000000) / freq.QuadPart <= Ton);

_outp(0xA800, 0);
QueryPerformanceCounter(&start);
do{
SwitchToThread();
QueryPerformanceCounter(&stop);
} while(((stop.QuadPart - start.QuadPart) * 1000000) / freq.QuadPart <= Toff);

Measuring++;
QueryPerformanceCounter(&stop_measure);
if((stop_measure.QuadPart - start_measure.QuadPart) / freq.QuadPart >= 1){
_snprintf(buffer, 25, "Freq: %i Hz", Measuring);
SetWindowText(hLabel_Freq, buffer);
QueryPerformanceCounter(&start_measure);
Measuring = 0;
}
}
return 0;
}

LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch(uMsg){
case WM_CREATE:{
SetWindowPos(hwnd, NULL, (GetSystemMetrics(SM_CXSCREEN) / 2) - (300 / 2), (GetSystemMetrics(SM_CYSCREEN) / 2) - (140 / 2), 300, 140, SWP_NOZORDER | SWP_SHOWWINDOW);

hLabel_Freq = CreateWindowEx(NULL, "STATIC", NULL, WS_CHILD | WS_VISIBLE, 10, 10, 130, 16, hwnd, 0, hInst, NULL);
hLabel_Duty = CreateWindowEx(NULL, "STATIC", NULL, WS_CHILD | WS_VISIBLE, 10, 30, 130, 16, hwnd, 0, hInst, NULL);
hLabel_Ton  = CreateWindowEx(NULL, "STATIC", NULL, WS_CHILD | WS_VISIBLE, 10, 50, 130, 16, hwnd, 0, hInst, NULL);
hLabel_Toff = CreateWindowEx(NULL, "STATIC", NULL, WS_CHILD | WS_VISIBLE, 10, 70, 130, 16, hwnd, 0, hInst, NULL);

hScroll_Freq = CreateWindowEx(NULL, "SCROLLBAR", NULL, WS_CHILD | WS_VISIBLE | SBS_HORZ, 150, 10, 130, 16, hwnd, 0, hInst, NULL);
hScroll_Duty = CreateWindowEx(NULL, "SCROLLBAR", NULL, WS_CHILD | WS_VISIBLE | SBS_HORZ, 150, 30, 130, 16, hwnd, 0, hInst, NULL);

SetScrollRange(hScroll_Freq, SB_CTL, fMin, fMax, TRUE);
SetScrollRange(hScroll_Duty, SB_CTL, 1, 99, TRUE);

Measuring = 0;

Duty = 50;
Freq = (1000000 / fMin);

Ton  = (Freq * Duty) / 100;
Toff = Freq - Ton;

_snprintf(buffer, 20, "Freq: %i Hz", Measuring);
SetWindowText(hLabel_Freq, buffer);
_snprintf(buffer, 32, "Duty: %i %%", Duty);
SetWindowText(hLabel_Duty, buffer);
_snprintf(buffer, 32, "Ton: %i us", Ton);
SetWindowText(hLabel_Ton, buffer);
_snprintf(buffer, 32, "Toff: %i us", Toff);
SetWindowText(hLabel_Toff, buffer);

SetScrollPos(hScroll_Duty, SB_CTL, Duty, TRUE);

hThread = CreateThread(NULL, 0, Thread_uTimer, NULL, 0, NULL);

break;}
case WM_HSCROLL:{
HWND hScroll = (HWND)lParam;
SCROLLINFO si;
int CurPos;

CurPos = GetScrollPos(hScroll, SB_CTL);

si.cbSize = sizeof(si);
si.fMask  = SIF_ALL;
GetScrollInfo(hScroll, SB_HORZ, &si);

switch(LOWORD(wParam)){
case SB_ENDSCROLL:{
if(hScroll == hScroll_Freq){
Freq = (1000000 / CurPos);

Ton  = (Freq * Duty) / 100;
Toff = Freq - Ton;

_snprintf(buffer, 25, "Ton: %i us", Ton);
SetWindowText(hLabel_Ton, buffer);

_snprintf(buffer, 25, "Toff: %i us", Toff);
SetWindowText(hLabel_Toff, buffer);
} else if(hScroll == hScroll_Duty){
Duty = CurPos;
Ton  = (Freq * Duty) / 100;
Toff = Freq - Ton;

_snprintf(buffer, 25, "Duty: %i %%", Duty);
SetWindowText(hLabel_Duty, buffer);

_snprintf(buffer, 25, "Ton: %i us", Ton);
SetWindowText(hLabel_Ton, buffer);

_snprintf(buffer, 25, "Toff: %i us", Toff);
SetWindowText(hLabel_Toff, buffer);
}
break;}
case SB_LEFT:{
CurPos--;
break;}
case SB_RIGHT:{
CurPos++;
break;}
case SB_LINELEFT:{
CurPos--;
break;}
case SB_LINERIGHT:{
CurPos++;
break;}
case SB_PAGELEFT:{
CurPos -= 10;
break;}
case SB_PAGERIGHT:{
CurPos += 10;
break;}
case SB_THUMBPOSITION:{
CurPos = HIWORD(wParam);
break;}
case SB_THUMBTRACK:{
CurPos = HIWORD(wParam);
break;}
}

SetScrollPos(hScroll, SB_CTL, CurPos, TRUE);

break;}
case WM_CLOSE:{
if(hThread != INVALID_HANDLE_VALUE) CloseHandle(hThread);
DestroyWindow(hLabel_Freq);
DestroyWindow(hLabel_Duty);
DestroyWindow(hLabel_Ton);
DestroyWindow(hLabel_Toff);
DestroyWindow(hScroll_Freq);
DestroyWindow(hScroll_Duty);
DestroyWindow(hwnd);
break;}
case WM_DESTROY:{
PostQuitMessage(0);
break;}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hInstNULL, LPSTR lpszCmdLine, INT nCmdShow){
MSG Msg;
WNDCLASSEX wc;

hInst = hInstance;

ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_DBLCLKS;
wc.hInstance = hInstance;
wc.lpfnWndProc = MainWindowProc;
wc.hIcon = LoadIcon(hInstance, NULL);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wc.lpszClassName = "uTimer_MAINCLASS";
if(!RegisterClassEx(&wc)) return 1;

hMain = CreateWindowEx(0, "uTimer_MAINCLASS", MAIN_CAPTION, WS_CAPTION | WS_SYSMENU, 0, 0, 0, 0, HWND_DESKTOP, NULL, hInstance, 0);

while(GetMessage(&Msg, 0, 0, 0)){
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}

UnregisterClass("uTimer_MAINCLASS", hInstance);

return 0;
}
« Última modificação: 13 de Outubro de 2009, 23:31 por Cláudio S. Freund »

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #62 Online: 14 de Outubro de 2009, 13:36 »
Nossa Claudio, ficou muito massa assim, eu nao consegui rodar nem dessa vez fazendo modificações aqui, poderia disponibilizar o main.ccp? Pelo que pude notar vc fez modificações pra poder mexer na frequencia de operação correto?

 Como adicionar pra vc faz como rótulo, como telas e não Visual C + + e em codigo puro ou é arasstando botões do menu para o FORM?

 fiz o download de  Visual C + + 2008 Express Edition  pra testar melhor o codigo mas alguns erros da, você sabe se essa versão é direcionada uma tambem objetos?

 Qual você me indicaria pra começar? os codigos do visual C e C + + Builder so são tão compativeis pra arquivos .ccp (?), pros objetos ja da erros, e retirando os label's do 1 ° código que enviou deu certo ....


 Só mais uma pergunta vc programa em linguagens quantas?? D;
« Última modificação: 14 de Outubro de 2009, 14:09 por matrixlan1 »

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re: CLOCK em microsegundos
« Resposta #63 Online: 14 de Outubro de 2009, 15:11 »
Como adicionar pra vc faz como rótulo, como telas e não Visual C + + e em codigo puro ou é arasstando botões do menu para o FORM?
é "código puro" mesmo. as referências vc encontra no http://msdn.microsoft.com/en-us/library/aa139672.aspx

Citar
fiz o download de  Visual C + + 2008 Express Edition  pra testar melhor o codigo mas alguns erros da, você sabe se essa versão é direcionada uma tambem objetos?
é OOP sim. Os erros aconteceram pq é necessário configurar os parâmetros do projeto. vou anexar o prog em VC2008 compilado.

Citar
Qual você me indicaria pra começar? os codigos do visual C e C + + Builder so são tão compativeis pra arquivos .ccp (?), pros objetos ja da erros, e retirando os label's do 1 ° código que enviou deu certo ....

é compativel pq a linguagem C é padronizada. como eu não usei nenhuma biblioteca exclusiva do Visual C++ (com excessão da função _outp()), vc conseguiu compilar no builder.
Posta os erros que ocorreram. Talvez seja problema de conversão de tipos.

Citar
Só mais uma pergunta vc programa em linguagens quantas?? D;

Para aplicações windows, utilizo visual basic e C++ quando necessário.
« Última modificação: 14 de Outubro de 2009, 15:17 por Cláudio S. Freund »

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #64 Online: 16 de Outubro de 2009, 20:44 »
Opa sumi um pouco por causa de trabalho mais estamos aqui de novo, e desde já agradecer o Nosso estimável Professor GIL pelas suas valiosas dicas sobre sistemas operacionais e suas limitações (aprendi bastante).

E jamais deixaria de agradecer da super hiper mega ajuda do meu amigão Claudio S. que restaurou a esperança que ja nem tinha mais na realização do meu projeto simples (mais que é muito importante pra mim) me devolvendo a visão que nem sempre tudo está perdido e que quase sempre há uma luz no fim do túnel.....

      MEU MUITO OBRIGADO A TODOS!!!! ;D

E so pra não ficar falando aqui e provar que o esforço de voces não foram em vão em me ajudar, disponibilizo aqui meu projeto de interface de controle de motor a passo muito simples, mais que agora bota pressão nos motores e tira todo o proveito dos mesmo em VELOCIDADE MÁXIMA, graças as famosas linhas de programação QueryPerformanceFre quency e QueryPerformanceCou nter que definitamente salvarão esse projeto hobby e que foi possivel tirar todo proveito do motores a passo.....

Ainda não está pronto, mais quando estiver totalmente pronto vou disponibilizar o codigo aqui como fez o amigo Claudio S. pra quem quiser se aventurar e construir seus proprios controles com interface e tudo mais.

Gostaria ainda de contar com os amigos, pois ainda sou um pintinho saindo da "casca do ovo" e ainda faltam alguns ajustes pela frente...

OBRIGADO A TODOS

ABAIXO A FOTO DE COMO ESTA FICANDO A INTERFACE.
« Última modificação: 16 de Outubro de 2009, 20:46 por matrixlan1 »

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #65 Online: 28 de Outubro de 2009, 16:41 »
ja na fase final do programa de controle pra 3 motores XYZ, surgiu a necessidade de implantar uma sequencia de execução como no programa abaixo anexado a esta mensagem.

Claudio será que vc poderia me da uma força pra implantar?

sei que o principio é um listbox onde se adiciona todos os parametros e de DIR, VELOCIDADE, SENTIDO etc, e depois EXECUTA TUDO.

inclusive ja ate adicionei um listbox ao programa mas to meio perdido pra fazer executar os movimentos de dentro da lista para a porta paralela

Claudio será que vc poderia me da uma força pra implantar?

tem um post aqui no forum de um colega que estava montando mais ja é muito antigo veja:

http://www.guiacnc.com.br/index.php/topic,1197.0.html


 

/** * */