Ir ao conteúdo

Calcular tempo de execução da instrução "for" - C


advtec

Posts recomendados

Postado

Boa noite a todos.

Tenho uma dúvida para a qual não encontrei uma explicação concreta.

Por vezes quero gerar uma contagem de tempo usando a instrução "for". Por exemplo, em uma rotina de exibição de dados em displays ligados a um mesmo barramento (método de varredura) - mantenho um display ligado e o outro desligado, depois desligo o primeiro e ligo o segundo, numa frequência de cerca de 30Hz, causando a sensação de que ambos estão ligados (persistência retiniana). Entretanto, não consigo calcular, ou medir/verificar, o tempo de execução do "for" usado para isso. Em suma: como sei o tempo de execução do "for"? Assumamos que a frequência de operação do PIC seja de 4MHz. O compilador é o CCS-C. (Não quero usar delay_ms ou delay_us). Veja, abaixo, um trecho de código que ilustra um de meus projetos:


void tempo1(void)
{
char j, k;
for (j=0;j<85;j++) {
for (k=0;k<3;k++);
}
}

void tempo2(void) {
char j, k;
for (j=0;j<18;j++) {
for (k=0;k<3;k++);
}
}

void exibe_temp(void) { //exibição dos números - disp01 é dezena e disp02 é unidade.

output_b((display[varDez])); //captura número da dezena a partir da máscara
output_high(disp01); //liga display da dezena
tempo1(); //aguarda tempo antes de desligar disp01 e ligar disp02
output_low(disp01);
output_b((display[varUni])); //captura número da unidade a partir da máscara
output_high(disp02); //display da unidade
tempo1();
output_low(disp02);
tempo2();
}

Este código foi inspirado no código do voltímetro com PIC, publicado na Eletrônica Total nº 126. O código completo do voltímetro está em http://www.sabereletronica.com.br/paginas/index/downloads_eletronica_total , sob a identificação de "voltpic".

Desde já, agradeço as colaborações.

Bons trabalhos.

Postado

Acredito que seria mais fácil você criar uma interrupçao com tempo certo e dentro dela você incrementa o J e o K.

Dessa forma você saberá exatamente o tempo decorrido.

Falou

Postado

Entendo. Todavia, o projeto está usando os três timers para outras funcionalidades. Sei também que posso usá-los mesmo assim. Contudo, o uso da instrução "for" vem muito bem a calhar no meu caso. E tenho visto vários projetos utilizando este recurso (a exemplo do que citei na mensagem de abertura deste tópico). Será que é possível calcular o tempo?

Grato pela resposta dada e, desde já, agradeço pelas demais ainda por vir.

Obrigado e bons trabalhos.

Postado

Só existe um meio para calculo exato,voce terá que desassemblar a listagem e contar os ciclos de máquina relacionao a rotina FOR.

....................    char j, k; 
.................... for (j=0;j<18;j++) {
000F: BCF 03.5
0010: CLRF 21
0011: MOVF 21,W
0012: SUBLW 11
0013: BTFSS 03.0
0014: GOTO 01E
.................... for (k=0;k<3;k++);
0015: CLRF 22
0016: MOVF 22,W
0017: SUBLW 02
0018: BTFSS 03.0
0019: GOTO 01C
001A: INCF 22,F
001B: GOTO 016
....................
.................... }
001C: INCF 21,F
001D: GOTO 011
.................... }

Postado

Se for para usar um FOR para fazer um loop local, seria mais fácil usar delay_ms e delay_us que dará no mesmo.

Não sei qual é aplicação, mas verifique se precisa de uma taxa de atualização de 30Hz, caso contrario pode mudar o valor a cada 500ms que é suficientemente rápido para um olho humano, evidentemente deve conservar o ultimo valor amostrado no display.

Postado

Agradeço às ajudas prestadas e às ideias.

A informação dada por vtrx sana a minha dúvida. Entendo muito pouco de assembly, entretanto, surgiu a oportunidade de ampliar os estudos.

O tópico pode ser dado como resolvido.

Bons trabalhos.

  • Coordenador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!