Libreria para la lectura de un sensor optico ADSN2620

Buenos dias a todos, estoy intentando comunicar un PIC 16F88 con un sensor de un raton optico, concretamente con un ADSN2620, aunque por lo que he visto es muy similar para todos los sensores de este tipo por comunicacion serie, en principio la comunicacion no parece demasiado compleja, esta se establece a traves de dos lineas, una señal de reloj y otra de datos. Pero una vez picado el codigo para el driver este no funciona correctamente, ni en la simulacion de Proteus ni en la realidad cargando el codigo en el micro y observando las lineas con el osciloscopio (el que poseo es muy basico, pero suficiente). La cuestion es que la linea de reloj funciona apropiadamente, tanto en los periodos de oscilacion como en las pausas para esperar la respuesta. Pero la linea de datos ya es otra cosa, ni se parece a lo que tendria que ser, basicamente hace lo que quiere y por mas vueltas que le doy no lo entiendo, ya no es que no reciba los datos correctos, es que ni si quiera envia bien la direccion del registro que deseo obtener, la verdad es que da lo mismo si pongo el bit de la patilla de datos como entrada o como salida o incluso si no la defino, el resultado es el mismo, incluso me da lo mismo a la direccion del registro que ponga por que siempre obtengo la misma salida, que ni se parece a lo que tendria que ser. Aqui pongo el codigo usado haber si alguien me puede indicar que estoy haciendo mal.
Este es el programa que lee continuamente el registro del incremeto de X, mas simple no puede ser.
Código:
#include "C:\Documents and Settings\Jorge\Mis documentos\16f88+A2620\raton2.h"
#include "C:\Documents and Settings\Jorge\Mis documentos\16f88+A2620\adns2620.c"
#use FAST_IO(B)
int8 d_X;
void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(OSC_8MHZ|OSC_TIMER1);

while(true)
{
d_X=mouse(0x42);
}}
y este el driver programado, que como no funciona en la lectura no he seguido programando ya que no tiene sentido continuar picando codigo si no soy capaz de enviar la informacion correcta para acceder al registro deseado.
Código:
#define mouse_sck  PIN_B0   
#define mouse_sdio PIN_B1
int8 mouse(int8 m_addr)
{
int8 s, a;
int8 mm_addr=0, mm_data=0;
set_tris_B(0b00000000);
output_high(mouse_sck);
mm_addr=(m_addr);     
for (s=8;s!=0;s--)
    {a=bit_test(mm_addr,s);
     output_low(mouse_sck);
     delay_us(1); 
     if(a==1)
        output_high(mouse_sdio);
     else 
        output_low(mouse_sdio);
     delay_us(2);
     output_high(mouse_sck); 
     delay_us(3);}
set_tris_B(0b00000010); 
delay_us(100); 
output_float(mouse_sdio);
delay_us(50);
for (s=8;s!=0;s--)
    {output_low(mouse_sck);
     delay_us(1);   
     if(input(mouse_sdio)==1) bit_set(mm_data,s);  
     else bit_clear(mm_data,s);
     delay_us(2);
output_high(mouse_sck);
delay_us(3);}

return mm_data;
}
Un saludo y gracias por el interes mostrado de antemano.
 
Bueno, despues de darle vueltas al tema he llegado a la conclusion que he de trabajar con el modulo MSSP con el protocolo I2C, que incorporan algunos PIC, pero no se ajusta completamente a los requerimientos de la comunicacion serie entre el modulo y el micro. Una vez configurado el modulo para que funcione como Master y no envie Ack, la señal de datos es correcta, envia los 8 bits, perfectamente sincronizada con la señal de reloj y permanece a la espera de la respuesta del sensor optico, pero la señal de sincronizacion en vez de cambiar de estado 8 veces con cada bit enviado de la direccion del registro que quiero leer, hace 9 cambios de estado, los 8 del registro de la direccion mas el del Ack, aunque este no se produzca. Ademas entre el envio del byte del registro a leer y la respuesta han de pasar un minimo de 100us, manteniendo la señal de reloj en nivel alto y hay es donde tengo el problema ya que el reloj se me va a nivel bajo y pasado el tiempo de espera entre la escritura y la lectura vuelve a oscilar para sincronizar la comunicacion, ademas cuando recibe los 8 bits del registro leido vuelve ha generar la señal para el Ack, lo cual confunde al sensor optico, este lo interpreta como la señal del MSB del siguiente registro a leer, por que al no haber Ack de respuesta la linea de datos del pic esta en nivel bajo que es como se le indica al sensor optico que la direccion del registro al que se esta haciendo referencia es de lectura y no de escritura. ¿Como he de configurar el modulo para que solo me genere las señales de reloj de los registros, no las de Ack y se mantenga en un nivel alto entre la escritura y la lectura?
 
Atrás
Arriba