Autor Tema: pic reloj  (Leído 16373 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:pic reloj
« Respuesta #15 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.

Desconectado juansanchezruiz05

  • PIC10
  • *
  • Mensajes: 30
Re:pic reloj
« Respuesta #16 en: 11 de Octubre de 2016, 16:19:44 »
puff

para entender esto, no que saldra

Desconectado juansanchezruiz05

  • PIC10
  • *
  • Mensajes: 30
Re:pic reloj
« Respuesta #17 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.
« Última modificación: 12 de Octubre de 2016, 07:28:02 por juansanchezruiz05 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:pic reloj
« Respuesta #18 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.
« Última modificación: 12 de Octubre de 2016, 08:57:01 por KILLERJC »

Desconectado juansanchezruiz05

  • PIC10
  • *
  • Mensajes: 30
Re:pic reloj
« Respuesta #19 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:pic reloj
« Respuesta #20 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

Desconectado juansanchezruiz05

  • PIC10
  • *
  • Mensajes: 30
Re:pic reloj
« Respuesta #21 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

Desconectado juansanchezruiz05

  • PIC10
  • *
  • Mensajes: 30
Re:pic reloj
« Respuesta #22 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

« Última modificación: 12 de Octubre de 2016, 16:42:41 por juansanchezruiz05 »

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:pic reloj
« Respuesta #23 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.


Desconectado juansanchezruiz05

  • PIC10
  • *
  • Mensajes: 30
Re:pic reloj
« Respuesta #24 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..
« Última modificación: 13 de Octubre de 2016, 08:22:32 por juansanchezruiz05 »

Desconectado juansanchezruiz05

  • PIC10
  • *
  • Mensajes: 30
Re:pic reloj
« Respuesta #25 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

« Última modificación: 13 de Octubre de 2016, 15:47:46 por juansanchezruiz05 »

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:pic reloj
« Respuesta #26 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.

Desconectado juansanchezruiz05

  • PIC10
  • *
  • Mensajes: 30
Re:pic reloj
« Respuesta #27 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.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:pic reloj
« Respuesta #28 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.


Desconectado juansanchezruiz05

  • PIC10
  • *
  • Mensajes: 30
Re:pic reloj
« Respuesta #29 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.
« Última modificación: 13 de Octubre de 2016, 19:46:40 por juansanchezruiz05 »


 

anything