Me equivoque al decir "como la gente" por que veo que lo tomaste como personal , es una expresion Argentina para diferenciar entre algo bueno o no. Y me referia al compilador y no vos como persona.
Si tu compilador lo unico que hace es complicarte la vida, por que eso es realmente escribir 0x05 (es decir recordar al leer el codigo cual era el hexadecimal de cada registro ) y no PORTA, por no poder incluir un .inc quieras admitirlo o no es algo que afecta al entendimiento facil del codigo, tanto para vos como para las demas personas que lo leen.
El unico compilador que existe para ASM es el MPASM que viene ya de por si con el IDE de MPLAB X, incluso si no te gusta ese IDE (algunos dicen que es pesado) podes ir por el MPLAB v8.xx que aun asi no deberias hacerlo, Y si no queres IDE ( en el cual podes simular paso a paso ) podes usar el compilador/linker por linea de comandos pero no lo recomendaria. Esta es la herramienta que provee el fabricante.
No hago las cosas por hacer como tu crees,quizas no sepa interpretar las secuencias
El tema es que no estas mostrando ningun progreso, ni tomando la ayuda prestada y presentando codigos que hacen lo opuesto o poco, yo no se el nivel de conocimiento que tengas pero me baso en lo que intentas hacer, es decir una persona que recien inicia en el mundo de la programacion, no se va a ir a meter en un proyecto que requiere tal ves demasiado conocimiento, se va a ir incorporando poco a poco. Haciendo de cosas simples a mas complejas
Y te explico el por que pense que estabas tirando codigos por tirar:
En tu primer codigo simplmente no sabias que hacen las instrucciones, Como por ejemplo imagine que solo poniendo BTFSS PORTA,0 ibas a tener todo guardado en W. Y ni siquiera tiene relacion una cosa u otra.
Tambien denota que no sabes que lo unico que podes leer de una entrada digital es un 1 o 0 en ese momento. Lo cual un ejemplo de una llave (pulsador ) + un led te hubiera dado el indicio de que podes hacer y que no.
Y me arriesgo a creer que pensabas que el microcontrolador iba a esperar que llegara un valor, pero el microcontrolador sigue su camino y no para por nadie en sus instrucciones.
No se como es que sabias que llegaron 43 bits con el codigo que pasaste, por que jamas de los jamas para, y no se como es que estarias viendo todo el valor del PORTD cada 20us o algo asi.
Observo eso y veo que simplemente le estas errando en eso que es basico. Perfecto, nadie nacio sabiendo y lo entiendo, aca se ayuda a todas las personas, pero como todos dicen, antes de aprender a correr hay que aprender a caminar.
Luego se te dio 1 codigo el cual imagino que leiste, pero que dijiste: "Lo compile y ni pio". Pero ni siquiera sabes que es lo que fallaba ahi. Es como si lo hubieras hecho un copy/paste y probado. O al menos es lo que parecio leyendolo. Y mas al decir que ibas a seguir en "tu busqueda" lo cual imagine que es de una libreria de ponerla y que funcione. Esto en ASM lo mas seguro es que no ocurra, por que cada micro es distinto, tiene distintos registros, etc. Distinto puede ser en un lenguaje como C ( y es por eso que esta lleno de liberias en C )
Entonces se intento hacer otro acercamiento, y esta ves se dio los links al datasheet del modulo, el cual explica como va la señal por el cable, como es que el micro debe iniciar la secuencia, el por que debes esperar 1 segundo antes de leer por primera ves. Los tiempo que estan en 0 y en 1 las señales que vos tenes que capturar.
PalitroqueZ te dio un link en español ( por si no te gusta el ingles ) que tambien explica como es esa señal.
Y a pesar que te dije sobre la espera me encuentro con que tu programa no lo tiene. Pense: "bueno lo pondra despues", pero luego veo lo que te dije antes sobre NO poner a 1 el bit de salida (por que podes cortocircuitar el pin). Y es lo primero que veo en tu segundo codigo. Tal ves por que no sabia que hacian las instrucciones ?, no se por que estaba asi.
Volviendo al tema de capturar uno o cero.
Vos capturas un 1 o 0 nomas en el instante que se lee el pin (que se ejecuta la instruccion), asi que tenes que saber cuando paso de 0 a 1 o de 1 a 0, y esto lo haces leyendo la entrada esperando que cambie de nivel. No hay ninguna otra explicacion de como podes hacer lo mas que:
BTFSS xxx,0 ; Estaba en 0, espero que se ponga en 1.
GOTO $-1 ; el $-1 hace que vaya a la direccion del BTFSS es para ahorrarse una etiqueta.
Ahora como decia, esos bits viene "codificados", entonces tenes que descubrir como hacer para diferenciar entre uno y otro, lo unico que queda es medir el tiempo del estado en alto. Que es lo unico que difiere entre uno u otro.. Si es lo unico que difiere uno de otro, ¿en que hay que enforcarse? Y si.. el pulso en alto. Cuando comienza? cuando pasa de 0 a 1. Cuando termina? Cuando pasa de 1 a 0.
Se me ocurren varias formas, midiendo el tiempo o usar un delay como te dije... Lo mas rapido que le debe venir a una persona que no conoce mucho de PIC que sabe que puede leer solo 0 o 1 es medir el tiempo de alguna forma e ir pensando como va llegando la señal esa al pin del PIC. las cosas que se me ocurren son timers lo mas complejo, o ir sumando algun registro. O un delay si te das cuenta que el 0 o el 1 no tardan lo mismo ( que seria para mi lo ideal )
Suponiendo que tenes un PIC que trabaja a 4Mhz, cada instruccion tarda 1us. Entonces incluso en el peor de los casos si incremento una variable tendria 70 guardado en esa variable suficiente como para 8 bits, que indicaria el 1, si es un 0 tendria menos de 30, nuevamente trazamos 40 el limite. Como el codigo que te paso aca (solo de referencia) toma 5 ciclos para preguntar de nuevo por la entrada ( es decir pregunto cada 5 us ), entonces si es mayor a 6 significa ( conte 7, a 5us cada uno son 35us + 2 cuando detecto el paso de 0 a 1, es 37us proximo a los 40) que es un 1. Y esto repetido 40 veces.
CLRF Contador
BTFSC xxx,0 ; Espero el 1, la entrada esta en 0
GOTO $-1
PreguntoDeNuevo
BTFSS xxx,0 ; Si llego aca es por que la entrada llego a 1, asi que espero ahora el 0
GOTO LLegoelcero
INCF Contador, F
GOTO PreguntoDeNuevo
LLegoelcero
MOVLW 0x7 ; Si llego aca es por que
SUBWF Contador, W
BTFSx STATUS, C
GOTO Fue un cero
GOTO Fue un uno
; Guardo dato tambien
Si me hubieras presentado un codigo asi, en el que tal ves no sabias lo que tarda una instruccion y tenias problemas con los tiempos, yo hubiera entendido que punto de conocimiento tenes y proceder a arreglar la funcion. Y la otra con demora:
BTFSC xxx,0 ; Espero el 0
GOTO $-1
BTFSS xxx,0 ; Espero el 1
GOTO $-1
CALL delay_40ms
BTFSS xxx,0
GOTO Guardar_0
Guardar_1
; Aca guardo el 1, no superar 20/30 instrucciones
Guardar_0
; Aca guardo el 0, no superar 20/30 instrucciones
Estos codigos no toman el pulso del entrada en cuenta. Y se debe repetir.
PD: Yo no tengo nada en contra de nadie (enojado o lo que quieras llamarle) aunque lo pueda parecer, si queres seguir con el programa yo te voy a seguir ayudando y vos sos libre de preguntar todo lo que desees, de lo mas basico que se te pueda ocurrir que te voy a seguir respondiendo e intentar explicar. Pero espero compromiso tambien de la otra parte, de nada sirve ayudar si vos no tomas la ayuda en cuenta.