TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Jorge_Loa en 29 de Mayo de 2007, 18:19:16
-
Hola amigos de Todopic, de nuevo realizando trabajos con un PIC me he encontrado inconvenientes................Resulta que debo hacer una aplicacion que mida humedad relativa (entre otras cosas) y nada que puedo leer el sensor ... (escogi el sht11 porque me parecio idóneo aunque nunca lo haya usado, y pues como me daban una muestra gratis me parecio mas idóneo).
A continuacion anexo el programa con el cual estoy trabajando, a partir de uno que vi en Internet; el sensor lo he configurado para trabajar a 12 bits y resulta que siempre me muestra en la LCD: Humedad: 255% (he deshabilitado la rutina de convertir datos HEXA a el valor de HR y por ahora la LCD debe mostrarme el valor con el cual queda cargado el registro de humedad). En un principio creí que el sensor estaba molestando y lo cambie pero ambos me da lo mismo; en conclusion el problema es el siguiente:
En mi ciudad la humedad relativa es aprox 80-85%, configure el sensor a 12 bits y por lo tanto (segun el datasheet y la curva caracteristica para 12 bits que ahí se muestra) los registros del sensor deben quedar cargados con datos entre 2500 y 2700 (00001010 y 00001011 en el primer byte del sensor) y realmente esto es lo que me muestra la LCD si le pido que me muestre el primer byte(MSB); pero si le digo que me muestre el byte menos significativo (LSB) me muestra siempre 255, lo cual me dice obviamente que el registro a quedado cargado con FF; hice la prueba mostrando ambos datos por separado y variando la humedad relativa generando aire frio y caliente cerca del sensor y unicamente varia lo correspondiente al byte MSB; no se que puede estar mal aunque una revision al programa me lleva a pensar que el problema radica en el momento de generar el ACK (setACK) para empezar a leer el segundo Byte; el programa junto con las rutinas es el siguiente (omito por no ser necesarias las rutinas de la LCD) y agradezco todo tipo de ayuda.
-
He utilizado este sensor...pero lo he programado en C (CCS) y el código me funciona perfectamente. Si lo deseas t puedo facilitar.
Saludos
-
Gracias por la respuesta MICROMAN, y te agradezco mucho la ayuda; si me puedes facilitar el codigo de seguro me servira mucho aunque me toca ponerme a entender y ver como paso a Assembler porque tengo todo el programa montado en ese lenguaje.
De nuevo te agradezco.
-
hola, en la página tengo un ejemplillo de aplicación de este sensor en CCS C, pegale un ojo, quizá te sirva para desatrancarte:
http://www.hobbypic.com/index.php?option=com_content&task=view&id=16&Itemid=27
saludos!
-
Gracias JIM, de hecho ya habia leido tu ejemplo en esa pagina pero no entiendo muy bien; (Tengo bastantes prblemas con el C....jeje, tendre que superarlos algún dia y apenas termine este trabajo empezaré a estudiar ese programa)
Podrias explicarme mejor, como podria traducirse este pedazo:
byte sht11_leer_byte(byte ack)
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
byte i,val=0;
output_high(DATOS); //release DATA-line
for (i=128;i>0;i/=2) //shift bit for masking 0x80
{
output_high(CLOCK); //clk for SENSI-BUS
if (input(DATOS)) val=(val | i); //read bit
output_low(CLOCK);
}
if (ack) output_low(DATOS); //in case of "ack==1" pull down DATA-Line
else output_float(DATOS);
output_high(CLOCK); //clk #9 for ack
delay_us(5); //pulswith approx. 5 us
output_low(CLOCK);
output_high(DATOS); //release DATA-line
return val;
}
si no estoy mal, esa es la parte donde se lee los datos generados por el sensor; mi rutina en ASM es la siguiente:
setACK
bsf STATUS,RP0 ; banco 1 _-_-_-_-_-_-_-_-_-_-_-_-_-_-
bcf TRISB,0 ; pone DATA port,0 como salida
;bcf TRISB,1
bcf STATUS,RP0 ; banco 0 _-_-_-_-_-_-_-_-_-_-_-_-_-_-
bcf PORTB,1 ; SCK falling edge bcf
bcf PORTB,0 ; DATA change nivel logico 0 bcf
bsf PORTB,1 ; SCK rising edge
nop
;bsf PORTB,0 ; DATA change nivel logico 1(reposo)
bsf STATUS,RP0 ; banco 1 _-_-_-_-_-_-_-_-_-_-_-_-_-_-
bsf TRISB,0 ; pone DATA port,0 como entrada
bcf STATUS,RP0 ; banco 0 _-_-_-_-_-_-_-_-_-_-_-_-_-_-
return
Es lo mismo; dicen lo mismo?........................ No se si ahí esta el error pero creo que si; porque como anteriormente dije el sensor me genera datos del primer y segundo byte, solo que del segundo me genera siempre "FF" y este dato no cambia cuando vario las condiciones de humedad; sin embargo el primer Byte si varia; la rutina donde se debe decodificar este dato para convertirlo a humedad ya la tengo lista asi que solo me falta que el dato varie.............
Un saludo a todos...........
-
Se me olvido lo siguiente:
sht11_Humedad ;LECTURA HUMEDAD 2 bytes
call SHT11_INICIO ; Inicio de transmision
movlw b'00000101'
call SHT11_COMANDO ; Envio: Lectura de humedad
call waitACK ; espera que llegue ACK desde el sensor
call adqtime ; espera que pase el tiempo de adquisicion
call LEEmsb ; lee el byte alto
call setACK
call LEElsb ; lee el byte bajo
call setNACK
;call CalcRH ; Calcula %RH y ajusta linealidad return
y la rutina de leer el byte es:
LEEmsb
clrf RXmsb ; limpia registro
bsf RXmsb,0 ; pone un 1 que indicara en carry el final
msb bcf PORTB,1 ;
bsf PORTB,1 ;
btfss PORTB,0 ; lee data
goto ceromsb
unomsb rlf RXmsb,f ; rota a la izquierda
bsf RXmsb,0 ; pone un 1 en el bit 0
btfss STATUS,C ; salio la marca por carry?
goto msb ; continua y captura el siguiente bit
return
ceromsb rlf RXmsb,f ; rota a la izquierda
bcf RXmsb,0 ; pone un 0 en el bit 0
btfss STATUS,C ; salio la marca por carry?
goto msb ; continua y captura el siguiente bit
return
para el LSB la rytina es la misma pero cambiando msb por lsb....
-
wow la verdad es que me has pillado, llevo muuucho tiempo sin tocar el ensamblador, siento no serte de mas ayuda... Respecto a que dice el código, si no recuerdo mal efectivamente esa es la parte en la que se lee un byte del sensor. Quizá si ojeas el datasheet del sensor la cosa te quede algo mas clara que si lo ves en C. Hoy estoy algo espeso... disculpa!
-
Yo también me pedí este sample. Muchas gracias maestro J1M :mrgreen:
-
Hola de nuevo a todos; les cuento que por fin me he desenredado y he hecho funcionar el SHT11...........(Ya se que muchos de uds lo han hecho y quiza esto no signifique nada, pero es que yo llevaba tres dias tratando de hacerlo)..y en gran parte debo mucho a este foro. Gracias JIM por tu programa, que al fin de cuentas lo lei todo para hacer una "interpretacion" a ASM, y ahora si..........a seguir con este trabajo.
No sobra decir, que si alguien lo necesita...(En ASM, obvio porque la mayoria de info la encontre en C, y cada dia veo cuan importante y necesario será aprender C) pues sin duda podré ayudarlo.........que ya estoy ansioso por ayudar y no que siempre me ayuden.
saludos a todos. :-/ :-/
-
Yo tengo el sample hace tiempo empolvandose pues ahora ultimo ando sin tiempo para nada.
Si lo pudieras publicar Jorge_Loa te lo agradeceria bastante, pues deseo integrarlo a la patalla LCD de un nokia que tengo por aqui.
Saludos
-
Pues a quien le sirva lo que he hecho es lo que adjunto; falta la rutina donde se hace un ajuste de linealidad ya que el dispositivo no lo es; no la he terminado aun, pero he probado lo demas de acuerdo a datos de humedad en mi ciudad y el datasheet del sensor y son consecuentes entre si.
-
Ok, gracias. :wink:
-
He utilizado este sensor...pero lo he programado en C (CCS) y el código me funciona perfectamente. Si lo deseas t puedo facilitar.
Saludos
hola estoy trabajando el sensor sht11 pero tengo problemas al leer la humedad y la temperatura si alguen tiene un cosigo en ccs porfavor rolamelo