He encontrado algunos detalles en las rutinas.
Primero comenzare con la subrutina de SHT11_CMD. Actualmente tienes esto:
SHT11_CMD movwf CMData ;guarda el comando en variable
bsf STATUS,5 ;banco 1
bcf TRISA,2 ;puertos como salida
bcf TRISA,1
bcf STATUS,5 ;banco 0
bSf PORTA,1 ;DATA a 1 (por defecto)
bCf PORTA,2 ;CLK
nop ;espera un poco
nop
bsf PORTA,2 ;CLK
bcf PORTA,1 ;DATA (pulso bajo)
bcf PORTA,2 ;CLK
nop
bsf PORTA,2 ;CLK
bsf PORTA,1 ;DATA (por defecto alto)
bcf PORTA,2 ;CLK
nop
bsf PORTA,2 ;CLK
La instruccion en color naranja la puedes omitir si desde la configuracion del micro la defines como salida, ya que el pin de CLK siempre es salida, nunca cambia.
Las instrucciones en amarillo pueden ser cambiadas para que la linea de CLK este en alto.
La instruccion en rojo definitivamente esta mal ya que eso genera un pulso de CLK extra generando una equivodada secuencia de inicio. LEER LA HOJA DE DATOS.
Mi sugerencia para la rutina seria asi:
SHT11_CMD movwf CMData ;guarda el comando en variable
bsf STATUS,5 ;banco 1
bcf TRISA,2 ;puertos como salida. No es necesaria si se declara el puerto como salida desde la configuracion inicial del micro
bcf TRISA,1
bcf STATUS,5 ;banco 0
bSf PORTA,1 ;DATA a 1 (por defecto)
bsf PORTA,2 ;CLK
nop ;espera un poco
nop
bcf PORTA,1 ;DATA (pulso bajo)
nop ;NOP agregado
bcf PORTA,2 ;CLK
nop
bsf PORTA,2 ;CLK
bsf PORTA,1 ;DATA (por defecto alto)
nop
bcf PORTA,2 ;CLK
Veamos la siguiente parte de esta misma subrutina. Actuamente tienes:
clrf sincbit
bcf STATUS,C ;borra carry
bsf STATUS,5 ;banco 1
bcf TRISA,1 ;pone DATA port,0 como salida
bcf STATUS,5 ;banco 0
bcf STATUS,5 ;banco 0
movlw 0x00
MOVWF sincbit
cont_send rlf CMData,F ;rota a la izquierda, bit alto en carry
;envio de datos segun el protocolo del sht11
send_data btfsc CMData,7 ;comprueba si es 1 o 0
goto uno ;
cero bcf PORTA,2 ;SCK falling edge -_
bcf PORTA,1 ;DATA change
bsf PORTA,2 ;SCK rising edge _-
goto sht11_compTX ;salta
uno bcf PORTA,2 ;SCK falling edge -_
bsf PORTA,1 ;DATA change
bsf PORTA,2 ;SCK rising edge _-
;Comprobacion para 8 rotaciones, una por bit del comando.
sht11_compTX movlw 0x07 ;comprobacion 8 bits
subwf sincbit,W ;Compara
btfsc STATUS,Z ;Es el ultimo?
return ;Si,
incf sincbit,f ;Incrementa numero de sincbit
goto cont_send ;Vuelve a escribir
Las primeras lineas en naranja no son necesarias ya que el pin de DATA ya esta configurado como salida.
La siguiente linea en rojo esta demas.
Las siguientes lineas en naranja estan demas, ya que previamente has usado un clrf.
La siguiente linea en rojo esta mal, deberias preguntar por el carry con un btfsc STATUS,C (que esto ya te lo comento KILLERJC)
La siguiente linea roja esta mal, deberia ser un 8 en lugar de un 7.
Entonces con estos cambios deberia quedar así:
clrf sincbit
bcf STATUS,C ;borra carry
cont_send rlf CMData,F ;rota a la izquierda, bit alto en carry
;envio de datos segun el protocolo del sht11
send_data btfsc STATUS,C ;comprueba si es 1 o 0
goto uno ;
cero bcf PORTA,2 ;SCK falling edge -_
bcf PORTA,1 ;DATA change
bsf PORTA,2 ;SCK rising edge _-
goto sht11_compTX ;salta
uno bcf PORTA,2 ;SCK falling edge -_
bsf PORTA,1 ;DATA change
bsf PORTA,2 ;SCK rising edge _-
;Comprobacion para 8 rotaciones, una por bit del comando.
sht11_compTX movlw 0x08 ;comprobacion 8 bits
subwf sincbit,W ;Compara
btfsc STATUS,Z ;Es el ultimo?
return ;Si,
incf sincbit,f ;Incrementa numero de sincbit
goto cont_send ;Vuelve a escribir
Continuemos con la rutina de waitACK. Aquie hay un problema de ciclo, ya que si por alguna razon el sensor no enviara el ACK, entonces continuamente estas enviando pulsos de CLK hasta que llegue el ACK. Esto es incorrecto, si no llega el ACK entonces sales de la rutina y levanta una bandera o usa un valor para indicar que hubo un error.
Tu subrutina es esta:
;---------------- Espera la llegada de ACK desde el sensor -----------------
waitACK bsf STATUS,5 ;banco 1
bsf TRISA,1 ;pone DATA port,0 como entrada
bcf STATUS,5 ;banco 0
ACKrx bcf PORTA,2 ;SCK falling edge
bsf PORTA,2 ;SCK rising edge
btfsc PORTA,1 ;comprueba data
goto ACKrx ;NO, bucle
bcf PORTA,2 ;SCK falling edge estado bajo por defecto
return
Mi recomendacion es:
;---------------- Espera la llegada de ACK desde el sensor -----------------
waitACK bsf STATUS,5 ;banco 1
bsf TRISA,1 ;pone DATA port,0 como entrada
bcf STATUS,5 ;banco 0
ACKrx bcf PORTA,2 ;SCK falling edge
nop
bsf PORTA,2 ;SCK rising edge
btfsc PORTA,1 ;comprueba data
retlw .1 ;Sal de la subrutina con w=1, indicando que se genero un error
bcf PORTA,2 ;SCK falling edge estado bajo por defecto
clrw ;w=0 indicando que se recibio correctamente el ACK del sensor
return
Ahora vamos con ela rutina de recepcion de datos (read). La pondre por secciones:
read btfsc PORTA,1
goto read
Estas dos intrucciones no son necesarias, ya que antes de ejecutar la subrutina read, ejecutas la subrutina de adqtime. Pero no afectan la operacion, las puedes dejar o quitar.
Ayer te mencionaba que un detalle estaba en la recepcion del low_byte en esta rutina, ya que despues de recibir el RXlsb envias un ACK al sensor, eso le dice al sensor que proceda a enviar el checksum, pero no tienes esta parte de la rutina, asi que lo correcto es enviar un NACK, diciendo al sensor que para de eviar datos. Es decir, tu tienes esto:
low_byte rlf RXmsb,F
bcf RXmsb,0
bsf PORTA,2
btfsc PORTA,1
bsf RXlsb,0
bcf PORTA,2
decfsz sincbit,F
goto low_byte
bsf STATUS,5 ; register page 1
bcf TRISA,1 ; SHT11_DATA es salida
bcf STATUS,5 ; register page 0
bcf PORTA,1
nop
bsf PORTA,2
nop
bcf PORTA,2
bsf STATUS,5 ; register page 1
bsf TRISA,1 ; SHT11_DATA es entrada
bcf STATUS,5 ; register page 0
return
La primera instruccion en rojo esta equivocada, esta deberia ser: bsf RXmsb,0
La segunda instruccion en rojo deberia ser: bsf PORTA,1. Este es el NACK, y tu tienes un bcf y eso es un ACK. Esto solo aplica en el low_byte, el high_byte esta corrrecta, ahi si necesitas un ACK.
El codigo seria:
low_byte rlf RXmsb,F
bcf RXmsb,0
bsf PORTA,2
btfsc PORTA,1
bsf Rmlsb,0
bcf PORTA,2
decfsz sincbit,F
goto low_byte
bsf STATUS,5 ; register page 1
bcf TRISA,1 ; SHT11_DATA es salida
bcf STATUS,5 ; register page 0
bsf PORTA,1
nop
bsf PORTA,2
nop
bcf PORTA,2
bsf STATUS,5 ; register page 1
bsf TRISA,1 ; SHT11_DATA es entrada
bcf STATUS,5 ; register page 0
return
No he verificado si los cambios funcionan, pero tu los puedes simular paso a paso. Tal vez necesites agregar mas NOP para hacer que la frecuencia del CLK sea mas baja, ya que la frecuencia para el sensor esta limitada a 1MHz para voltajes de alimentacion menores a 4.5V y a 5MHz para voltajes mayores s 4.5V. Mi recomendacion es que uses una frecuencia del pin de CLK de 1MHz o menos.
Espero esto te sirva,
elreypic.