TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: juansanchezruiz05 en 08 de Octubre de 2016, 06:42:13

Título: pic reloj
Publicado por: juansanchezruiz05 en 08 de Octubre de 2016, 06:42:13
Hola.
Estoy haciendo una incubadora. Y un motor debe girar cada 2h, pero no se como hacer un contador que me diga cuando a pasado una hora y que durante ese tiempo el pic16f877A este haciendo otras tareas. Con el tmr1 creo que es mala idea, porque el tiempo a medir es muy grande. He estado mirando en foros y recomiendan utilizar un reloj ds1307, pero no tengo ni idea de programarlo. ¿Hay algún periférico que cada hora genere un pulso en RB0?. Si me lo podéis explicar en código ensamblador.
Título: Re:pic reloj
Publicado por: AleSergi en 08 de Octubre de 2016, 08:08:32
hay harto info sobre esas temporizaciones largas en éste foro. Es solo cuestión de buscar. Sin ir más lejos esto se estaba tratando durante la semana...

www.todopic.com.ar/foros/index.php?topic=46845.0
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 08 de Octubre de 2016, 08:43:14
Gracias. Me ha sido de mucha ayuda.

El pic a a funcionar a 20MHz. ¿Se puede poner otro cristal solo para el tmr1? Creo que si, pero en que puertas de PIC 16f877a se conecta y se puede poner uno para que el trm1 se reinecia al minuto. Se pueden poner dos cristales
Título: Re:pic reloj
Publicado por: RedPic en 08 de Octubre de 2016, 08:59:43
¿Y no es más sencillo y fiable añadir un simple DS1307 vía I2C?
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 08 de Octubre de 2016, 12:22:14
Creo que es mas sencillo con el oscilador externo. Pero sabéis que cristal hay que poner para conseguir un minuto cada vez que se renicia el tmr1. El problema es que se apague el pic, pero es que el reloj externo como el DS1307 no se programarlo
Título: Re:pic reloj
Publicado por: AcoranTf en 08 de Octubre de 2016, 14:00:06
Creo que es mas sencillo con el oscilador externo. Pero sabéis que cristal hay que poner para conseguir un minuto cada vez que se renicia el tmr1. El problema es que se apague el pic, pero es que el reloj externo como el DS1307 no se programarlo

Ya te han dicho que hay muchisima info tanto en este foro como en elr esto de internet sobre el DS1307 y similares. Simplemente es cuestion de que leas un poco.
Y yo te propongo algo mejor aun que el 1307. Hay unos modulitos muy economicos con el DS3231 y ademas ese no necesita cristal externo.
En todo caso para programarlos, sea el que sea, leete la hoja tecnica del que elijas.

http://www.dx.com/p/ds3231-high-precision-real-time-clock-module-blue-3-3-5-5v-222910#.V_kl5pC1n7g (http://www.dx.com/p/ds3231-high-precision-real-time-clock-module-blue-3-3-5-5v-222910#.V_kl5pC1n7g)

Saludos.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 09 de Octubre de 2016, 06:56:26
Hay una cosa que no entiendo.
Los relojes RTC como el Ds1307 te dan la hora cada vez que lo solicitas, es decir, tienes que mandar una señal por RC3 Y RC4. O te generan interrupciones.

Título: Re:pic reloj
Publicado por: elreypic2 en 09 de Octubre de 2016, 17:59:51
Definitivamente creo que se puede hacer usando un cristal externo de 32.768 KHz conectandolo en los pines del timer 1. De esta manera, si el timer1 se configura con un prescalar de 8, este se desbordaria cada 16 segundos, provocando una interrupcion. Entonces solo tendrias que contar 225 interrupciones para que fuese una hora. De esta forma el microcontrolador tiene todo el tiempo para hacer otras cosas.

Saludos.

Elreypic.
Título: Re:pic reloj
Publicado por: AcoranTf en 10 de Octubre de 2016, 06:53:40
Definitivamente creo que se puede hacer usando un cristal externo de 32.768 KHz conectandolo en los pines del timer 1. De esta manera, si el timer1 se configura con un prescalar de 8, este se desbordaria cada 16 segundos, provocando una interrupcion. Entonces solo tendrias que contar 225 interrupciones para que fuese una hora. De esta forma el microcontrolador tiene todo el tiempo para hacer otras cosas.

Saludos.

Elreypic.

¿Y no es mas sencillo programar el RTC con la hora de alarma deseada y simplemente esperar que llegue la interrupcion?. Esto no requiere programacion del PIC, solo lo referente al tratamiento de la interrupcion externa y el PIC queda 100% libre para el resto de tareas.
En fin, como siempre este tema es cuestion de gustos.

Saludos.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 10 de Octubre de 2016, 07:18:28
Creo que es más sencillo de programar el tmr1 con un oscilador externo, también le da más trabajo al pic. Pero es que, un rct nunca lo he utilizado y no se si seré capaz.
Otra cosa, el rtc se puede programar para que genere 12 alarmas en diferentes horas.????
Título: Re:pic reloj
Publicado por: elreypic2 en 10 de Octubre de 2016, 10:15:19
El DS1307 no tiene alarmas. Pero el DS3231 tiene 2 alarmas.
Yo no veo la dificultad en usar el TMR1 con un oscilador externo y la interrupción. Esto a mi parecer es mucho mas sencillo que usar el protocolo I2C para configurar el RTC y luego la alarma, algo que juansanchezruiz05 no tiene experiencia. De hecho puedo ver que tampoco tiene experiencia con los microcontroladores PIC, está en la etapa de aprendizaje. Es por eso que recomiendo lo del TMR1.
En fin eso ya es decisión de juansanchezruiz05.

Saludos,

elreypic.

Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 11 de Octubre de 2016, 07:17:36
Muchas gracias. Cada vez estoy más cerca de que funciona.
 Ya escribe la pantalla el número
Adjunto una librería en ensamblador que pasa de binario a ascii y que funciona en principio


OTRA COSA QUE SIGNIFICA ESTO:             movlw   .0

Ahora tengo que solucionar el problema de que el sensor sht11 no me mide la humedad bien. El problema esta en alguna surutina

Para tranformar la humedad en un dato que se entienda hay que aplicar la seguiente formula al dato proporcionado por el sensor:

     HR=(a*Lectura del sensor+b)/256

pero no se el valor de a ni de b. Bueno en realidad no se si es esa la formula


creo que lo que esta mal es las rutinas de configuración del sht11
Título: Re:pic reloj
Publicado por: KILLERJC en 11 de Octubre de 2016, 08:45:09
Citar
OTRA COSA QUE SIGNIFICA ESTO:             movlw   .0

Poner a W = 0

Citar
Para tranformar la humedad en un dato que se entienda hay que aplicar la seguiente formula al dato proporcionado por el sensor:

     HR=(a*Lectura del sensor+b)/256

No se donde leiste eso.. Para calcular la humedad relativa va a depender de la cantidad de bits. La formula es:

HR = c1 + c2 * SOrh + c3 * SOrh²

Donde c1,c2 y c3 son valores fijos pero que cambian segun la cantidad de bits. Ejemplo para 8 bits es igual a:

C1 = -2.0468
C2 = 0.5872
C3 = -0,00040845

y SOrh es lo que lees de humedad en digital desde el sensor.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 11 de Octubre de 2016, 08:48:29
no me podrías pasar una librería en ensamblador para controlar este sensor.
Porque no soy capaz
tampoco se operar muy bien con multiplicaciones y divisiones

ademas tengo que tener algo mal en la rutinas de comunicación con el sensor sht11 por que siempre me devuelve el mismo valor

Título: Re:pic reloj
Publicado por: elreypic2 en 11 de Octubre de 2016, 14:58:21
Aqui esta un enlace con un codigo en ensamblador para el manejo de ese sensor.

http://www.microchip.com/forums/tm.aspx?m=295647

elreypic.
Título: Re:pic reloj
Publicado por: KILLERJC en 11 de Octubre de 2016, 15:01:06
no me podrías pasar una librería en ensamblador para controlar este sensor.
Porque no soy capaz
tampoco se operar muy bien con multiplicaciones y divisiones

