Medir Tempo de Uma Rotina Com o Próprio PIC

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor itamar » 12 Jul 2013 21:03

Prezados colegas, esta semana me deparei com a seguinte ideia: Como medir quanto tempo o PIC gasta para executar uma determinada rotina(ou parte dela) num programa escrito em C(CCS) sem recorrer a nenhum recurso externo. O programa era bem simples, realizava a leitura de um Lm35 e enviava dos dados via cdc_USB.

Minha Ideia--->> Como o PIC realizava a leitura do canal AD e enviava os dados dentro do loop main eu estava interessado em saber quanto tempo era transcorrido entre o inicio e o fim de uma parte da rotina com todos os seus printf e delays. Utilizei um TIMER, mas quando a comunicação CDC é iniciada acredito que o compilador desabilita as interrupções pois ele diz que irá fazer (warnin 216 : interrupts disableb during call to prevent re-entrancy) lo meu método tem uma falha. Alguém conhece alguma forma menos tupiniquim para realizar essa tarefa?(se é que existe)

Código: Selecionar todos
#int_timer0
void Timer0_interrupt (void){
      if(flag==1){
      ++tempo;
      }
   }
   
void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit);      //21,3 us overflow
   setup_timer_2(T2_DIV_BY_4,0,15);      //0,3 us overflow, 5,0 us interrupt
   setup_adc( ADC_CLOCK_INTERNAL );
   setup_adc_ports( ALL_ANALOG );
   set_adc_channel( 0 );
   delay_ms(1);
   Disable_interrupts(GLOBAL);

lcd_init();
 
   enable_interrupts(INT_TIMER0);
   enable_interrupts(Global);
         
usb_cdc_init();
usb_init();
usb_task();                                 
 

do{

          if(dado_lido==0){
               Printf(lcd_putc,"\nAguardando Conexao");
            }

               while (!usb_enumerated()){}        // Espera a que o dispositivo seja enumerado
               while(!usb_cdc_connected()) {}      //Espera conectar   
     
//Contar o tempo da leitura e transmissão dos dados utilizando o timer0
   tempo=0;//zera o contador de overflow
   flag=1;//libera o contador
   set_timer0(0); // zera o timer
 
   
      leitura_ADC=read_adc();
      temperatura=leitura_ADC*0.4887585;
      ++dado_lido;
   
    if (usb_cdc_putready())printf(usb_cdc_putc,"\rADC=%Lu",leitura_ADC);
    if (usb_cdc_putready())printf(usb_cdc_putc,"\r\nDado Lido=%Lu",dado_lido);
    if (usb_cdc_putready())printf(usb_cdc_putc,"\r\nTEMP:%2.1f°C ", temperatura); //0.488 = 5.00*temperatura * (100.00/1023.00)

   printf(lcd_putc,"\nTemperatura=%Lu",leitura_ADC);
   delay_ms(10);
   flag=0; // para o contador
//para determinar o tempo total multiplicar a variável tempo pelo overflow (21,3ms)
   if (usb_cdc_putready())printf(usb_cdc_putc,"\rTempo=%Lu",tempo);
   tempo=0;
      }while (TRUE);
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor andre_luis » 12 Jul 2013 21:39

itamar,



Como a USB é exigente quanto ao timming do processamento, me parece que a desabilitação da interrupção é um mal necessário.

Acredito que voce possa utilizar o módulo CCP ( Contador ) para isso, mas aí teria de ter um oscilador externo.
Não tem nenhum circuito na sua placa que gere um trem de pulsos constantemente ?


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor itamar » 13 Jul 2013 09:35

Bem andre_teprom,

pelo que consegui medir aqui utilizando o método do timer, o tempo para completar essa parte do código (incluindo a multiplicação e o envio cdc_usb) foi aproximadamente 10ms... coloquei um delay para poder comparar e o tempo total indicado pela contagem das interrupções era sempre o tempo do delay + uns 10ms.

Quanto à possibilidade de gerar um trem de pulsos posso utilizar outro pic que tenho aki... mas aí ficaria mesmo só pela diversão (rsrsrs) para comparar os dois métodos (ainda estou vendo como implementar).

