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

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

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

Mensagempor Fabio_Jerena » 25 Mai 2007 02:10

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);
}

}
Fábio Jerena
Fabio_Jerena
Nibble
 
Mensagens: 52
Registrado em: 08 Mar 2007 08:59

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

Mensagempor andre_luis » 25 Mai 2007 09:00

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.

+++
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

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

Mensagempor Fabio_Jerena » 25 Mai 2007 11:16

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!!!
Fábio Jerena
Fabio_Jerena
Nibble
 
Mensagens: 52
Registrado em: 08 Mar 2007 08:59

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

Mensagempor andre_luis » 25 Mai 2007 11:40

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.


+++
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x