ademas tengo que tener algo mal en la rutinas de comunicación con el sensor sht11 por que siempre me devuelve el mismo valor

Si estas usando ASM es por que queres, porque te lo pidieron, o porque te gusta. En ASM es muy raro que encontres muchas libreriasrealizadas, y lo unico que queda es empezar a estudiar tu microcontrolador, el sensor y usar la matematica a tu favor. No te queda otra.

Lo que vos pasaste , esa libreria, tal ves linealiza la funcion cuadratica en una lineal, aceptando que va a tener errores, pero que le va a facilitar la vida, ya que esta ves no tiene que andar con elementos muy pequeños como es el coeficiente C3 ni tampoco elevando al cuadrado el valor recibido. Simplemente una multiplicacion y una suma. En un lenguaje de alto nivel esto hubiera sido mucho mas sencillo. Por eso mi duda de por que usas ASM cuando no sabes ni siquiera las instrucciones mas basicas ( como lo fue el MOVLW ).

Espero que no te moleste mi apreciacion pero:
Con tu duda de esa instruccion, sumado a que no leiste el datasheet del sensor de humedad y por eso no sabias de la formula (o lo leiste por encima), creo que no estas capacitado para hacerlo en ASM, tambien deberias darte cuenta que podrias verificar las rutinas que esten haciendo las cosas de forma correcta, pero al no saber las instrucciones no podrias revisar la libreria.

Resumen: ASM no es para copiar y pegar, en realidad ningun lenguaje es asi, pero es mas pasable llegar a hacerlo en un lenguaje de alto nivel como C, donde ya existen librerias como para Arduino principalmente, aunque vas a necesitar pasarlo a tu micro.
Pienso que seguir "ayudando" en realidad no es tal, sino que cualquiera terminaria haciendo tu laburo.


Del otro post que recien lo veo:
Citar
Perdón.
Es que llevó varios días intentando que el sensor sht11 me mida la humedad y no saco nada.
Estoy un poco desesperado, porque que pasan los días y tengo que entregarlo en clase

Es hora de empezar a debuggear, es decir, revisar que correctamente estes recibiendo los valores que dice recibir. Pero no al final de la cadena (es decir luego de la operacion), sino antes, es decir ver que el valor binario que llego sea correcto.
Constrastar el valor binario con lo obtenido de un analizador logico o un osciloscopio de almacenamiento digital.Para ver que la rutina que toma los bits de entrada SEA la correcta.
Si los bits que salen del SHT11 cambian, y lo recibido por el PIC no, entonces existe una falla en la libreria o en tu configuracion. (Es decir el calculo no esta mal)
Las librerias como las que tenes dependen mucho de la velocidad del oscilador, creo que la mayoria las hace pensando en un cristal de 4Mhz.

En la libreria hay particularidades como estas:

Código: ASM
  1. bsf     TRISA,1         ;pone DATA port,0 como entrada

El comentario dice una cosa y la instruccion hace otra.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 11 de Octubre de 2016, 16:19:44
puff

para entender esto, no que saldra
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 12 de Octubre de 2016, 06:43:08
Sabéis cuales son los comandos para el sht11, el bety que hay que mandar por ejemplo para configurarlo en modo 8 bits de medida.

En que parte del código influye que utilices un pic a 20MHz o uno de 4 MHz


Otra cosa del comentario anterior. No tengo un nivel malo en programar en ensamblador, lo que pasa es que los comandos simple me equivoque por que llevo más de medio año sin tocar este tipo de programación. Además, he hecho programas de media dificultad como poner dos pic en esclavo-maestro. Pero es que este sensor se me ha atascado y no hay forma de que me funcione y no encuentro suficiente información como para programarlo yo. Por eso pedía que me pasarán una librería para un pic16f877a a 20Mhz que funcionase o que me revisaran el mio, y de esta forma luego mirarlo yo y entenderlo. Por que si tengo el código, puedo sacar lo que hay que hacer.
Título: Re:pic reloj
Publicado por: KILLERJC en 12 de Octubre de 2016, 08:49:32
Citar
Sabéis cuales son los comandos para el sht11, el bety que hay que mandar por ejemplo para configurarlo en modo 8 bits de medida.

Estan en el datasheet del sht11, ahi tenes todos los comandos
https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/Humidity_Sensors/Sensirion_Humidity_Sensors_SHT1x_Datasheet_V5.pdf
Pagina 6

Citar
En que parte del código influye que utilices un pic a 20MHz o uno de 4 MHz

No me fije en los tiempos, pero dentro del codigo vas a ver algunas rutinas que tienen varios NOPs, esto es para darle un tiempo y luego hacer otra cosa, pensalo como un delay. El problema es que si fue realizado para 4Mhz y vos le pones 20Mhz y no tocas el delay ese, el tiempo que se pasa en ese delay se reduce en 5, un ejemplo con 5 NOPs a 4Mhz son un delay de 5us, pero a 20Mhz es de 1us. Por lo cual puede llegar a ser un problema, por eso te decia que mejor probarlo en 4Mhz. Si te aseguras que con 4Mhz NO funciona, entonces pensa en la libreria, si funciona va a tener que ver con los tiempos.

Citar
y no encuentro suficiente información como para programarlo yo.

Toda la info la tenes, tenes el datasheet del SHT11 que explica como debe enviarse la señal, como leerla, que comandas enviar, que son cada bit ( ya que posee un solo registro), etc.
Tenes ya 2 librerias en la que podes comparar como el envio que dice el datasheet se refleja en el codigo (o si esta equivocado), tal ves una libreria lo haga por I2C/SPI y otro por software a la comunicacion serial.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 12 de Octubre de 2016, 11:35:09
Muchas gracias.

No hay  que mandar un comando para encender el calentador interno y otro para configurarlo en modo 8 bits, porque por defecto viene con 14 bits???? Esos comandos son los que no encuentro en los dataheet.
Título: Re:pic reloj
Publicado por: KILLERJC en 12 de Octubre de 2016, 12:30:14
El SHT11 tiene un solo registro, que es un registro que se llama STATUS. Los comandos que tenes son:

Escribir el registro STATUS: 00110

Y

Leer el registro STATUS: 00111

El formato que llegan es:

Lectura:
Se envia comando de lectura, el SHT11 responde con 8 bits que son el registro STATUS y luego 8 bits que es el checksum

Escritura:
Se envia el comando deescritura y luego se envia los 8 bits a escribir.

Los bits del registro STATUS estan definidos en la pagina 8 del datasheet que te pase.
EL bit 2 es el heater o calentador, ese por default esta apagado ( lo usarias para comparar el valor con la temperatura ambiente y con el calentador, habla de usarlo para comprobar la funcionalidad del SHT)
El bit 0 es el que define la resolucion, por default es de 12bits la humedad y 14 bits la temperatura, si lo cambias pasa a ser 8bits humedad y 12 temperatura
El bit 1 toma los valores de calibracion desde una OTP, si es que esta activo lo hace en cada lectura aumentando el tiempo de medicion de la temperatura.

Los demas bits o son de lectura nomas o no estan implementados
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 12 de Octubre de 2016, 12:38:58
Gracias. Con ese último mensaje ya entiendo como configurar el sht11

En cuanto consiga que la rutina de escribir y leer me funcionen,  lo tengo hecho. A ver si me sale. Estoy comparando varias librerías que he sacado de internet
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 12 de Octubre de 2016, 13:30:29
no lo consigo.

El programa lo estoy comprobando con proteus para 20mhz y 4mhz. ¿se puede probar con él, no? ¿El sht11 de proteus tiene el mismo comportamiento que en la realidad?

Si alguien le pudiera echar un vistazo a mi programa adjuntado para un pic a 20mhz, concretamente a las rutinas del sht11 (Subrutina de mandar comando y leer dato) porque en alguna tontería estoy metiendo la pata.

Leyendo el datasheet parece que esta bien programado, pero no funciona, no se donde esta el error o errores.

muchas gracias