Outra ideia (maluca) que me ocorreu é olhar o asm gerado pelo compilador e contar (no braço mesmo) quantas instruções ele gasta e multiplicar isso pelo ciclo de máquina...

Alguma outra sugestão???
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor Rodrigo_P_A » 13 Jul 2013 10:22

Faz tempo que eu num trabalho com PIC, mas num precisa necessariamente habilitar a interrupção para contar o tempo se você configurar os divisores dele para que o incremento seja a cada sei lá 500uS , um timer de 16 bits vc conseguirá medir até uns 32ms sem interrupção, apenas iniciando e parando o timer depois lendo o registrador dele, ou não?
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor vtrx » 13 Jul 2013 14:28

Outra ideia (maluca) que me ocorreu é olhar o asm gerado pelo compilador e contar (no braço mesmo) quantas instruções ele gasta e multiplicar isso pelo ciclo de máquina...

É oque todo mundo faz...
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor andre_luis » 13 Jul 2013 15:02

vtrx escreveu:
Outra ideia (maluca) que me ocorreu é olhar o asm gerado pelo compilador e contar (no braço mesmo) quantas instruções ele gasta e multiplicar isso pelo ciclo de máquina...

É oque todo mundo faz...


Exceto quando há conectividade com dispositivos externos que possuam tempos de resposta próprios ( ETH, USB, etc... ).


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor itamar » 19 Jul 2013 10:25

Bem... depois de muito pensar nessa ideia, resolvi para. Mas descobri que a CCS tem uma ferramenta para isso no link http://www.ccsinfo.com/content.php?page=version5_info&navcode=/fpbVer5 na parte "statistics"... o único inconveniente é ter que comprar (rsrs)

Abraço a todos.
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor ze » 19 Jul 2013 13:24

sério? todo mundo conta no braço? mesmo? ninguém usa o recurso de break point p.ex e vê o numero de ciclos entre um e outro? só eu pow?
outra alternativa que eu (eu) ousaria: eleve um pino a 1 no começo e a 0 no fim e meça com osciloscópio. na verdade nem precisa de scope (preguiça de reescrever osciloscópio). caso o usb não zoe, daria pra ver no simulator logic analizer do mplab mesmo. (curiosamente estou fazendo isso agora. sério). mas acho que vou apostar nos break points.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor andre_luis » 19 Jul 2013 20:41

lellis escreveu:...outra alternativa que eu (eu) ousaria: eleve um pino a 1 no começo e a 0 no fim e meça com osciloscópio...


Na verdade, a restrição para utilização do Osciloscópio tinha sido colocada no enunciado do problema...

itamar escreveu:...sem recorrer a nenhum recurso externo...



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor vtrx » 19 Jul 2013 21:48

outra alternativa que eu (eu) ousaria: eleve um pino a 1 no começo e a 0 no fim e meça com osciloscópio

Daqui a pouco vai sugerir que ele compre um analisador lógico.. :?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor ze » 20 Jul 2013 20:51

algumas pessoas (algumas) não leem o que está entre parênteses. logicamente (e logicamente) pode-se fazer esta mera análise lógica simples com o mplab sem necessidade de analizador lógico. ilógico (2me) é contar no asm (iéca). Vida longa e próspera.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor andre_luis » 20 Jul 2013 22:13

lellis escreveu:...pode-se fazer esta mera análise lógica simples com o mplab sem necessidade de analizador lógico...


O que atrapalha nesse caso são os periféricos, que não são "simuláveis" pelo compilador(C) ou montador(ASM).

Considero que o desafio lançado pelo itamar fosse para estimular o raciocínio, e saber se alguém propõe alguma solução elementar que tenha escapado de todos nós, pois logo no início descartou a opção mais "simples", que no meu caso não atenderia, pois meu Osciloscópio não está funcionando.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor ze » 21 Jul 2013 02:34

