Ir ao conteúdo
  • Cadastre-se

Executar if com delay sem atrapalhar interrupção externa


wconrado

Posts recomendados

Olá pessoal, estou implementando um projeto onde tenho um controle desses de vídeo game onde tento substituir o controle analógico 3d por um mouse ps2 ou seja quando eu movo o mouse para direita eu leio os bits enviados pelo mouse e envio sinal para o contato do analógico do controle até ai tudo bem consegui fazer porém acontece um problema no tempo de acionamento do controle analógico.

 

Uso a interrupção externa do PIC18F4550 para ler os bits do mouse, quando leio os bits eu verifico se o mesmo moveu para um lado se sim envio o sinal para um pino de saída do PIC que esta ligado a um optoacoplador 4n35 que deixa passar a corrente comum negativo para o contato do analógico do controle.

 

porém o que ocorre é que quando eu envio o sinal output_high eu tenho que mandar logo um output_low para para o movimento, então se eu coloco um delay entre o output_high e o output_low o delay atrapalha a proxima execução da interrupção externa que pode ocorrer a qualquer momento quando eu movo o mouse, então e se eu não coloco delay entre o output_high e output_low acho que por ser muito rápido a execução o sinal parece que não chegar no analógico então o mesmo não se move ou se move não dá nem para perceber.

 

Gostaria de tirar a duvida com vocês se eu usar um timer o mesmo não interferiria na interrupção externa ou se tem outra solução para esse problema?

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Isso não é nada bom. Sugiro 1 puxão de orelha por parte da moderação.

@wconrado pra que o timer não interfira na interrupt externa esta deve ter prioridade sobre a interrupt do timer.. se esta for tua ideia. Uma outra seria desligar temporariamente a interrupt pra enviar o pulso. Algo como

GIE=0;

RB1=1;

delay(xxx);

RB0=0;

GIE=1;

Se quiser complicar, use um 555 monestável pra gerar pulso com largura constante. Dispare pino 2 dele com RB1 e um capacitor.

Complicar ainda +? Também pode usar um resistor/capacitor no comparador.  Tenta captar. Não tem como transferir esta ideia pra texto ok?

Link para o comentário
Compartilhar em outros sites

Pensei em usar o PWM do próprio PIC para gerar o pulso mas o problema gira em torno da disponibilidade da interrupção externa se eu desabilitar ela mesmo que temporariamente e nesse momento eu mover o mouse ele vai enviar os pulsos de Clock para a porta da interrupção externa e nesse momento se a interrupção estiver desabilitada eu vou perder o byte ou parte dele o que traria uma perca de um movimento.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

sim pode usar o pulso pwm - se não se importar de enviar pulsos - ou até mesmo enviar 0xff pelo spi. Faz um efeito semelhante ao 555 monoest. Ao enviar 0xff pelo MOSI (ou MISO... nunca lembro) do spi e conhecer a freq, vai saber quanto tempo ele permanece em 1. Como isso não depende do sw, não precisa desabilitar a interrupt.

abç

Link para o comentário
Compartilhar em outros sites

Obrigado Isadora pelas respostas, consegui resolver esta questão da disponibilidade usando interrupção por estado da porta.

 

porém agora tenho uma outra questão que é seguinte, eu uso um transistor para acionar a passagem da corrente negativa para o potenciômetro, nesse caso se eu usar um PWM para substituir o potenciômetro como eu trabalharia com essa corrente negativa já que a saída do pino do PWM é positiva (Teria com ser negativa direto para os contatos do potenciômetro)?


Li algumas coisas a respeito do PWM Vref+- mas não entendi muito bem o que esse Vref+- manipula se é uma escolha de saída + - ou se é somente uma referencia a uma tensão de comparação.?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

ok estado de porta. não tenho certeza se não sei se entendi ou  não mas tudo bem.

 

Talvez seja melhor você publicar algum desenho. Entendeu ou quer que eu desenhe?

Vref e tal é pra circuito analógico. o mc faz este trabalho sujo pra você ao gerar pulsos pwm. você controla sua largura num registro qualquer. Mas penso o que você precisa é simplesmente um filtro rc

 

scales_PWM-to-analog.png

 

Analog out tende a ser o valor analógico do registro do pwm. Os valores é o que estavam na net. Adeque à sua realidade.

Tem gente (tipo eu) que gosta de colocar um buffer pra isso...

ampop-seguidor.gif

 

analog out no vin

Link para o comentário
Compartilhar em outros sites

Para esse fim você acha melhor usar um filtro RC ou um amplificador operacional tipo o Op-amp 741 para tornar negativa a saída? Lembrando que o contato onde vai a conexão do potenciômetro é alimentado pelo terra do próprio controle(o Pic também é alimentado pelo controle), gostaria de ter o menor input lag possível.?

Link para o comentário
Compartilhar em outros sites

 

Untitled Sketch_bb.jpg

 

Tentei desenhar igual ao que eu estou fazendo a diferença é que o PIC é o PIC18F4550, o 4n35 é para passar o negativo para os contatos do analógico do controle, lembrando que como eu não estou usando o potenciômetro do analógico pois o mesmo foi removido eu usei 2 resistor de 5k para fazer o papel do potenciômetro onde quando não acionados mantem o cursor no meio.

 

O que eu gostaria de fazer é eliminar os resistor usando o PWM onde poderia ficar em 50% no meio, 0% esquerda e 100% direita. Se eu tiver um sinal negativo direto do PWM eu também eliminaria o 4n35 e diminuiria o tempo de comutação assim diminuindo o input lag. 

 

Link para o comentário
Compartilhar em outros sites

Tenho um mouse ligado no pino da interrupção externa do PIC que recebe os bytes de movimento então o PIC interpreta o byte referente a direção que eu movi o mouse e então passa para um pino de saída que envia a tensão analógica no pino do controle para que o controle se mova referente a direção que eu movi o mouse.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

ok isso basta.

25 minutos atrás, wconrado disse:

envia a tensão analógica no pino do controle

Neste caso, penso que isso...

scales_PWM-to-analog.png

atende o que você quer. Aquele pwm in vem da saída pwm do seu pic. E o Analog out vai pro seu controle.

E talvez você precise disso

ampop-seguidor.gif

pra casar as impedâncias. Pra constar, desconheço seu controle bem como suas características eletrônicas

 

Sinto muito mas estou com dificuldade de explicar de outra forma. Mas se não entendeu, não se acanhe, faça mais perguntas e principalmente faça mais desenhos ok? O que você fez não é um esquemático. Só quebrou o galho.

 

off topic meio on...

você sabia, caro leitor, que a maioria dos pic´s tem "saída analógica" de 5 bits? Talvez ninguém saiba .. ainda. Descobri por acaso, sem consulta na net. Se 1 dia quiser saber.. já sabe.

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...