Título: Re:pic reloj
Publicado por: elreypic2 en 12 de Octubre de 2016, 19:37:23
Pues para mi es muy simple el uso de la libreria, practicamente es "plug and play". Lo que no veo en tu codigo es donde realizas la conversion de la humedad a BCD (esta rutina la tienes que crear).  Una vez que tienes el valor de la humedad relativa expresada en BCD, entonces la conviertes en ASCII y es entonces que la puedes enviar a la LCD.

Yo te recomiendo que simules la libreria por partes en el MPLAB para que veas que formato te ntrega la rutina de CalcRH.

Saludos,

Elreypic.

Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 12 de Octubre de 2016, 20:06:52
La rutina que pasa de binario a Ascii,ya la tengo y me funciona bien.

El único problema que tengo es con este sensor que no se porque no me lee ninguna vez la humedad ni la temperatura. Siempre me da el mismo valor. Debo de tener algo mal en la rutina de mandar comando al sht11 o en la de leer el dato mandado por el sht11, porque si fuera otra de las subrutinas, el valor que me muestra la pantalla variaría

Si alguien me pudiera decir que estoy haciendo mal en sht11, se lo agradecería mucho. Porque ya no se que cambiar o que hacer. No se donde esta el problema..
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 13 de Octubre de 2016, 14:30:36
Por favor, echarme una mano que soy incapaz de hacer que funcione. Y lo tengo que entregar ya.
Ya se que es mucho pedir, pero es que estoy en un aprieto.

Me podrías decir si esta rutina esta bien para mandar un comando, porque proteus me está diciendo que el comando que llega al sht11 no se puede implementar o está reserbado:

;--------------------- Manda comando AL SHT11 ------------------------------
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
      nop
      nop
      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

      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?             
                goto     waitACK   ;Si,
                incf    sincbit,f       ;Incrementa numero de sincbit
                goto    cont_send   ;Vuelve a escribir


;///////////////////////////////////////////////////////////////////////////
;---------------- 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   
      nop
      nop
      nop
      nop
      nop
      
ACKrx      bcf   PORTA,2      ;SCK  falling edge
      nop
      nop
      nop
      nop
      nop         ;5uS de retardo

      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


;ack desde SHT11 detectado y llegada de datos         
adqtime      btfsc   PORTA,1      ;comprueba data
      goto   adqtime      ;NO, bucle
      return

Título: Re:pic reloj
Publicado por: elreypic2 en 13 de Octubre de 2016, 15:42:53
La rutina es correcta.
En donde encuentro un detalle es en la rutina de lectura, ya que cuando ya estas leyendo el low_byte, envias un ACK, entonces el sensor continua esperando pulsos del clock para enviarte el CRC. Lo que debes hacer es enviar un NoACK, es decir enviar un 1 en lugar de un 0. Pero solo en el low-byte, el high_byte esta correcto.

elreypic.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 13 de Octubre de 2016, 15:55:06
El error o detalle que me dices no se donde están. El código que tengo para leer el byte alto y para leer el bajo es el mismo, lo único que cambia es el registro en el que se guardo. Eso creo

Pero el problema que tengo debe estar en la rutina de mandar comando, por que proteus me dice que el código que llega al sht11 no se puede implementar o esta reservado.

¿Está bien la rutina de mandar comando? Porque a lo mejor es problema de proteus, aunque no lo creo.

Muchas gracias por su atención.
Título: Re:pic reloj
Publicado por: elreypic2 en 13 de Octubre de 2016, 18:19:04
Lo que puedo ver es que no tienes ni idea de como es que trabaja el sensor SHT11 y por ende no sabes utilizar la librería y mucho menos detectar si hay errores en esta.
En una mirada rapida encontré otro problema, que son los valores para ejecutar los comandos de lectura de temperatura y el soft reset.
En tu codigo tienes esto:

CALL   RETA980      ;ESPERAR 11MS ANTES DE MANDAR UN COMANDO
CALL   sht11_Reset   ;Resetea el sensor sht11

Viendo la subrutina sht11_Reset:

sht11_Reset   ;Resetea el sensor sht11
      movlw   b'00011101'
      call   SHT11_CMD   ;Envio: Lectura en config interna
      call   waitACK      ;espera que llegue ACK desde el sensor
      call   RETA1700   ;espera de 11mS al menos despues de esta instruccion
      return

Eso que esta en rojo está mal. La hoja de datos muestra que los codigos 0101x-1110x están reservados, y por eso proteus te dice que no puede ejecutar el codigo porque está reservado. El codigo para ejecutar un soft reset es el b'00011110'

Por lo tanto tu subrutina deberia ser:

sht11_Reset   ;Resetea el sensor sht11
      movlw   b'00011110'
      call   SHT11_CMD   ;Envio: Lectura en config interna
      call   waitACK      ;espera que llegue ACK desde el sensor
      call   RETA1700   ;espera de 11mS al menos despues de esta instruccion
      return

Y como ese comando esta mal el sensor no puede inicializarse y de ahi en adelante cualquier comando que envies no se ejecuta, por eso no puedes hacer ninguna lectura.
Ahora bien suponiendo que arrelaste ese comando, hay otro error en el comando de la lectura de temperatura.
Tu tienes esto:

;--------------------- LECTURA temperatura ------------------------------------------
sht11_Tempera            ;   LECTURA TEMPERATURA 2 bytes
      movlw   b'00000111'
      call   SHT11_CMD   ;   Envio: Lectura de Temperatura
      call   waitACK      ;   espera que llegue ACK desde el sensor
      call   adqtime      ;   espera que pase el tiempo de adquisicion
      call   read

      call   CalcRH      ;   Calcula %RH y ajusta linealidad, vuelve con el valor en RH

      return   

Ese comando (en rojo) esta mal, segun el datasheet el comando debe ser: b'00000011'
La informacion de los comandos esta en la pagina 6 de datasheet y como bien dijo KILLERJC no te has tomado la molestia de leer el datasheet.
Si no usas los datasheets (hojas de datos) de un circuito integrado, cualquiera que sea este, nunca podras implementar una rutina y siquiera evaluar, verificar o modificar una existente.

Es una lastima que hayas ignorado todos los consejos que aqui se te han dado, esperando que alguien te resulva el problema. Esto me ha tomado solamente 5 minutos y todo leyendo tu codigo y principalmente leyendo el datasheet del sensor.

Buena suerte en tu proyecto.

elreypic.

Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 13 de Octubre de 2016, 18:34:13
Los Datasheet después de que me los mencionara KILLERJC los mire, y las rutinas que encontré en Internet las fui comprobando con el datasheet.
El comando de la temperatura estaba mal porque todavía no me he metido con ella, ya que no consigo que primero me mida la humedad. Es verdad que la de reset estaba mal, ha sido un fallo al copiar el comando del datasheet.

creo que la rutina de mandar comando ya la tengo bien. Lo que creo que estaba mal es que hay que dejar SKC en alto antes de iniciar la transmisión, cuando he cambiado eso proteus ha dejado de mandar mensajes de comando reservado.

Ahora me falta la de lectura.
Adjunto el programa completo, por si tenéis un rato y me podéis ayudar a encontrar el error o errores.

Muchas gracias por haberme mirado el código.
Título: Re:pic reloj
Publicado por: KILLERJC en 13 de Octubre de 2016, 23:11:02
Mi consejo nuevamente... Empeza a debuggear o aprende a valerte con las herramientas que tenes.

Tenes un LCD, tenes un simulador!

Podes simular paso a paso para ver si lo que llega es correcto! Veamos algunos pasos que podes hacer:

1 - Asegurarte de lo que llega, es decir el contenido de los registros RXlsb y RXmsb sea lo correcto. ( Si falla es problema la subrutina de "read" o el inicio del sensor )
2 - Si es correcto lo anterior, verificar que lo que sale de la rutina CalcRH, es decir verificar que el valor de RH sea correcto segun lo que llego (Si no lo es, esta fallando CalcRH)
3 - ????
4 - Profit

Hay cosas que no me gustan de tu programa, por ejemplo al comienzo pones las conexciones SCLK y SDA como salidas y en 0, luego estas asi por 5 veces RETA980 que si no entiendo mal en tus comentarios dice 980.000us, eso es 0.98s cada uno!!!. Seguro hay un error en el comentario ( quiero imaginar ). En fin, lo tenes en 0, podrias haberlo iniciado como entrada al SDA de esa forma solo se iba a 1 por la resistencia de Pull-up.