tens toda razão amigo. no entanto permita-me...saibamos que o (meu) objetivo elementar é somar ou no minimamente acrescentar algo que não tenda a zero. muito menos subtrair (por favor, não compre um analisador). Eventualmente pode haver gente (não necessariamente o autor do tópico) que desconhece alguns recursos bacanas do mplab o qual sequer arranho a superfície e ficaria feliz em compartilhar o pouco (nada) que sei (desde que seja pisca led).
O autor pode ter no início descartado uma solução simples, mas no final achou uma mais simples ainda. Portanto peço perdão (desconsideração) pelo comentário neutro.
Seu osciloscópio talvez possa ser concertado, já meu raciocínio...
tenha uma próspera madrugada
(moderador permito de bom grado a deleção)
.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor itamar » 21 Jul 2013 10:34

Relendo aki o tópico vi que a experiência dos colegas é grande e as ideias apresentadas foram bastante proveitosas. Porém, gostaria de esclarecer alguns pontos para concentrar a discussão em torno do problema principal e manter nossas mentes abertas às possibilidades que tal solução nos traria:

1)Por que utilizar exclusivamente o PIC: poder "produzir" algo(comercial, educacional ou apenas Hobby) que seja stand-alone no sentido de que possa coletar e enviar(serial, USB, Wi-FI....) ou gravar os dados(data logger) por exemplo num Memory-Stick. Nesse caso a ideia de ter apenas um PIC para leitura de dados e base de tempo é importante pois a latência do canal de comunicação pode variar e não queremos que 1 amostragem a cada 100ms seja feita em 90 ou 130ms por exemplo. No caso do memory-stick, acredito que como nessa situação a USB não interfere mais, o problema seja mais fácil desde que o tempo de amostragem não extrapole o tempo de escrita na memória externa...

2)Quanto a frase:
Outra ideia (maluca) que me ocorreu é olhar o asm gerado pelo compilador e contar (no braço mesmo) quantas instruções ele gasta e multiplicar isso pelo ciclo de máquina...

Essa, juntamente com as ideias de usar o osciloscópio, analisador lógico e até colocar outro micro pra medir o tempo seriam muito boas se a latência da USB fosse constante (como já foi dito pelo andre_teprom), nesse caso bastaria medir uma vez na bancada e voilá... ou ainda se o dado enviado pela USB não fosse tão importante que em caso de não ser "recebido a tempo" poderia ser descartado e não fizesse com que cada execução da rotina pudesse levar um tempo diferente. Contudo, como os S.O's dos P.C's podem demorar mais ou menos tempo para receber o dado não adianta medir o tempo na bancada nem no montador, já que a execução da parte do código fica condicionada ao timing imposto pelo canal de comunicação.
3) Se fosse o caso de vida ou morte, possuindo apenas um grão de arroz e 3 palitos de fósforo para montar uma bomba ao estilo MacGyver... ficaria com a ideia do andre_teprom de utilizar o módulo CCP com um oscilador externo que ao que me parece é o que consome menos recursos concordam?

Abraço a todos
itamar
Nibble
 
Mensagens: 61
Registrado em: 24 Dez 2010 10:21

Re: Medir Tempo de Uma Rotina Com o Próprio PIC

Mensagempor Silvio51 » 21 Jul 2013 13:50

Rodrigo_P_A escreveu:Faz tempo que eu num trabalho com PIC, mas num precisa necessariamente habilitar a interrupção para contar o tempo se você configurar os divisores dele para que o incremento seja a cada sei lá 500uS , um timer de 16 bits vc conseguirá medir até uns 32ms sem interrupção, apenas iniciando e parando o timer depois lendo o registrador dele, ou não?



Itamar...

Você não leu a sugestão do Rodrigo ?

Eu só iria partir para um oscilador externo se não conseguisse com o timer sem interrupção...

Fazendo umas contas rápidas: Se o clock for de 48MHZ (deve ser !... por conta da USB). Cada ciclo corresponde a 0,083us.

Se utilizar um prescaler de 256 no Timerx, cada incremento ocorrerá a cada 256 X 0.083us = 21,248us

Multiplicando isso pelos máximos 65535 em 16bits... daria cerca de 1,39 segundos (tá certo isso ?)...

É tempo de sobra pra USB responder não acha ?
Silvio51
Byte
 
Mensagens: 383
Registrado em: 02 Nov 2006 14:04
Localização: Brasil


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

cron

x