El contador ese que tenes, esta demas, lo podrias quitar por que no cumple ninguna funcion, ya que la misma arquitectura del PIC te lo limita a 8 bits.
Uno de los problemas que tenes es que tu condicion de clock no depende del flanco, sino del nivel, entonces eso te lleva a que si el clock esta en 1 tome muchas veces el valor del dato de entrada serial y en la practica vas a ver que si data es 1, y clock es 1, PORTB va a ser 0xFF.
Implementar el flanco seria muy contraproducente en terminos de tiempo. Lo mejor seria usar la interrupcion del RB0, ya que este detecta flanco y en tu programa preguntar por la bandera del mismo ( INTCONT, INTF ) el problema es que el puertoB es tu salida, y de acomodarlo asi luego complicarias un poco mas la salida de datos. Pero no creo que tanto.
Asi que por ahora el fix es por software:
;******************************************************************************
LIST P=16F84A
INCLUDE "p16f84a.inc"
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;*********************** Definir Etiquetas **********************************
CBLOCK 0x0C
DATO
E_ANTERIOR
ENDC
;*************************** VECTOR DE INCIO **********************************
org 0x00 ;Establecer dirección de origen del programa
GOTO CONFIGURACION
ORG 0x04
RETURN
;********************** PROGRAMA PRINCIPAL **********************************
CONFIGURACION
BANKSEL TRISB ; Cambio a donde esta TRISB = Banco 1
CLRF TRISB
movlw b'11111111'
movwf TRISA
BANKSEL PORTA ; Cambio a donde esta PORTA = Banco 0
CLRF PORTB ; Limpio registros de salida
CLRF DATO ; Limpio el
MOVF PORTA, W
MOVWF E_ANTERIOR ; Estado anterior del puertoA
;----------------------------------------------------------------------------
INICIO
btfsc PORTA,2 ; Lee PORTA bit 2 STROBE si esta en 1 pasa en 0 salta
call SALIDA
btfss PORTA,4 ; Lee PORTA bit 4 CLOCK si esta en 1 salta
GOTO EstadoEn0
BTFSS E_ANTERIOR, 4 ; Si ahora es 1 y antes era 1 se sale, es decir no hay flanco positivo
goto CARGAR ; Pero si ahora es 1 y antes era 0, no salta = flanco positivo
GOTO INICIO
EstadoEn0
BCF E_ANTERIOR, 4 ; Pongo en 0 por que estaba en 0 el clock.
GOTO INICIO
;----------------------------------------------------------------------------
CARGAR
BSF E_ANTERIOR, 4 ; Activo para saber que el clock esta ahora en 1 y poder detectar el flanco
BCF CARRY ; Carry a 0
BTFSC PORTA,3 ; Lee PORTA bit 3 DATA si esta en 0 salte el poner a 1 el carry
BSF CARRY
RLF DATO, F ; Desplaza a la Izquierda el contenido del Registro DATO
GOTO INICIO
;----------------------------------------------------------------------------
SALIDA
movf DATO, W
movwf PORTB
return
;----------------------------------------------------------------------------
end
Ahora que tenemos el programa hablemos de los tiempos.
Para que sea detectado el clock este debe tener como minimo (me refiero a los peores caso ):
Flanco positivo: 18 ciclos
Flanco negativo: 14 ciclos
Siempre 0 : 14 ciclos
Siempre 1 : 14 ciclos
Es decir tomamos 18 ciclos, es lo que tarda en leer nuevamente el clock.
Dependiendo de la frecuencia de trabajo eso va a dictarte la velocidad maxima de clock.
F_{min} = \frac{F_{osc}}{4 * Ciclos}
Con 4Mhz de oscilador : 55.5Khz clock maximo
Con 8Mhz de oscilador : 111.1Khz clock maximo
Con 10Mhz de oscilador : 138.8Khz clock maximo
Con 20Mhz de oscilador : 277.7Khz clock maximo
Mientras que con el CD4096 tendrias: 3Mhz ( y ni hablar si usamos uno de la linea 74xxx )
Cualquier frecuencia superior a eso, no se asegura el correcto funcionamiento, aunque proximo a esa frecuencia puede llegar a funcionar.
Aun asi espero que se entienda la diferencia entre uno y otro.