Seguimos con los delays, Tenes como 5 de esos en el LCD nomas! 5!!!! cuando tal ves necesitas 200ms como maximo una sola ves. Pero encima luego le das otro RETA980 mas para esperar los 11ms del sensor, los cual ya paso gracias a todo lo del LCD y no necesitas ese retardo...

Como te decia, debugea paso a paso, No podes hacerlo ? entonces crea una rutina que muestre en el LCD los valores de RXmsb y RXlsb, y luego tambien RH.

La idea es ir separando el problema poco a poco hasta encontrar el culpable o punto donde esta fallando. Pensalo como que cortas a la mitad el programa, y decis "¿Hasta aca funciona?" Si es SI entonces tenes una mitad buena y la otra mala, si es NO, vas a tener que volver a dividir esa mitad mala y volver a aplicar todo el proceso.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 14 de Octubre de 2016, 06:03:11
Ir comprobando el programa por partes es lo que he ido haciendo, por eso se que me funciona todo el programa menos las rutinas del Sht11. Creo que la única rutina que no me funciona es la de leer la medida. Si empre se carga el el registro RXlsb el mismo valor.

La LCD funciona correctamente, es verdad que hay muchos retardos, pero por exceso de tiempo no deja de funcionar ira mas lento pero funciona.

Si me pudieraís decir si la rutina de leer la tengo bien o mal, porque creo que ahí esta el problema.
Título: Re:pic reloj
Publicado por: KILLERJC en 14 de Octubre de 2016, 08:33:35
Si me pudieraís decir si la rutina de leer la tengo bien o mal, porque creo que ahí esta el problema.

Y es exactamente donde te estoy pidiendo que veas en tu simulador el porque esta fallando. Ya encontraste el DONDE, ahora necesitas el POR QUE. Vas por buen camino.

Mal comando?
Mal inicio de pedido?
Malos tiempos? ( podes agregar un par de nops, si nada cambia eso no es el error)

Considero que que deberias poner DATA a 1 al comienzo del programa y no despues del LCD.

Mirando el codigo y algunas cosas que no me gustan pero:

Código: ASM
  1. cont_send       rlf     CMData,F        ;rota a la izquierda, bit alto en carry
  2.                 btfsc   CMData,7        ;comprueba si es 1 o 0
  3.                 goto    uno             ;

Pienso que es un error y lo que quisieron hacer es:

Código: ASM
  1. cont_send       rlf     CMData, F       ;rota a la izquierda, bit alto en carry
  2.                 btfsc   STATUS, C       ;comprueba si es 1 o 0
  3.                 goto    uno             ;

Sino se estaria perdiendo el bit 7 en el proceso.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 14 de Octubre de 2016, 09:08:39
Gracias. He hecho las correcciones y recomendaciones que me has dicho. Pero ahí no está el problema, ya que lo he vuelto a simular y nada siempre se carga el mismo valor en RXlsm y en el otro. Además la rutina de mandar comando estaba bien y ahora con las mejoras también, porque proteus no envia mensajes de el comando que ha llegado al sht11 está reservado o no se puede implementar.

Si me puedes hacer el favor de mirar la rutina de lee valor, te lo agradecería. Porque esa parte en el datasheet no la entendía muy bien, y en las rutinas que he mirado de internet después de leer el byte alto, vuelve sincronizar justo antes de leer el byte bajo. En el datasheet no dice nada de esto último.
Título: Re:pic reloj
Publicado por: KILLERJC en 14 de Octubre de 2016, 10:28:50
No se a que llamas sincronizar, si te referis al ACK, este es un aviso de que llego correctamente el dato. Y se debe enviar cada 8bits

Es decir:

- Envio de Comienzo de Transimision
- Envio de Comando(8 bits)
- Esperar ACK
- Espera que este completo el dato
- Recepcion de los 8 bits
- Enviar ACK
- Recepcion de los otros 8 bits
- Decidir, Si se envia el ACK significa que se quiere recibir el checksum, si no se envia (DATA = 1 y un pulso de clock, NACK) se omite el envio de checksum
- Recepcion de checksum en caso de usarlo.
- Enviar ACK (NACK) luego de recibir el checksum

Citar
Gracias. He hecho las correcciones y recomendaciones que me has dicho. Pero ahí no está el problema, ya que lo he vuelto a simular y nada siempre se carga el mismo valor en RXlsm y en el otro

Ese es mi problema, estas diciendo que esta bien, pero ahi influye eso. Nuevamente te estoy pidiendo que simules paso a paso, y veas en un osciloscopio o un analizador logico que las señales sean las correctas. No se como estas simulando. Por que solo me estas diciendo los resultados finales que es cuando tenes el resultado en RXxsb. Y no si los datos que salen del SHT11 son los correctos, ademas lo peor de todo es que estamos hablando de una simulacion.

El  SHT11 esta dando el mismo valor con distintas humedades?
Es problema del PIC que esta leyendo o esta enviando mal los pulsos de clock?

Por si no se entiende, lo que estoy diciendo es que compares la Figura 17, Pagina 7 del datasheet del SHT11 con respecto a lo que tenes vos en la simulacion, usa el valor 35.5% de valor de humedad relativa en Proteus y deberias tener aproximadamente el mismo resultado.

Te dejo nuevamente el datasheet del SHT11
https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/Humidity_Sensors/Sensirion_Humidity_Sensors_SHT1x_Datasheet_V5.pdf

Te estoy intentando hacer valor la informacion que tenes, la resolucion de problemas es asi, es acortar el mismo hasta encontrarlo, sabemos que recibe lo mismo siempre, pero POR QUE? Eso es lo que intentamos averiguar, el SHT11 envia correctamente los datos? o es culpa del PIC?, el programa parece correcto, seran los tiempos ? (probalo a 1Mhz y si sigue sin funcionar entonces no es eso).
El PIC esta enviando las cosas como debe y se me esta escapando algo del programa? Tengo un grafico para comparar, genial, puedo agarrarme de eso y revisar que ambos sean iguales!.

No te estoy dando la solucion, te estoy dando una idea para que lo soluciones y encontres por vos mismo, que es mucho mas util que darte una libreria funcional.

PD: No uso Proteus.
Título: Re:pic reloj
Publicado por: elreypic2 en 14 de Octubre de 2016, 14:26:17
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.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 14 de Octubre de 2016, 15:25:01
Muchas gracias. he hecho las correcciones que me has indicado y sigue mostrándome el mismo valor siempre por la LCD.

Solo tengo el ordenador para comprobar el código, concretamente solo proteus. Por ese motivo primero programe la LCD y el conversor de binario a Ascii, verifique que funcionaba correctamente y que mostraba los valores bien, de esta forma podía comprobar que el sht11 funcionaba o no.

Creo que lo mejor sería que me pasarais una librería para este sensor, que este comprobada de que funciona correctamente con un circuito real, si podéis y no es mucha molestia, y que luego yo la comparase con la mía hasta que diera con los errores. Después publicaría mis errores en un mensaje para que vierais que no la he copiado y pegado.
Título: Re:pic reloj
Publicado por: KILLERJC en 14 de Octubre de 2016, 16:04:38
Citar
Creo que lo mejor sería que me pasarais una librería para este sensor, que este comprobada de que funciona correctamente con un circuito real

¿ No crees que ese es tu trabajo ?

Yo te dije que tenes que hacer... con el ordenador lo podes hacer. Incluso en el MPLAB (IDE con el cual estarias programando esto) podes simularlo paso a paso y ver que las señales que salen sean correctas. Es decir tenes 2 simuladores funcionando al frente tuyo. Es hora de usarlos.

Se que es frustante que algo no funcione, pero tenes que aprender a resolver problemas con lo que tenes, y tenes MUCHO, porque muchas veces no tenes un "Proteus" que te pueda salvar como en este caso. Un ejemplo seria, como harias con un sensor que no se encuentra en la libreria de Proteus y lo que bajaste no funciona?
Título: Re:pic reloj
Publicado por: elreypic2 en 14 de Octubre de 2016, 16:31:56
Podrias colocar imagenes de los datos que obtienes despues de la lectura del sensor.
Como dice KILLERJC, tienes que simularlo paso a paso. Haz lo siguiente en tu codigo:
Realiza una lectura del sensor sin llamar la rutina que calcula el %RH y ajusta la linealidad, es decir no llames la rutina CalcRH y muestra los valores de RXlsb y de RXmsb en la LCD.
Estos son los que interesan para ver si estan bien o no.

