Que onda javier25,
Bueno el ejemplo que postee utiliza una recepcion sincronizada SIN deteccion de direccion(sin habilitar el 9° bit{RX9}), no la que tu requieres( con el 9° bit),por tanto el ejemplo que di "no requiere" que se determine la velocidad de recepcion esclavo.
En tu caso,el modo con deteccion de direccion(a 9 bits) asincrono,requiere lo siguiente:
1)Inisializar el registro SPBRGH al a velocidad apropiada, si es una alta velocidad usar el modo BRGH seteado a 1(BRGH=1) y dependiendo del cristal y del porcentaje de error.(En modelos 16f628A, pag.75 para ver este modo,sus velocidades y % de error correspondientes.)
2)Habilitar la comunicacion asincrona o sincrona seteando o limpiando el registro TXSTA.4 y habilitando el puerto con RCSTA.7=1.
3)Si las interrupciones se usan, habilitar el PIE1.5 .
4)Setear la recepcion del noveno bit RCSTA.6 y habilitar la deteccion de direccion RCSTA.3=1 .
5)Habilitar la recepcion habilitando el RCSTA.5(recepcion sencilla) o RCSTA.4(recepcion continua)
6)Cuando la recepcion se haya completado elregisto que no los informara es el el de interrupcion(PIR1.5=1, solo si se habilito la interrupcion.....)
7) se leen los 8 bits con el registro RCREG para determinar si el registro sera direccionado.en caso de algun error, se limpia el RCSTA.4. Si a sido direccionado. se limpia el registro RCSTA.3 y el PIR1.5(bandera de interrupcion) para permitir leer los bytes de datos y bytes de direcciones dentro del buffer recivido e interrumpir el MCU.
Por lo que veo en tu codigo no haces el CHEKEO correcto del flag de interrupcion:
LAZO: if rcsta.0=1 then "VEO SI RECIBI EL 9NO BIT!!! <--- aui no se que estas revizando, si este registro SOLO guarda el 9° bit RECIVIDO.
Acuerdate cual es el proceso a seguir , el transmisor(maestro) tiene que transmitir una cantidad de informacion a VARIOs esclavos, por tanto este primero tiene que enviar un byte de direccion(direccionamiento a esclavo, ..) este es identificado poniendo el 9° bit de esta informacion a 1 logico(por tanto cuando sucede la interrupcion,si es que la habilitaste, el primer byte+1 bit es recivido y y revizado para ver si es la direccion{esta a 1} o a cero si es DATA, en tal caso es ignorado) ,Solo si tienes habilitado de forma correcta el esclavo el bit 3 y el 6 del registro RCSTA(deteccion de direccion y habilitacion del 9° bit),por tanto ignorara todos los bytes de data. Pero en caso de que no sea data(bit cero de rcsta) y sea direccion(RCSTA.0=1) SURGIRA la interrupcion en el esclavo indicando que se a recivido un byte de direccion y el contenido sera transferido al buffer del modulo,.El esclavo direccionado limpiara el bit 3 del registro RCSTA y se preparara para recivir los bytes de data del Maestro!.
Todo esto viene prefectamente explicado en el DS
Esto es basicamente el formato, si aun sigues con problemas, no dudes en postearlo y con gusto te ayudamos .
Salu2 pana
Lager