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.
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.
Un saludo y gracias por el interes mostrado de antemano.
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);
}}
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;
}