Elreypic.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 14 de Octubre de 2016, 16:55:36
eso ya lo he hecho siempre muestra el mismo. Creo que siempre muestra 0.

si tienes una rutina que funcione pasamela y la comparo con la mía hasta que lo saque. Porque ya no se donde puede estar el fallo.
a lo mejor es el programa proteus, pero es que no tengo otro.
Título: Re:pic reloj
Publicado por: elreypic2 en 14 de Octubre de 2016, 17:06:15
juansanchezruiz05,

No tengo una rutina que funcione, ya que nunca he usado este sensor. POr eso te pido que coloques unas imagenes y ademas pon el codigo que haces para realizar la lectura de la temperatura antes de convertirla. Dices que ya lo hiciste, OK, hazla de nuevo y muestrame los resultados.

elreypic.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 14 de Octubre de 2016, 17:13:06
No se como mostrartelo. Así te valdría??
Solo estoy intentando que me lea la humedad.

Rutina para medir la humedad:

sht11_Humedad   movlw   b'00000101'
      call   SHT11_CMD   ;Envio: Lectura de humedad
      call   waitACK      ;espera que llegue ACK desde el sensor
      call   adqtime      ;espera que pase el tiempo de adquisicion
      BCF   STATUS,5
      bsf   PORTA,1
      call   read
      call   CalcRH      ;Calcula %RH y ajusta linealidad
               ;retorna variable RH COMO dato      
      return
Título: Re:pic reloj
Publicado por: elreypic2 en 14 de Octubre de 2016, 17:27:28
Esto me muestra que no entiendes lo que se te pide o que simplemente no quieres hacerlo. Y aunque dices que ya lo has hecho, esto me muestra que no lo has hecho.
Lo que me estas mostrando es el valor de la humedad ya convertida, yo no te pedi eso. Claramente te dije que despues de que realices la lectura de los datos (12bits) del valor de la humedad entregada por el sensor, los muestres en la LCD. No quiero el valor convertido, quiero el valor en digital de la humedad, es decir quiero que muestres los valores que contienen las variables RXlsb y RXmsb.

sht11_Humedad   movlw   b'00000101'
      call   SHT11_CMD   ;Envio: Lectura de humedad
      call   waitACK      ;espera que llegue ACK desde el sensor
      call   adqtime      ;espera que pase el tiempo de adquisicion
      BCF   STATUS,5
      bsf   PORTA,1
      call   read
hasta aqui has leido, aqui es donde quiero que conviertas los datos ue contienen las variables RXlsb y RXmsb a ASCII y los muestres en la LCD. Eso es lo que quiero ver.

elreypic.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 14 de Octubre de 2016, 19:34:53
Ok

Esto es, no??

El error debe estar en la rutina de leer medida, porque los comandos se mandan correctamente, sino proteus indicaría lo contrario.
Título: Re:pic reloj
Publicado por: elreypic2 en 14 de Octubre de 2016, 20:20:39
No encuentro en el codigo la parte en que haces la conversion de la lectura digital del sensor a ASCII.
No se que significa eso se muestra.

Podrias indicarme en donde lo hiciste?

elreypic.

P.S Tu codigo tal como esta tiene un error y no ensambla. Como es que estas haciendo tus pruebas?
Título: Re:pic reloj
Publicado por: elreypic2 en 14 de Octubre de 2016, 21:23:40
Las rutinas para el LCD no funcionan correctamente. Creo que debes empezar por ahi. Intente llamar la subrutina TEXTOPRINCIPAL y no funciona correctamente. Si eso no funciona, los datos que estan viendo posiblemente estan mal desplegados.
Yo creo que lo que estas haciendo es "copiar y pegar" sin analizar los codigos. Resuelve ese problema y luego ya vemos lo del sensor.

elreypic.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 15 de Octubre de 2016, 06:04:06
Si funciona perfectamente la programación de la LCD y el converso de binario a Ascii. A mi me funciona en PIc simulator y en proteus. Además le pongo 50 en binario en un registro y me lo muestra por la pantalla el 50.

Los únicos problemas que tengo es con el sht11.

Si no se te enciende la LCD al simular es porque hay que poner a 1 la puerta RA4.

Al eliminar las rutinas del conversor a/d me deja de funcionar el programa, PROTEUS indica que sea perdido la conexión con el sht11. Pero cuando anulo la rutina de leer no se pierde la conexión.
 Puede que sea el motivo de que no me funcione.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 15 de Octubre de 2016, 17:34:43
Imposible hacer que funcione.
Título: Re:pic reloj
Publicado por: elreypic2 en 17 de Octubre de 2016, 01:23:58
Imposible hacer que funcione.

Nada es imposible. Solo hay que tener paciencia, realizar las cosas adecuada y correctamente. El uso de las herramientas ayudan a resolver los problemas, asi que con la ayuda de PROTEUS, MPLAB y mucha paciencia las rutinas en ensamblador para leer el sensor SHT11, ahora estan funcionando correctamente. Simplemente tomé las que estas usando y las comencé a depurar hasta obtener el resultado deseado. Ahora te toca a ti resolver la parte en que se muestra la hukmedad en % y la temperatura en °C. Pero la lectura de los datos del sensor ya son correctos.

He usado PICBASIC para reducir el tiempo para lo de la LCD y el conversor de binario a decimal y hexadecimal, pero las rutinas de comunicación hacia el sensor están en ensamblador, probadas que funcionan correctamente.

