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
}