Ir ao conteúdo
  • Cadastre-se
wconrado

Executar if com delay sem atrapalhar interrupção externa

Recommended Posts

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?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
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.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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ç

Compartilhar este post


Link para o post
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.?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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.?

Compartilhar este post


Link para o post
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. 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpe minha burrice mas ainda está enevoado pra mim. O resumo seria: você quer APLICAR tensão analógica em alguns pinos do seu controle? é isso? Ou quer LER as tensões analógicas que ele fornece? (acho que não né...)

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim era isso que eu precisava saber, agora me surgiu uma dúvida, qual seria a frequência PWM ideal para trabalhar com esse circuito?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×