Código: QBasic/QuickBASIC
  1. '****************************************************************
  2. '*  Name    : SHT11_ASM.BAS                                     *
  3. '*  Author  : Miguel Angel Meza Campos                          *
  4. '*  Notice  : Copyright (c) 2016                                *
  5. '*          : All Rights Reserved                               *
  6. '*  Date    : 10/16/2016                                        *
  7. '*  Version : 1.0                                               *
  8. '*  Notes   :                                                   *
  9. '*          :                                                   *
  10. '****************************************************************
  11. DEFINE  LCD_DREG    PORTB
  12. DEFINE  LCD_RSREG   PORTD
  13. DEFINE  LCD_RSBIT   6
  14. DEFINE  LCD_EREG    PORTD
  15. DEFINE  LCD_EBIT    7
  16. DEFINE  LCD_BITS    8
  17. DEFINE  LCD_LINES   2
  18. DEFINE  OSC 20
  19.  
  20. ' ------------------------------------------------------------------------------
  21. ' Descripción del programa
  22. ' ------------------------------------------------------------------------------
  23. '
  24. ' Este programa demuestra la interface hacia el SHT11 y muestra el raw data
  25. ' ------------------------------------------------------------------------------
  26. ' I/O Definiciones
  27. ' ------------------------------------------------------------------------------
  28. ShtData         VAR     PORTA.1                       ' bi-directional data
  29. Clock           VAR     PORTA.2
  30.  
  31. ASM
  32. ShtData  equ     1
  33. Clock    equ     2
  34. ENDASM
  35.  
  36. ' ------------------------------------------------------------------------------
  37. ' Constantes
  38. ' ------------------------------------------------------------------------------
  39.  
  40. ShtTemp         CON     %00000011                  ' read temperature
  41. ShtHumi         CON     %00000101                  ' read humidity
  42.  
  43. ' ------------------------------------------------------------------------------
  44. ' Variables
  45. ' ------------------------------------------------------------------------------
  46. sincbit     VAR     BYTE
  47. CMData      VAR     BYTE
  48. soRH        VAR     WORD
  49. soT         VAR     WORD
  50. RXmsb       VAR     BYTE
  51. RXlsb       VAR     BYTE
  52.  
  53. ' ------------------------------------------------------------------------------
  54. ' Inicialización
  55. ' ------------------------------------------------------------------------------
  56.  
  57. Initialize:
  58.     ADCON1=6                'Configura el puerto A y E como digital
  59.     PORTA.1=1
  60.     PORTA.2=0
  61.     TRISA = %00000000       'Configura puerto A1 como entrada y A2 como salida
  62.     CALL    SHT_Connection_Reset  'Realiza un reset de la conexión con el sensor
  63.     PAUSE   500
  64.  
  65. Main:
  66.     LCDOUT    $FE,1       'Limpia la LCD y coloca cursor en posicion 0
  67.     LCDOUT    "   SHT1x Demo"
  68.     lcdout    $fe,$c0     'Mueve el cursor al inicio de la segunda linea
  69.     LCDOUT    "----------------"
  70.     PAUSE     2000
  71.  Main2:
  72.     CMData=ShtTemp            'Prepara el valor del comando para leer la temperatura
  73.     CALL    SHT11_CMD         'Ejecuta comando de lectura de temperatura
  74.     CALL    adqtime           'Espera a que el sensor termine la lectura de la temperatura
  75.     CALL    read_datos        'Lee los datos de la temperatura del sensor  
  76.     soT.HIGHBYTE=RXmsb        'Preparao los datos leidos (byte alto)
  77.     soT.LOWBYTE=RXlsb         'Byte bajo
  78.     LCDOUT    $FE,1           'Limpia la LCD y colocal cursor en posicion 0
  79.     LCDOUT    " Raw Data Temp:"
  80.     LCDOUT    $FE,$C0         'Mueve el cursor al inicio de la segunda linea
  81.     LCDOUT    DEC soT,"dec "
  82.     LCDOUT    HEX soT,"hex"
  83.    
  84.     PAUSE     2000             'Espera 2 segundos antes de leer la humedad
  85.    
  86.     CMData=ShtHumi            'Prepara el valor del comando para leer la Humedad
  87.     CALL    SHT11_CMD         'Ejecuta comando de lectura de Humedad
  88.     CALL    adqtime           'Espera a que el sensor termine la lectura de la humedad
  89.     CALL    read_datos         'Lee los datos de la humedad del sensor
  90.     soRH.HIGHBYTE=RXmsb       'Preparo los datos leidos (Byte alto)
  91.     soRH.LOWBYTE=RXlsb        'Byte bajo
  92.     LCDOUT    $FE,1           'Limpia la LCD y colocal cursor en posicion 0
  93.     LCDOUT    "Raw Data Humedad"
  94.     LCDOUT    $FE,$C0         'Mueve el cursor al inicio de la segunda linea
  95.     LCDOUT    DEC soRH,"dec "
  96.     LCDOUT    HEX soRH,"hex"
  97.  
  98.  
  99.     PAUSE 2000                
  100.     GOTO Main2
  101.        
  102. ' ------------------------------------------------------------------------------
  103. ' Subroutines
  104. ' ------------------------------------------------------------------------------
  105.  
  106. ' connection reset: 9 clock cyles with ShtData high, then start sequence
  107. '
  108.     asm
  109. _SHT_Connection_Reset
  110.         MOVLW   .9
  111.         MOVWF   _sincbit
  112.         bsf     PORTA,ShtData      ;Esto es igual a bsf PORTA,1
  113. clock_pulse:    
  114.         bsf     PORTA,Clock       ;Esto es lo mismo que bsf PORTA,2. Genera flanco de subida en el Clock
  115.         nop
  116.         nop
  117.         bcf     PORTA,Clock       ;Esto es lo mismo que bcf PORTA,2. Genera flanco de bajada en el Clock
  118.         nop
  119.         nop
  120.         decfsz  _sincbit,f
  121.         GOTO    clock_pulse
  122. transmission_start
  123.         bsf     PORTA,Clock         ;Genera un flanco de subida en el Clock
  124.         nop
  125.         nop
  126.         bcf     PORTA,ShtData       ;Baja el nivel del pin de datos
  127.         nop
  128.         nop
  129.         bcf     PORTA,Clock         ;Genera un flanco de bajada en el Clock
  130.         nop
  131.         nop
  132.         bsf     PORTA,Clock         ;Genera  un flanco de subida en el Clock
  133.         nop
  134.         nop
  135.         bsf     PORTA,ShtData       ;Sube el nivel del pin de datos
  136.         nop
  137.         nop
  138.         bcf     PORTA,Clock         ;Genera flanco de baja en el clock
  139.         RETURN
  140.     ENDASM
  141.    
  142. ;///////////////////////////////////////////////////////////////////////////
  143. ;--------------------- Manda comando AL SHT11 ------------------------------
  144.     asm
  145. _SHT11_CMD     
  146.         movwf   _CMData         ;guarda el comando en variable
  147.             CALL   transmission_start
  148.                 bcf     STATUS,C        ;borra carry
  149.                 clrf    _sincbit
  150.                
  151. cont_send      
  152.         rlf     _CMData,F       ;rota a la izquierda, bit alto en carry
  153.                 btfsc   STATUS,C        ;comprueba si es 1 o 0
  154.                 GOTO    uno
  155.  
  156. cero   
  157.                 bcf     PORTA,1         ;DATA change
  158.                 GOTO  $+1
  159.                 GOTO  $+1      
  160.                 bsf     PORTA,2         ;SCK  rising edge  _-  
  161.                 GOTO  $+1
  162.                 GOTO  $+1      
  163.                 bcf   PORTA,2 ;SCK falling edge -_
  164.                
  165.                 GOTO    sht11_compTX    ;salta
  166.  
  167. uno            
  168.                 bsf     PORTA,1         ;DATA change
  169.                 GOTO  $+1
  170.                 GOTO  $+1
  171.                 bsf     PORTA,2         ;SCK  rising edge  _-
  172.                 GOTO  $+1
  173.                 GOTO  $+1
  174.                 bcf   PORTA,2     ;SCK falling edge -_
  175.                
  176. ;Comprobacion para 8 rotaciones, una por bit del comando.
  177. sht11_compTX    
  178.         movlw   0x07            ;comprobacion 8 bits
  179.         subwf   _sincbit,W       ;Compara
  180.         btfsc   STATUS,Z        ;Es el ultimo?            
  181.         GOTO    SHT_waitACK
  182.         incf    _sincbit,f       ;Incrementa numero de sincbit
  183.         GOTO    cont_send       ;Vuelve a escribir
  184.  
  185. ;///////////////////////////////////////////////////////////////////////////
  186. ;---------------- Espera la llegada de ACK desde el sensor -----------------
  187. SHT_waitACK            
  188.         bsf     STATUS,5        ;banco 1
  189.                 bsf     TRISA,1         ;pone DATA port,0 como entrada
  190.                 bcf     STATUS,5        ;banco 0
  191.                 GOTO  $+1
  192.                 GOTO  $+1
  193.                 GOTO  $+1
  194. ACKrx  
  195.                 bsf     PORTA,2         ;SCK  rising edge
  196.                 GOTO  $+1
  197.                 GOTO  $+1
  198.                 btfsc   PORTA,1         ;comprueba DATA
  199.                 RETLW   .1
  200.                 bcf     PORTA,2         ;SCK  falling edge
  201.                 retlw   .0
  202.     ENDASM
  203.  
  204. ;ack desde SHT11 detectado y llegada de datos
  205.     ASM                
  206. _adqtime       
  207.         btfsc   PORTA,1         ;comprueba DATA
  208.                 GOTO    _adqtime                ;NO, bucle
  209.                 RETURN
  210.     ENDASM
  211.    
  212. ;///////////////////////////////////////////////////////////////////////////
  213. ;------------- LECTURA DE DATOS DESDE EL SHT11 (Byte alto) ----------------------
  214.     ASM
  215. _read_datos            
  216.             movlw       0x08
  217.                         MOVWF   _sincbit
  218.  
  219. high_byte       rlf       _RXmsb,F
  220.                         bcf      _RXmsb,0
  221.                         bsf     PORTA,2          ;SCK rising edge      
  222.  
  223.                         btfsc   PORTA,1
  224.                         bsf      _RXmsb,0
  225.  
  226.                         bcf     PORTA,2          ;SCK falling edge
  227.  
  228.                         decfsz  _sincbit,F
  229.                         GOTO    high_byte
  230.  
  231.                
  232.                         bsf     STATUS,5                ; register page 1
  233.                         bcf     TRISA,1                 ; SHT11_DATA es salida
  234.                         bcf     STATUS,5                ; register page 0
  235.  
  236.                         bcf     PORTA,1          ;Coloca el bit de ACK
  237.                         nop
  238.                         bsf     PORTA,2          ;SCK rising edge
  239.                         GOTO  $+1
  240.             GOTO  $+1
  241.                         bcf     PORTA,2          ;SCK falling edge
  242.                         GOTO  $+1
  243.             GOTO  $+1
  244.        
  245.                         bsf     STATUS,5                ; register page 1
  246.                         bsf     TRISA,1                 ; SHT11_DATA es entrada
  247.                         bcf     STATUS,5                ; register page 0
  248.  
  249.                         movlw   0X08
  250.                         movwf   _sincbit
  251.  
  252. low_byte        rlf     _RXlsb,F
  253.                         bcf     _RXlsb,0
  254.                         bsf     PORTA,2
  255.                         btfsc   PORTA,1
  256.                         bsf     _RXlsb,0
  257.                        
  258.                         bcf     PORTA,2
  259.  
  260.                         decfsz  _sincbit,F
  261.                         GOTO    low_byte
  262.  
  263.                         bsf     STATUS,5                ; register page 1
  264.                         bCf     TRISA,1                 ; SHT11_DATA es salida
  265.                         bcf     STATUS,5                ; register page
  266.  
  267.                         bSf     PORTA,1          ;Coloca bit de NACK
  268.                         nop
  269.                         bsf     PORTA,2          ;SCK rising edge
  270.                         GOTO  $+1
  271.             GOTO  $+1
  272.                         bcf     PORTA,2          ;SCK falling edge
  273.                         GOTO  $+1
  274.             GOTO  $+1
  275.                         RETURN
  276.     ENDASM
