TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jhoonyn46 en 02 de Febrero de 2009, 15:31:32
-
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
}
-
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.