Página 1 de 1

Como medir a largura de um pulso com precisão?!

MensagemEnviado: 25 Mai 2007 02:10
por Fabio_Jerena
Pessoal, eu fiz esse programa para medir a largura de um pulso e reproduzir este valor numa saída, porem são tantos detalhes nos timers que eu estou meio perdido, eu testei o programa assim e ele não está funcionando, alguem pode me ajudar?!

#include "D:\Experiência_PIC\experiencia_pic.h"
#ZERO_RAM

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição e inicialização das variáveis *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

long int tempo_high=20;
short int identifica_pulso=0;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição e inicialização dos port's *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#use fast_io(a)
#use fast_io(b)

#byte porta = 0x05
#byte portb = 0x06

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* ENTRADAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As entradas devem ser associadas a nomes para facilitar a programação e
//futuras alterações do hardware.

#bit entrada = portb.0 // Entrada do pulso que eu quero analisar

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As saídas devem ser associadas a nomes para facilitar a programação e
//futuras alterações do hardware.

#bit led_green = portb.1 //acende o led verde
#bit led_red = portb.2 //acende o led vermelho


#int_TIMER1
TIMER1_isr()
{
led_red=0;
}

#int_EXT
EXT_isr()
{
if(identifica_pulso)
{
tempo_high = (get_timer0 ()+1) * 256;
ext_int_edge(0, L_TO_H);
identifica_pulso=0;
return;
}
set_timer0 (0);
ext_int_edge(0, H_TO_L);
identifica_pulso=1;
}

void main()
{
setup_vref(FALSE);
setup_comparator(NC_NC_NC_NC);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_16,255,1);
enable_interrupts(INT_EXT | INT_TIMER1);
ext_int_edge(0, L_TO_H);
enable_interrupts(global);

set_tris_a(0b11111111); // configuração da direção dos pinos de I/O
set_tris_b(0b11111001);

porta=0x00; // limpa porta
portb=0x00; // limpa portb

led_red=0;
led_green=0;

while(true)
{
led_red=1;
set_timer1 (65536-tempo_high-1);
delay_us(20);
}

}

Re: Como medir a largura de um pulso com precisão?!

MensagemEnviado: 25 Mai 2007 09:00
por andre_luis
Fábio,

A experiencia mostra que em se tratando de programação, o melhor a fazer é se testar cada linha editada individualmente, pois se voce escrever algumas páginas de código e o programa nao funcionar, voce nao saberá em qual linha o erro se encontra. Se for passo-a-passo, a linha problemática será a última editada após o programa parar de funcionar. Inicia testando o Led,depois o associa à um timer, e por aí adiante.

Posso não ter ajudado muito, mas estou apenas te passando umas dicas que me tem servido.

+++

Re: Como medir a largura de um pulso com precisão?!

MensagemEnviado: 25 Mai 2007 11:16
por Fabio_Jerena
andre_teprom escreveu:Fábio,

A experiencia mostra que em se tratando de programação, o melhor a fazer é se testar cada linha editada individualmente, pois se voce escrever algumas páginas de código e o programa nao funcionar, voce nao saberá em qual linha o erro se encontra. Se for passo-a-passo, a linha problemática será a última editada após o programa parar de funcionar. Inicia testando o Led,depois o associa à um timer, e por aí adiante.

Posso não ter ajudado muito, mas estou apenas te passando umas dicas que me tem servido.

+++


E acho que sua dica foi pertinente...
Eu sempre saio fazendo para não perder a linha de raciocinio e quando vou já está pronto o programa, na maioria das vezes ele dá pau e eu não sei onde está o problema porque já têm tanta coisa feita!!!
Eu não sou programador, mexo nessas coisas por hobby e me falta um método de trabalho, isso faz a diferença entre um amador e um profissional!
Agradeço a dica, nesse eu também fiz isso mas consegui detectar onde está o erro, só não sei solucioná-lo...
Minha dúvida é se a rotina que identifica a largura de pulso está correta e mede com boa precisão e a outra está no pulso que eu vou gerar, acho que fiz alguma besteira ali, me atrapalho um pouco com os timers e tratamento de interrupção, por isso postei para ver se alguem vê alguma besteira que eu ainda não consegui identificar...
Na função de delay quando eu tiro aquele valor que eu queria passar e coloco números funciona direitinho, meu problema está na parte que gera o pulso com a referencia do tempo que eu medi...
Muito obrigado pela dica!!!

Re: Como medir a largura de um pulso com precisão?!

MensagemEnviado: 25 Mai 2007 11:40
por andre_luis
Só minha observação :

1) Em princípio, não é conveniente trabalhar com rotinas de delay quando se trabalha com interrupção. Nesse teu caso, não parece atrapalhar não, mas é bom evitá-la.

2) A variável identifica_pulso me parece desnecessária.

3) Se voce estiver usando o CCS, usa o plugin do MPLAB para testar cada trecho do código. Eu acho que a multiplicação por 256 pode estar gerando um casting para 8 bits, mas é só um palpite.


+++