Autor Tema: dos interrupciones mouse PC  (Leído 2216 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dragon_maldito

  • PIC10
  • *
  • Mensajes: 10
dos interrupciones mouse PC
« en: 24 de Julio de 2010, 00:36:59 »
Saludos.

Estoy tratando de hacer un ratón para computadora. Estoy en la parte de adquisicion de los datos del movimiento del Scroll. Esta ruedita envia 2 señales lógicas; cuando gira 1 "paso" estas señales cambian su valor de "0" a "1" lógico y cuando vuelve a girar vuelve a cambiar de "1" a "0". Si gira hacia abajo la rueda,  la señal 1 cambia antes que la señal 2. Si gira hacia arriba, la señal 2 cambia antes que la 1.

Estoy manejando estas señales por medio de interrupciones. Cada 8 Milisegundos debe adquirir cuantos "GIROS" hubo y hacia que direccion. En este momento estoy intentando hacer que, cuando gire hacia "arriba" se prenda un led, y cuando gire hacia "abajo" se apague. Este es el código que estoy utilizando pines RBO Y RB1 interrupciones. Led pin C1.


#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=9600)


int x=0;
int y=0;

#int_ext

void isr0()  //CODIGO DE LA INTERRUPCION RB0 //ABAJO
{
   {
   if (x==0)
      {
      x=1;
      }
   else
      {
      output_high(pin_C1);
      x=0;
      }
   }
   disable_interrupts(INT_EXT);
   if (PIN_B0==1)
      {
      ext_int_edge(H_TO_L);
      }
   else
      {
      ext_int_edge(L_TO_H);
      }
   enable_interrupts(INT_EXT);
}

#int_ext1
Void isr1()  //CODIGO DE LA INTERRUPCION RB1 ARRIBA
{
   {
   if (x==0)
      {
      x=1;
      }
   else
      {
      output_low(pin_C1);
      x=0;
      }
   }
   disable_interrupts(INT_EXT1);
   if (PIN_B1==1)
      {
      ext_int_edge(1,H_TO_L);
      }
   else
      {
      ext_int_edge(1,L_TO_H);
      }
   enable_interrupts(INT_EXT1);
}



void main()
{
//se inicializa todo
set_tris_b(0xBF);
set_tris_C(0x00);
enable_interrupts(INT_EXT);   //INTERRUPCION POR CAMBIO EN RB0
enable_interrupts(INT_EXT1); //INTERRUPCION POR CAMBIO EN RB1
enable_interrupts(global);   //
ext_int_edge(l_to_h);
ext_int_edge(1,l_to_h);
do
   {
y=1;
if(y==1)
y=0;
   }
while(1);
}


Pero con este código siempre se mantiene encencido el led del pin C1. ¿Que estoy haciendo mal?, se puede cambiar el flanco de bajada o subida en cualquier parte?, o no se puede hacer esto?.

Gracias y espero que alguine pueda ayudarme por Favor.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dos interrupciones mouse PC
« Respuesta #1 en: 24 de Julio de 2010, 00:55:56 »
Las 2 interrupciones van a ocurrir casi simultaneamente? Que diferencia de tiempo hay? Porque si es demasiado rápido las 2 banderas de interrupción se van a setear cuando se este salvando el contexto de la interrupción  :? Y no hay manera de saber cual se ha activado primero  :undecided:
No contesto mensajes privados, las consultas en el foro

Desconectado dragon_maldito

  • PIC10
  • *
  • Mensajes: 10
Re: dos interrupciones mouse PC
« Respuesta #2 en: 24 de Julio de 2010, 01:26:28 »
Es muy buena pregunta...

No se cuanto tiempo haya entre una y otra, no lo revisé en el osciloscopio. Yo espero que sea tiempo suficiente para cuando menos deshabilitar la siguiente interrupción en caso de que haya que cambiar  la forma de como detectar el movimiento.

Sin embargo, suponiendo que la rutina que hice si le alcanza el tiempo, crees que sea problema de cuando deshabilito la interrupcion y después verifique el estado del pin si es 0 o si es 1 y eso me este dando problemas al cambiar el flanco??? Sería mejor puentear esas entradas a otros pines y checar las entradas con estos otros pines???

Gracias por tu ayuda y espero me puedas seguir ayudando.