(https://photos.google.com/photo/AF1QipPvpYHMjlbGono0sj0dljrsc4bUC_vWjoAt5ets)
Te he adjuntado el archivo de simulacion en proteus, el codigo en PBP y el archivo hex para simularlo.

Elreypic.
Título: Re:pic reloj
Publicado por: elreypic2 en 17 de Octubre de 2016, 21:13:06
Imposible hacer que funcione.

Nada es imposible. Solo hay que tener paciencia, realizar las cosas adecuada y correctamente. El uso de las herramientas ayudan a resolver los problemas, asi que con la ayuda de PROTEUS, MPLAB y mucha paciencia las rutinas en ensamblador para leer el sensor SHT11, ahora estan funcionando correctamente. Simplemente tomé las que estas usando y las comencé a depurar hasta obtener el resultado deseado. Ahora te toca a ti resolver la parte en que se muestra la hukmedad en % y la temperatura en °C. Pero la lectura de los datos del sensor ya son correctos.

He usado PICBASIC para reducir el tiempo para lo de la LCD y el conversor de binario a decimal y hexadecimal, pero las rutinas de comunicación hacia el sensor están en ensamblador, probadas que funcionan correctamente.

Código: QBasic/QuickBASIC
  1. '****************************************************************
  2. '*  Name    : SHT11_ASM.BAS                                     *
  3. '*  Author  : Miguel Angel Meza Campos                          *
  4. '*  Notice  : Copyright (c) 2016                                *
  5. '*          : All Rights Reserved                               *
  6. '*  Date    : 10/16/2016                                        *
  7. '*  Version : 1.0                                               *
  8. '*  Notes   :                                                   *
  9. '*          :                                                   *
  10. '****************************************************************
  11. DEFINE  LCD_DREG    PORTB
  12. DEFINE  LCD_RSREG   PORTD
  13. DEFINE  LCD_RSBIT   6
  14. DEFINE  LCD_EREG    PORTD
  15. DEFINE  LCD_EBIT    7
  16. DEFINE  LCD_BITS    8
  17. DEFINE  LCD_LINES   2
  18. DEFINE  OSC 20
  19.  
  20. ' ------------------------------------------------------------------------------
  21. ' Descripción del programa
  22. ' ------------------------------------------------------------------------------
  23. '
  24. ' Este programa demuestra la interface hacia el SHT11 y muestra el raw data
  25. ' ------------------------------------------------------------------------------
  26. ' I/O Definiciones
  27. ' ------------------------------------------------------------------------------
  28. ShtData         VAR     PORTA.1                       ' bi-directional data
  29. Clock           VAR     PORTA.2
  30.  
  31. ASM
  32. ShtData  equ     1
  33. Clock    equ     2
  34. ENDASM
  35.  
  36. ' ------------------------------------------------------------------------------
  37. ' Constantes
  38. ' ------------------------------------------------------------------------------
  39.  
  40. ShtTemp         CON     %00000011                  ' read temperature
  41. ShtHumi         CON     %00000101                  ' read humidity
  42.  
  43. ' ------------------------------------------------------------------------------
  44. ' Variables
  45. ' ------------------------------------------------------------------------------
  46. sincbit     VAR     BYTE
  47. CMData      VAR     BYTE
  48. soRH        VAR     WORD
  49. soT         VAR     WORD
  50. RXmsb       VAR     BYTE
  51. RXlsb       VAR     BYTE
  52.  
  53. ' ------------------------------------------------------------------------------
  54. ' Inicialización
  55. ' ------------------------------------------------------------------------------
  56.  
  57. Initialize:
  58.     ADCON1=6                'Configura el puerto A y E como digital
  59.     PORTA.1=1
  60.     PORTA.2=0
  61.     TRISA = %00000000       'Configura puerto A1 como entrada y A2 como salida
  62.     CALL    SHT_Connection_Reset  'Realiza un reset de la conexión con el sensor
  63.     PAUSE   500
  64.  
  65. Main:
  66.     LCDOUT    $FE,1       'Limpia la LCD y coloca cursor en posicion 0
  67.     LCDOUT    "   SHT1x Demo"
  68.     lcdout    $fe,$c0     'Mueve el cursor al inicio de la segunda linea
  69.     LCDOUT    "----------------"
  70.     PAUSE     2000
  71.  Main2:
  72.     CMData=ShtTemp            'Prepara el valor del comando para leer la temperatura
  73.     CALL    SHT11_CMD         'Ejecuta comando de lectura de temperatura
  74.     CALL    adqtime           'Espera a que el sensor termine la lectura de la temperatura
  75.     CALL    read_datos        'Lee los datos de la temperatura del sensor  
  76.     soT.HIGHBYTE=RXmsb        'Preparao los datos leidos (byte alto)
  77.     soT.LOWBYTE=RXlsb         'Byte bajo
  78.     LCDOUT    $FE,1           'Limpia la LCD y colocal cursor en posicion 0
  79.     LCDOUT    " Raw Data Temp:"
  80.     LCDOUT    $FE,$C0         'Mueve el cursor al inicio de la segunda linea
  81.     LCDOUT    DEC soT,"dec "
  82.     LCDOUT    HEX soT,"hex"
  83.    
  84.     PAUSE     2000             'Espera 2 segundos antes de leer la humedad
  85.    
  86.     CMData=ShtHumi            'Prepara el valor del comando para leer la Humedad
  87.     CALL    SHT11_CMD         'Ejecuta comando de lectura de Humedad
  88.     CALL    adqtime           'Espera a que el sensor termine la lectura de la humedad
  89.     CALL    read_datos         'Lee los datos de la humedad del sensor
  90.     soRH.HIGHBYTE=RXmsb       'Preparo los datos leidos (Byte alto)
  91.     soRH.LOWBYTE=RXlsb        'Byte bajo
  92.     LCDOUT    $FE,1           'Limpia la LCD y colocal cursor en posicion 0
  93.     LCDOUT    "Raw Data Humedad"
  94.     LCDOUT    $FE,$C0         'Mueve el cursor al inicio de la segunda linea
  95.     LCDOUT    DEC soRH,"dec "
  96.     LCDOUT    HEX soRH,"hex"
  97.  
  98.  
  99.     PAUSE 2000                
  100.     GOTO Main2
  101.        
  102. ' ------------------------------------------------------------------------------
  103. ' Subroutines
  104. ' ------------------------------------------------------------------------------
  105.  
  106. ' connection reset: 9 clock cyles with ShtData high, then start sequence
  107. '
  108.     asm
  109. _SHT_Connection_Reset
  110.         MOVLW   .9
  111.         MOVWF   _sincbit
  112.         bsf     PORTA,ShtData      ;Esto es igual a bsf PORTA,1
  113. clock_pulse:    
  114.         bsf     PORTA,Clock       ;Esto es lo mismo que bsf PORTA,2. Genera flanco de subida en el Clock
  115.         nop
  116.         nop
  117.         bcf     PORTA,Clock       ;Esto es lo mismo que bcf PORTA,2. Genera flanco de bajada en el Clock
  118.         nop
  119.         nop
  120.         decfsz  _sincbit,f
  121.         GOTO    clock_pulse
  122. transmission_start
  123.         bsf     PORTA,Clock         ;Genera un flanco de subida en el Clock
  124.         nop
  125.         nop
  126.         bcf     PORTA,ShtData       ;Baja el nivel del pin de datos
  127.         nop
  128.         nop
  129.         bcf     PORTA,Clock         ;Genera un flanco de bajada en el Clock
  130.         nop
  131.         nop
  132.         bsf     PORTA,Clock         ;Genera  un flanco de subida en el Clock
  133.         nop
  134.         nop
  135.         bsf     PORTA,ShtData       ;Sube el nivel del pin de datos
  136.         nop
  137.         nop
  138.         bcf     PORTA,Clock         ;Genera flanco de baja en el clock
  139.         RETURN
  140.     ENDASM
  141.    
  142. ;///////////////////////////////////////////////////////////////////////////
  143. ;--------------------- Manda comando AL SHT11 ------------------------------
  144.     asm
  145. _SHT11_CMD     
  146.         movwf   _CMData         ;guarda el comando en variable
  147.             CALL   transmission_start
  148.                 bcf     STATUS,C        ;borra carry
  149.                 clrf    _sincbit
  150.                
  151. cont_send      
  152.         rlf     _CMData,F       ;rota a la izquierda, bit alto en carry
  153.                 btfsc   STATUS,C        ;comprueba si es 1 o 0
  154.                 GOTO    uno
  155.  
  156. cero   
  157.                 bcf     PORTA,1         ;DATA change
  158.                 GOTO  $+1
  159.                 GOTO  $+1      
  160.                 bsf     PORTA,2         ;SCK  rising edge  _-  
  161.                 GOTO  $+1
  162.                 GOTO  $+1      
  163.                 bcf   PORTA,2 ;SCK falling edge -_
  164.                
  165.                 GOTO    sht11_compTX    ;salta
  166.  
  167. uno            
  168.                 bsf     PORTA,1         ;DATA change
  169.                 GOTO  $+1
  170.                 GOTO  $+1
  171.                 bsf     PORTA,2         ;SCK  rising edge  _-
  172.                 GOTO  $+1
  173.                 GOTO  $+1
  174.                 bcf   PORTA,2     ;SCK falling edge -_
  175.                
  176. ;Comprobacion para 8 rotaciones, una por bit del comando.
  177. sht11_compTX    
  178.         movlw   0x07            ;comprobacion 8 bits
  179.         subwf   _sincbit,W       ;Compara
  180.         btfsc   STATUS,Z        ;Es el ultimo?            
  181.         GOTO    SHT_waitACK
  182.         incf    _sincbit,f       ;Incrementa numero de sincbit
  183.         GOTO    cont_send       ;Vuelve a escribir
  184.  
  185. ;///////////////////////////////////////////////////////////////////////////
  186. ;---------------- Espera la llegada de ACK desde el sensor -----------------
  187. SHT_waitACK            
  188.         bsf     STATUS,5        ;banco 1
  189.                 bsf     TRISA,1         ;pone DATA port,0 como entrada
  190.                 bcf     STATUS,5        ;banco 0
  191.                 GOTO  $+1
  192.                 GOTO  $+1
  193.                 GOTO  $+1
  194. ACKrx  
  195.                 bsf     PORTA,2         ;SCK  rising edge
  196.                 GOTO  $+1
  197.                 GOTO  $+1
  198.                 btfsc   PORTA,1         ;comprueba DATA
  199.                 RETLW   .1
  200.                 bcf     PORTA,2         ;SCK  falling edge
  201.                 retlw   .0
  202.     ENDASM
  203.  
  204. ;ack desde SHT11 detectado y llegada de datos
  205.     ASM                
  206. _adqtime       
  207.         btfsc   PORTA,1         ;comprueba DATA
  208.                 GOTO    _adqtime                ;NO, bucle
  209.                 RETURN
  210.     ENDASM
  211.    
  212. ;///////////////////////////////////////////////////////////////////////////
  213. ;------------- LECTURA DE DATOS DESDE EL SHT11 (Byte alto) ----------------------
  214.     ASM
  215. _read_datos            
  216.             movlw       0x08
  217.                         MOVWF   _sincbit
  218.  
  219. high_byte       rlf       _RXmsb,F
  220.                         bcf      _RXmsb,0
  221.                         bsf     PORTA,2          ;SCK rising edge      
  222.  
  223.                         btfsc   PORTA,1
  224.                         bsf      _RXmsb,0
  225.  
  226.                         bcf     PORTA,2          ;SCK falling edge
  227.  
  228.                         decfsz  _sincbit,F
  229.                         GOTO    high_byte
  230.  
  231.                
  232.                         bsf     STATUS,5                ; register page 1
  233.                         bcf     TRISA,1                 ; SHT11_DATA es salida
  234.                         bcf     STATUS,5                ; register page 0
  235.  
  236.                         bcf     PORTA,1          ;Coloca el bit de ACK
  237.                         nop
  238.                         bsf     PORTA,2          ;SCK rising edge
  239.                         GOTO  $+1
  240.             GOTO  $+1
  241.                         bcf     PORTA,2          ;SCK falling edge
  242.                         GOTO  $+1
  243.             GOTO  $+1
  244.        
  245.                         bsf     STATUS,5                ; register page 1
  246.                         bsf     TRISA,1                 ; SHT11_DATA es entrada
  247.                         bcf     STATUS,5                ; register page 0
  248.  
  249.                         movlw   0X08
  250.                         movwf   _sincbit
  251.  
  252. low_byte        rlf     _RXlsb,F
  253.                         bcf     _RXlsb,0
  254.                         bsf     PORTA,2
  255.                         btfsc   PORTA,1
  256.                         bsf     _RXlsb,0
  257.                        
  258.                         bcf     PORTA,2
  259.  
  260.                         decfsz  _sincbit,F
  261.                         GOTO    low_byte
  262.  
  263.                         bsf     STATUS,5                ; register page 1
  264.                         bCf     TRISA,1                 ; SHT11_DATA es salida
  265.                         bcf     STATUS,5                ; register page
  266.  
  267.                         bSf     PORTA,1          ;Coloca bit de NACK
  268.                         nop
  269.                         bsf     PORTA,2          ;SCK rising edge
  270.                         GOTO  $+1
  271.             GOTO  $+1
  272.                         bcf     PORTA,2          ;SCK falling edge
  273.                         GOTO  $+1
  274.             GOTO  $+1
  275.                         RETURN
  276.     ENDASM
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=46867.0;attach=26813;image)
Te he adjuntado el archivo de simulacion en proteus, el codigo en PBP y el archivo hex para simularlo.

Elreypic.
Título: Re:pic reloj
Publicado por: juansanchezruiz05 en 18 de Octubre de 2016, 09:28:31
muchas gracias.

De verdad que yo solo no era capaz
Título: Re:pic reloj
Publicado por: elreypic2 en 20 de Octubre de 2016, 11:56:02
muchas gracias.

De verdad que yo solo no era capaz

Que tal juansanchezruiz05,
Ya no seguiste comentando tus avances. Realizaste la linealizacion de la lectura del sensor SHT11 para que mostrar el valor de la temperatura en °C y la humedad en %?

elreypic.