Autor Tema: COMO USAR EL TIMER Y A LA VES INTERUCCION EXTERNA EN UN pic usando el pin rb0  (Leído 2703 veces)

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

Desconectado jhoonyn46

  • PIC10
  • *
  • Mensajes: 21
hola buenos dias estoy relizando un proyecto en lenguaje c para un pic 16f628a y el proyecto se trata de agarrar los datos que envia un mouse de pc ps/2 y cambiarlo a otros datos carculados por mi para enviarlos a otro equipo. el problema que tengo es q la comunicacion del mouse es sincrona osea q trabaja con un reloj interno de el . pero no es como el del teclado q se activa al pulsar una tecla , yo ñe hice unas prueba y me di cuenta q necesita q la linea del reloj interno q tiene el se la bajen a cero cada sierto tiempo para q el integrado del mouse sepa q esta conectado a una pc y cuando quiera puede transmitir, yo no se como hacer q por el mismo pin rbo q lo tengo asigndo a la interruccion externa ponerlo cada ciertos tiempo q le baje la linea del reloj al mouse asi el no este transmitiendo en ese momento, espero q me puedn ayudar porq de verdad necesito ayuda en este tema porq soy nuevo enesto de la programacion. saludos y gracias por todo.


LO QUE TENGO ES ESTO PARA EL TECLADO FUNCIONA PERFECTO PERO CON EL MOUSE NO POR EL PROBLEMA QUE YA COMENTE CON EL PIN DE RELOJ.




#include "16F628a.h"
#fuses Hs,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use Delay(Clock=20000000)
#use rs232(baud=4800, xmit=PIN_B2, rcv=PIN_B1)
#zero_ram

//-----------------------------------------------------------------------------
// Definiciones globales
//-----------------------------------------------------------------------------

int edge, bitcount;
int got_interrupt;
int interrupt_count;
int status_b3;

#bit INTF_BIT = 0x0B.1 // INTCON BIT 1 = INTF RB0/INT External pt Flag BitInterru

//--------------
// Definición de protipos
//-----------------------------------------------------------------------------

void init_kb(void);
void decode( int sc);

//-----------------------------------------------------------------------------
// Rutina de gestión de interrupciones
//-----------------------------------------------------------------------------

#int_ext
void int_ext_isr(void){

int data;


   //-------- Los bit 3 a 10 se considerran datos. Paridad, start y stop
   //-------- son ignorados
   if(bitcount < 11 && bitcount > 2){
      data = (data >> 1);
      status_b3 = input(PIN_B3);
      if((status_b3) == 1){
          data = data | 0x80;
      }
   }
   //-------- Todos los bits se han recibido
   if(--bitcount == 0){
      decode(data);
      data = 0;
      bitcount = 11;
      got_interrupt = TRUE;
   }
   got_interrupt = TRUE;
   interrupt_count++;
   disable_interrupts(INT_EXT);
}

//-----------------------------------------------------------------------------
// Main
//-----------------------------------------------------------------------------


void main(void)
{

   delay_ms(100);

   init_kb();


   //-------- Los pins indicados (B0 y B3) son configurados como entradas.
   output_float(PIN_B0);
   output_float(PIN_B3);

   //-------- Activa pullups sobre todos los pins del puerto B.
   port_b_pullups(TRUE);

   //-------- Inicializa las variables usadas por la rutina de interrupción
   //-------- antes de activar las interrupciones
   interrupt_count = 0;
   got_interrupt = FALSE;
   status_b3 = 0;

   //-------- Desde que se activó el modo PULLUPS del puerto B, el estado
   //-------- normal del pin B0 es ALTO. La gestión de la interrupción externa
   //-------- se gestiona cuando se produce un cambio de nivel ALTO a BAJO.
   ext_int_edge(H_TO_L);

   //-------- Asegurarse de que el el bit de flag de la interrupción externa
   //-------- es borrado antes de activar la gestión de dicha interrupción
   //-------- externa.
   INTF_BIT = 0;

   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   //-------- Bucle principal.
   //-------- Chequear si se produce alguna interrupción (got_interrupt). Si es así, contar, borrar
   //-------- el flag y esperar 50 ms, reactivando la gestión de las interrupciones
   while(1)

      {

      //-------- Chequear si se produce alguna interrupción (got_interrupt).
      if(got_interrupt == TRUE)

         {

            //-------- Borrar el flag global que se inicio en la rutina de servicio
            //-------- de interrupciones externas.
            got_interrupt = FALSE;

            //-------- Borrar cualquier interrupción producida durante el periodo de espera.
            INTF_BIT = 0;

            //-------- Reactivar interrupciones
            enable_interrupts(INT_EXT);

         } // --- End If ---

      } // --- End While ---

} // --- End MAIN ---


//-----------------------------------------------------------------------------
// Inicialización de teclado.
//-----------------------------------------------------------------------------
void init_kb(void)
{

   //-------- Longitud de la trama para cada pulsación
   bitcount = 11;

}

//-----------------------------------------------------------------------------
// Decodificación de movimiento del raton
//-----------------------------------------------------------------------------
void decode(int sc)
{
                         
 printf(SC);       // IMPRIMIR TRAMA ENVIADA POR EL RATON

                  }
« Última modificación: 04 de Febrero de 2009, 00:13:18 por jhoonyn46 »

Desconectado handpic

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 72
Hola,

Por el programa que tienes creo que sabes tu mas que yo de C... pero bueno.. y no conozco tu pic, pero creo que lo que tendrías que crear es un temporizador con un timer que te cree una interrupción cada cierto tiempo. En esa rutina de interrupción, cambias RB0 a salida y le das el valor 0. luego vuelves a reestablecer su condición de entrada y sales de la interrupción.

Espero que te sirva.


 

anything