Empezé con un circuito capaz de medir la temperatura del medio ambiente. Utiliza un microcontrolador PIC 16F877, un LCD para ver el valor y como sensor, utilizo el LM35.
Al momento lo tengo montado en un protorboard funcionando. Ya subo las imágenes junto con el circuito y el programa para que lo puedan descargar y armar.
La particularidad de este circuito que utilizo con el LM35, es que mide con décimos. Algo que en muchos circuitos que hay en la red, solo lo hacen con enteros.
(http://img142.imageshack.us/img142/5858/sensorlm35au4.png) (http://img142.imageshack.us/my.php?image=sensorlm35au4.png)
El Zener D1. sirve para fijar la tensión de referencia +Vref en 2,5V O sea que el CAD del PIC, me va a entregar B'1111111111' cuando mida en el canal seleccionado 2,5V
Los amplificadores operacionales, están configurado como seguidor de tensión y se utiliza solo por la impedancia, entre el CAD del PIC y el sensor. Como se puede observar, un AO está conectado a la salida del sensor LM35 y el otro en el PIN GND del sensor.
R2, sirve para elevar la tensión de referencia hacia al sensor. Está calibrada para que entregue uns tensión de 1V, así, cuando el sensor mida 150ºC, me entregue una tensión de 2,5V y cuando mida -55ºC, el sensor me entregue 0,45V. A 0ºC, la tensión será de 1V
¿Porqué mido la tensión de referencia con el PIC si se que es de 1V? para reducir el mínimo error y el programa sea autoajustable. También, como los componentes tienen una tolerancia, el POT es de seguro que no me entrega 1V todo el tiempo, y si la temperatura es constante, la salida será constante mientras no varíe la tensión de referencia del sensor. Si la temperatura es constante, y el pot oscila entregandome pequeñas variaciones, la tensión de salida del sensor, variará con la oscilación del pot.
Está adjuntado también, el programa y el archivo .hex listo para ser cargado al pic, y probarlo. La particularidad de este programa, es que trabaja con los 10bit de resolución del CAD. Como es sabido, los dos bit menos significativos del CAD varían mucho. Son muy sensibles. Algunos eliminan estos 2 bit ajustando a la izquierda la conversión y trrabajando con solo 8 bit. Si hacía lo mismo, no podía usarlo con décimo y mi objetivo es que mida con décimo. Para solucionar el problema de la variación continua en cada sensado de los dos bit menos sognificativos, y haciendo imposible su lectura, lo que hise fue tomar 42 muestras, y promediarlas, el resultado es con muy poca variación y lenta, haciendo su lectura en el LCD muy fácil.
Para no extenderme y aburrirlos, les explico como funciona el programa para que lo sigan y lo entiendan.
1- Muestra en el LCD la frase TEMPERATURA
2- Sensa la tensión entregada por el sensor y lo guarda en la RAM.
3- Sensa la tensión entregada por el pot2 y lo guarda en la RAM.
4- Resta estos dos valores obteniendo la temperatura del sensor como si el pin GND, estuviera a 0V. No obstante, el valor obtenido, corresponde a la resolución del CAD. También me fijo si la temperatura es negativa o positiva.
5- Lo multiplico por 244 para pasar el valor a volt, que corresponde a la temperatura.
6- Lo divido por 100 para trabajar solo con 4 dígitos.
7- Si la temperatura es positiva, lo guardo en el banco 2, y si es negativa en el banco 3
8- Tomo en total 42 muestras, repitiendo los pasos del 2 hasta 7
9- Una vez tomado las 42 muestras, hago el promedio
10- Descompongo el promedio en centena, decena, unidad y décimo.
11- Lo muesto en el LCD
12- Espero 1 segundo y luego empiezo desde el punto 2.
SI bien parece complicado, el programa está bien explicado. Si tienen alguna duda, la explicaré con todo gusto.
El programa está muy desordenado y da bastante que desear, pero hace muy bien su objetivo. Dentro de poco la modificaré para hacerlo más eficiente y ordenado. De todas maneras lo pueden modificar a su gusto.
Las rutinas que llamo con la instrucción INCLUDE, están en el post Rutinas para compartir (haciendo click aquí). (http://www.ucontrol.com.ar/forosmf/index.php?topic=204.0) Un punto importante que hay que tener encuenta, es que la rutina del LCD hay que modificarlas. Solo hay que modificar las líneas de manejo del LCD. O sea, hay que cambiar el puerto a por el puerto d.
Cualquier problema me pueden consultar. SI tienen problemas para harmar el circuito y programar el PIC, con gusto los ayudaré.
Como en este foro no está permitido adjuntar datos, el programa lo pueden descargar de aquí o pedírmelo a mi (Nota: esto era en el foro de motigo)
http://www.ucontrol.com.ar/forosmf/index.php?topic=315.0 (http://www.ucontrol.com.ar/forosmf/index.php?topic=315.0)
Mi siguiente paso, será agregarle un sensor de humedad. De varios sensores que puedo conseguir, me inclino por el sensor HIH-4000 (http://www.alldatasheet.com/datasheet-pdf/pdf/227310/HONEYWELL/HIH-4000-001.html). Este sensor expresa la humedad variando su tensión de salida. Y por lo que se puede ver, tiene una gran linealidad HR/Volts.
Dado que el sensor trabaja con tensión y el PIC utilizado tiene una CAD integrado, no necesito de otros circuitos integrados o circuitería adicional para poder utilizarlo, salvo el AO para miniminar los problemas de impedancia.
La ventaja de este sensor que trabaja variando su tensión en la salida, me ahorro de circuitos convertidores a tensión. Hay sensores que trabajan variando su capacidad, los sensores de humedad capacitivos como el sensor 5X38H122R de la marca MEPCO//ELECTRA son muy confiables, pero em microprocesador no trae medidor de capacidades.
Por el momento, empezaré a modificar el programa anterior para poder sensar la humedad y una vez comprado el sensor, poder empezar a experimentar.
Recuerden que voy a facilitar el programa junto con el diseño del PCB para que ustedes también, puedan armar la estación automática.
Devido a mi distracción, me olvidé de mencionar que el esquemático anteriormente subido, solo está configurado para medir temperaturas positivas. Para que mida temperaturas negativas, hay que agregarle una resistencia a la salida del sensor y este conectado a -VS. Mi intención es que el circuito funcione con baterías y para obtener una fuente simétrica a partir de una fuente simple, utilizaré el CI ICL7660 (http://www.alldatasheet.com/datasheet-pdf/pdf/67436/INTERSIL/ICL7660.html)
También eh actualizado mi programa anterior para que muestre °C y lo he ordenado para que se pueda entender mejor. Copio y pego aquí el programa en assembler.
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;
;---------------------------------------------------------------
;VARIABLES.
;---------------------------------------------------------------
;
CBLOCK H'20'
dem1
dem2
cursor
curdisp
poeslcd
cuenta_tabla
centena ;millar por que llega hasta 1024
decena ;centena idem anterior
unidad ;decena idem anterior
decimo ;unidad idem anterior
ACCaHI ;2A
ACCaLO ;2B
ACCbHI ;2C
ACCbLO ;2D
ACCcHI ;2E
ACCcLO ;2F
multiplicador ;30
mresul3 ;31
mresul2 ;32
mresul1 ;33
resAL ;34 RESTA 1 AUXILIAR
resBA ;35 RESTA 2 AUXILIAR
;
CARRY ;36
DATO1 ;37 dato 1 (8 bits + significativos)
DATO2 ;38
DATO3 ;39
DATO4 ;3A dato 1 (8 bits - significativos)
FUNC1 ;3B dato 2 (8 bits + significativos)
FUNC2 ;3C
FUNC3 ;3D
FUNC4 ;3E dato 2 (8 bits - significativos)
RES1 ;3F resultado (8 bits + significativos)
RES2 ;40
RES3 ;41
RES4 ;42 resultado (8 bits - significativos)
TEMP1 ;43
TEMP2 ;44
TEMP3 ;45
TEMP4 ;46
PDel0 ;47
PDel1 ;48
PDel2 ;49
muestras ;4A
positivoAL ;4B
positivoBA ;4C
negativoAL ;4D
negativoBA ;4E
;4F
ENDC
;
estado EQU H'7F' ;7F
;
;*****************************************************
;ESTADO:
;
;B0: 1: HAY DATOS NEGATIVOS
; 0: NO HAY DATOS NEGATIVOS
;
;B1 1: HAY DATOS POSITIVOS
; 0: NO HAY DATOS POSITIVOS
;
;B2 1: DATOS POSITIVOS
; 0: DATOS NEGATIVOS
;
;
;
CBLOCK H'110'
positivo_AL ;110h HASTA 168h BANCO 2. PARTE ALTA DEL RESULTADO DEL PROMEDIO
positivo_BA ;PARTE BAJA DEL RESULTADO DEL PROMEDIO
ENDC
;
CBLOCK H'169' ;DIRECCIÓN A APUNTAR PARA LOS POSITIVOS
dir1
prom_pos ;CANTIDAD DE VECES A DIVIDIR PARA HACER EL PROMEDIO POSITIVOS
prom_pos_alt
ENDC
;
CBLOCK H'190'
negativo_AL ;190h HASTA 1E8h BANCO 3. PARTE ALTA DEL RESULTADO DEL PROMEDIO
negativo_BA ;PARTE BAJA DEL RESULTADO DEL PROMEDIO
ENDC
;
CBLOCK H'1E9' ;DIRECCIÓN A APUNTAR PARA LOS NEGATIVOS
dir2
prom_neg ;CANTIDAD DE VECES A DIVIDIR PARA HACER EL PROMEDIO NEGATIVO.
prom_neg_alt
ENDC
;
;
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIÓN
INTERRUP
;
;
;
;TABLAS
;
;------------------------------------
;TABLA
;------------------------------------
;
TABLA ADDWF PCL,F
NOP
RETLW 'T'
RETLW 'E'
RETLW 'M'
RETLW 'P'
RETLW 'E'
RETLW 'R'
RETLW 'A'
RETLW 'T'
RETLW 'U'
RETLW 'R'
RETLW 'A'
;
TABLA_2 ADDWF PCL,F
RETLW '0'
RETLW '1'
RETLW '2'
RETLW '3'
RETLW '4'
RETLW '5'
RETLW '6'
RETLW '7'
RETLW '8'
RETLW '9'
;
INCLUDE RutinaLCD.inc
;
INCLUDE MUL16X8BIT.INC
;
INCLUDE RESTA32BIT CHARLY.INC
;
INCLUDE SUMA_RESTA.INC
;
;
;DEMORAS
;
DELAY_5MS MOVLW .6
MOVWF dem1
DEMLOOP2 MOVLW .207
MOVWF dem2
DEMLOOP1 NOP
DECFSZ dem2,1
GOTO DEMLOOP1
DECFSZ dem1,1
GOTO DEMLOOP2
NOP
NOP
NOP
RETURN
;
;RUTINA PARA GRABAR EL SÍMBOLO °C ECHO CON EL PROGRAMA DE PALI
;
caracter0_direccion:
addwf PCL, F
dt 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47
caracter0_datos:
addwf PCL, F
dt b'11000',b'11011',b'00100',b'00100',b'00100',b'00011',b'00000',b'0'
;
;DEMORA DE 1 SEGUNDO.
;
DEMORA movlw .16 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
goto PRE_ADQ_TEMP ; 2+2 Fin.
;
M_TEMP CALL PRE_LCD
CLRF cuenta_tabla
NO_TERMINO_TABLA
PAGESELW TABLA
INCF cuenta_tabla,F
MOVFW cuenta_tabla
CALL TABLA
CALL LCD_DATO
MOVLW D'11'
SUBWF cuenta_tabla,W
BTFSS STATUS,Z
GOTO NO_TERMINO_TABLA
RETURN
;
GRADO CLRF cuenta_tabla
CICLO movf cuenta_tabla, W
Call caracter0_direccion
Call LCD_REG
movf cuenta_tabla, W
Call caracter0_datos
Call LCD_DATO
;
incf cuenta_tabla, 1
movlw 0x8
xorwf cuenta_tabla, W
btfss STATUS,Z ;Comprueba si es el último
goto CICLO ; NO ha llegado al final
;
MOVLW H'92' ;POCICIÓN A MOSTRAR EL CARACTER GUARDADO
MOVWF poeslcd
CALL PO_ES_LCD
MOVLW .0 ;MUESTRO EL CARACTER GUARDADO QUE ESTÁ EN LA POCICIÓN 0 POR ESO MUESTRO EL 0 COMO DECIMAL Y NO COMO CÓDIGO ASCII
CALL LCD_DATO
RETURN
;
ADQUISICIÓN BSF ADCON0,GO ;INICIO LA CONVERSIÓN
CAD BTFSC ADCON0,GO ;¿TERMINÓ LA CONVERSIÓN?
GOTO CAD ;NO, VUELVO A CAD
RETURN
;
VALOR_POSITIVO
MOVLW H'8C'
MOVWF poeslcd
CALL PO_ES_LCD
MOVLW ' '
CALL LCD_DATO
RETURN
;
VALOR_NEGATIVO
MOVLW H'8C'
MOVWF poeslcd
CALL PO_ES_LCD
MOVLW '-'
CALL LCD_DATO
RETURN
;
;
PRE_ADQ_TEMP
BCF STATUS,RP0
BSF STATUS,RP1 ;BANCO 2
CLRF prom_pos
BSF STATUS,RP0 ;BANCO 3
CLRF prom_neg
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
CLRF estado ;BORRAMOS EL REGISTRO ESTADO
MOVLW .84
MOVWF muestras ;CARGAMOS CON 42 A MUESTRAS (EN REALIDAD ES 84 POR QUE CADA MUESTRA OCUPA DOS POCICIONES)
;
;RUTINA PARA BORRAR LAS VARIABLES DONDE SE ALOJARÁN LAS MUESTRAS.
;
BSF STATUS,IRP ;DIRECCIONAMIENTO INDIRECTO BANCO 2,3
MOVLW H'10'
MOVWF FSR ;DIRECCIÓN A APUNTAR
REP_POS CLRF INDF ;BORRO LA POCICIÓN APUNTADA
INCF FSR,F
DECFSZ muestras,F ;¿ES CERO?
GOTO REP_POS ;NO
MOVLW .84 ;SI, BORRAMOS LAS NEGATIVAS
MOVWF muestras
MOVLW H'90'
MOVWF FSR
REP_NEG CLRF INDF
INCF FSR,F
DECFSZ muestras,F ;¿ES CERO?
GOTO REP_NEG ;NO
MOVLW H'69' ;SI, DEJO INICIALIZADA LAS DIRECCIONES
MOVWF FSR ;A APUNTAR PARA GUARDAR LAS MUESTRAS
MOVLW H'10'
MOVWF INDF
MOVLW H'E9'
MOVWF FSR
MOVLW H'90'
MOVWF INDF
;
DATO_MUESTRAS
MOVLW .42
MOVWF muestras
GOTO ADQ_TEMP
TOTAL_MUESTRAS
DECFSZ muestras,F
GOTO ADQ_TEMP
MOVLW H'69' ;DEJO INICIALIZADA LAS DIRECCIONES
MOVWF FSR ;A APUNTAR PARA GUARDAR LAS MUESTRAS
MOVLW H'10'
MOVWF INDF
MOVLW H'E9'
MOVWF FSR
MOVLW H'90'
MOVWF INDF
GOTO FIN_PROMEDIO
;
ADQ_TEMP BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO 1
MOVLW B'00001001'
MOVWF TRISA ;RA0 y RA3 COMO ENTRADA, DEMÁS SALIDAS
BCF STATUS,RP0 ;BANCO 0
MOVLW B'10000001' ;ADC ENC. CANAL AN0. FREC Fosc/32
MOVWF ADCON0 ;Y LO PASO AL ADCON0
BSF STATUS,RP0 ;BANCO 1
MOVLW B'10000001' ;+VREF RA3, ALINEACIÓN A LA DERECHA Y PORTA TODAS ANALÓGICAS.
MOVWF ADCON1 ;Y LO PASO AL ADCON1
BCF STATUS,RP0 ;BANCO 0
BCF PIR1,ADIF ;INDICO QUE LA CONVERSIÓN NO ESTÁ ECHA
NOP
NOP
NOP
NOP
CALL ADQUISICIÓN ;COMIENZO LA CONVERSIÓN
;-----------------------------------------------------------
;PASAMOS LA CONVERSIÓN A LA MEMORIA RAM
;-----------------------------------------------------------
MOVFW ADRESH
MOVWF ACCbHI
MOVWF TEMP1 ;SALVO EN TEMP1 POR SI LA RESTA ES NEGATIVO
BSF STATUS,RP0
MOVFW ADRESL
BCF STATUS,RP0
MOVWF ACCbLO
MOVWF TEMP2 ;SALVO EN TEMP2 POR SI LA RESTA ES NEGATIVO
;
CALL DELAY_5MS ;ESPERAMOS 5MS PARA UNA NUEVA CONVERSIÓN
;
ADQ_REF BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO 1
MOVLW B'00001010'
MOVWF TRISA
MOVLW B'10000001'
MOVWF ADCON1 ;+VREF RA3, ALINEACIÓN A LA DERECHA Y PORTA TODAS ANALÓGICAS
BCF STATUS,RP0
MOVLW B'10001001'
MOVWF ADCON0 ;ADC ENC. CANAL AN1. FREC Fosc/32
BCF PIR1,ADIF ;INDICO QUE LA CONVERSIÓN NO ESTÁ ECHA
NOP
NOP
NOP
NOP ;PARA ESTABILIZAR
CALL ADQUISICIÓN
;-----------------------------------------------------------
;PASAMOS LA CONVERSIÓN A LA MEMORIA RAM
;-----------------------------------------------------------
MOVFW ADRESH
MOVWF ACCaHI
MOVWF TEMP3
BSF STATUS,RP0
MOVFW ADRESL
BCF STATUS,RP0
MOVWF ACCaLO
MOVWF TEMP4
;-----------------------------------------------------------
;RESTAMOS LOS DOS VALORES PARA QUE ME DÉ EL VALOR REAL SI EL VALOR ES NEGATIVO, LA TEMPERATURA TEMBIÉN LO ES.
;RESULTADO EN ACCb Y COMO ALTERNATIVO res
;-----------------------------------------------------------
CALL RESTA
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO TEMP_NEGATIVA ;SI, LA TEMPERATURA ES NEGATIVO
BSF estado,1 ;NO. AJUSTAMOS LOS ESTADOS CORRESPONDIENTES. HAY DATOS POSITIVOS A PROMEDIAR
BSF estado,2 ;EL DATO DE AHORA ES POSITIVO.
GOTO DESCOMPONER_NÚMERO
;
TEMP_NEGATIVA
MOVFW TEMP1 ;AL SER NEGATIVO, VUELVO HACER LA RESTA PERO INVIERTIENDO
MOVWF ACCaHI ;EL MINUENDO POR EL SUBTRAENDO, ASÍ NOS DÁ EL VALOR CORRECTO
MOVFW TEMP2 ;ES POR ELLO QUE GUARDAMOS LOS DATOS EN TEMP
MOVWF ACCaLO ;PARA PASARLO INVIRTIÉNDOLO Y YA NO ES NECESARIO CHEQUEAR EL
MOVFW TEMP3 ;BIT C, YA QUE SABEMOS QUE ES NEGATIVO.
MOVWF ACCbHI
MOVFW TEMP4
MOVWF ACCbLO
CALL RESTA
;
BSF estado,0 ;HAY DATOS NEGATIVOS A PROMEDIAR
BCF estado,2 ;EL DATO DE AHORA ES NEGATIVO
;DESCOMPONER_NÚMERO
Continuación del código.
;
;-----------------------------------------------------------------
;UNA VEZ RESTADOS LAS DOS ADIQUICICIONES, MULTIPLICAMOS EL RESULTADO POR 244 ASÍ LO PASAMOS A VOLT.
;SE OBTIENE UN RESULTADO DE 24 BIT. LUEGO, LO DIVIDIMOS POR 100 PARA QUEDARNOS CON LOS VALORES DESEADOS,
;HASTA 4 DÍGITOS QUE NOS CONSUMIRÁ DOS REGISTRO DE 8 BITS.
;
;UNA VEZ ECHO ESTO,TOMAMOS 42 MUESTRAS. Y HACEMOS EL PROMEDIO. PARA ELLO, PRIMERO SUMAMOS
;TODAS LAS TEMPERATURAS, Y LUEGO LO DIVIDIMOS POR 42. ESTO NOS DA EL PROMEDIO.
;CUANDO OBTENEMOS EL PROMEDIO, LO DESCOMPONEMOS EN CENTENA, DECENA, UNIDAD Y DÉCIMO.
;
;NOTA: QUE HACER CUANDO LA TEMPERATURA ES NEGATIVA Y POSITIVA.
;SI LA TEMPERATURA ES POSITIVA, SE ALMACENAN DESDE H'110' HASTA H'168' BANCO 2
;SI LA TEMPERATURA ES NEGATIVA, SE ALMACENAN DESDE H'190' HASTA H'1E8' BANCO 3
;
;LA FORMA DE HACER EL PROMEDIO VARÍA SI TENEMOS POSITIVOS O NEGATIVOS O LOS DOS.
;1er CASO: SOLO POSITIVOS. SUMAMOS LAS 42 MUESTRAS (DOS NÚMEROS DE 8 BITS) Y LUEGO LO DIVIDIMOS POR 42
; EL RESULTADO ES EL DATO A MOSTRAR LUEGO VOLVEMOS A EMPEZAR TOMANDO DE NUEVO LAS 42 MUESTRAS
;2dO CASO: SOLO NEGATIVOS. LO TRATAMOS COMO SI FUERAN POSITIVOS Y EN EL MOMENTO DE MOSTRAR EL DATO,
; MOSTRAMOS EL SIGNO MENOS EN EL LCD.
;3er CASO: POSITIVOS Y NEGATIVOS. PRIMERO SUMAMOS LOS POSITIVOS Y HACEMOS EL PROMEDIO. LO GUARDAMOS EN LA MEMORIA
; LUEGO SUMAMOS LOS NEGATIVOS Y HACEMOS EL PROMEDIO. LO GUARDAMOS EN LA MEMORIA. PARA OBTENER EL DATO A MOSTRAR
; RESTAMOS EL PROMEDIO POSITIVO CON EL PROMEDIO NEGATIVO. DE ESTA MANERA TENEMOS 3 OPCIONES
; 1- EL PROMEDIO POSITIVO ES MAYOR QUE EL NEGATIVO, EL DATO OBTENIDO ES POSITIVO. NOS DAMOS CUENTA CHEQUEANDO EL BIT C
; 2- EL PROMEDIO POSITIVO EN MENOR QUE EL NEGATIVO, EL DATO OBTENIDO ES NEGATIVO. NOS DAMOS CUENTA CHEQUEANDO EL BIT C
; 3- EL PROMEDIO POSITIVO ES IGUAL QUE EL NEGATIVO, EL DATO OBTENIDO ES CERO.
;
;
;MULTIPLICAMOS POR 244.
;
DESCOMPONER_NÚMERO
;
MOVFW ACCbHI
MOVWF mresul2
MOVFW ACCbLO
MOVWF mresul1
MOVLW .244
MOVWF multiplicador
CALL MULTIPLICAR ;MULTIPLICAMOS Y OBTUVIMOS UN RESULTADO DE 24 BIT EN ACCbLO,ACCcHI,ACCcLO
MOVFW mresul1
MOVWF ACCcLO
MOVFW mresul2
MOVWF ACCcHI
MOVFW mresul3
MOVWF ACCbLO
CLRF ACCbHI
;...................................
;DIVIDIMOS EN 100 PARA OBTENER EL VALOR A ALMACENAR SOLO EN 4 DÍGITOS, EL RESULTADO OBTENIDO ESTA EN ACCb
;...................................
;
MOVFW ACCcLO
MOVWF DATO4
MOVFW ACCcHI
MOVWF DATO3
MOVFW ACCbLO ;RECUPERO EL VALOR PARA PASARLO A DATO2
CLRF ACCbLO ;BORRO ESTA POCICIÓN PARA SU POSTERIOR USO.
MOVWF DATO2
MOVFW ACCbHI ;RECUPERO EL VALOR PARA PASARLO A DATO1
CLRF ACCbHI ;BORRO ESTA POCICIÓN PARA SU POSTERIOR USO.
MOVWF DATO1 ;
CLRF RES1
CLRF RES2
CLRF RES3
CLRF RES4
DATO_PARC MOVLW .100 ;DIVISOR
MOVWF FUNC4
CLRF FUNC3
CLRF FUNC2
CLRF FUNC1
CALL RESTA2
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO RES_NEG ;ES NEGATIVO
MOVFW RES4
MOVWF DATO4
MOVFW RES3
MOVWF DATO3
MOVFW RES2
MOVWF DATO2
MOVFW RES1
MOVWF DATO1
MOVLW .1 ;ES POSITIVO
ADDWF ACCbLO,F ;SUMO 1
BTFSS STATUS,C ;¿HUBO ACARREO?
GOTO DATO_PARC ;NO
ADDWF ACCbHI,F ;SUMO 1
GOTO DATO_PARC ;VUELVO A RESTAR
;
;ANALIZAMOS SI LA TEMPERATURA ES NEGATIVA O PISITIVA
;
RES_NEG BTFSS estado,2 ;¿ES POSITIVO?
GOTO DATO_NEG ;ES NAGATIVO
;
;GUARDAMOS LOS DATOS EN EL BANCO CORRESPONDIENTE
;
;PARA POSITIVOS
;
BCF STATUS,RP0 ;ES POSITIVO
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1 ;DIRECCIÓN A APUNTAR
MOVWF FSR ;APUNTAMOS
BCF STATUS,RP1 ;BANCO 0
MOVFW ACCbHI ;RECUPERO EL RESULTADO MAS SIGNIFICATIVO
BSF STATUS,RP1 ;BANCO 2
MOVWF INDF ;GUARDAMOS EL DATO EN LA POCICIÓN APUNTADA EN FSR
INCF FSR,F ;INCREMENTAMOS EL FSR PARA GUARDAR EL RESULTADOS MENOS SIGNIFICATIVO
BCF STATUS,RP1 ;BANCO 0
MOVFW ACCbLO ;RECUPERO EL RESULTADO MENOS SIGNIFICATIVO
BSF STATUS,RP1 ;BANCO 2
MOVWF INDF ;PASAMOS EL VALOR A LA POCICIÓN APUNTADA EN FSR
INCF prom_pos,F ;INCREMENTO EN 1 A PROM_POS
INCF FSR,F
MOVFW FSR ;PASAMOS EL DATO A W
MOVWF dir1 ;Y LO SALVAMOS PARA SU POSTERIOR USO
BCF STATUS,RP1 ;BANCO 0
GOTO TOTAL_MUESTRAS
;
;PARA NEGATIVOS
;
DATO_NEG BSF STATUS,RP0 ;
BSF STATUS,RP1 ;BANCO 3
MOVFW dir2
MOVWF FSR
BCF STATUS,RP0
BCF STATUS,RP1
MOVFW ACCbHI
BSF STATUS,RP0
BSF STATUS,RP1
MOVWF INDF
INCF FSR,F
BCF STATUS,RP0
BCF STATUS,RP1
MOVFW ACCbLO
BSF STATUS,RP0
BSF STATUS,RP1
MOVWF INDF
INCF prom_neg,F
INCF FSR,F
MOVFW FSR
MOVWF dir2
BCF STATUS,RP0
BCF STATUS,RP1
GOTO TOTAL_MUESTRAS
;
;REALIZAMOS EL PROMEDIO
;
FIN_PROMEDIO
BTFSS estado,1 ;¿HAY VALORES POSITIVOS?
GOTO DATOS_NEGATIVOS ;NO HAY. SOLOS NEGATIVOS.
;
;DATOS POSITIVOS, LOS SUMAMOS Y EL RESULTADO ESTÁ EN ACCb
;
BCF STATUS,RP0 ;SI HAY
BSF STATUS,RP1 ;BANCO 2
MOVFW prom_pos ;SALVAMOS LA CANTIDAD DE DATOS POSITIVOS
BCF STATUS,RP1 ;BANCO 0
MOVWF prom_pos_alt ;PARA SABER CUANTAS VECES HAY QUE SUMARLAS, PARA LUEGO DIVIDIRLAS.
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1
MOVWF FSR ;DIRECCIÓN A LEER
MOVFW INDF ;EL VALOR EN FSR SE GUARDA EN W
BCF STATUS,RP1 ;BANCO 0
MOVWF ACCbHI
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F ;DIRECCIÓN A APUNTAR SEGUNDO DATO
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF ACCbLO
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW FSR
MOVWF dir1
;
SUMAR_PROMEDIO
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1
MOVWF FSR
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF ACCaHI
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF ACCaLO
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW FSR
MOVWF dir1
BCF STATUS,RP1 ;BANCO 0
CALL D_addF
DECFSZ prom_pos_alt,F
GOTO SUMAR_PROMEDIO
;
;OBTUVIMOS LA SUMA EN ACCb, AHORA HACEMOS EL PROMEDIO DIVIDIENDO POR LA CANTIDAD DE MUESTRAS OBTENIDAS
;
CLRF positivoBA
CLRF positivoAL
PROM_POS CLRF ACCaHI
BSF STATUS,RP1 ;BANCO 2
MOVFW prom_pos
BCF STATUS,RP1 ;BANCO 0
MOVWF ACCaLO
CALL RESTA
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO PROM_NEG
MOVLW .1
ADDWF positivoBA,F
BTFSS STATUS,C ;¿HUBO EXESO?
GOTO PROM_POS
ADDWF positivoAL,F
GOTO PROM_POS ;VUELVO A DIVIDIR
;
;CHEQUEAMOS SI HAY NEGATIVOS.
;
PROM_NEG BTFSC estado,0 ;¿HAY DATOS NEGATIVOS?
GOTO DATOS_NEGATIVOS ;SI HAY
ANT_DESCOMPONER ;NO HAY
CALL VALOR_POSITIVO ;NO. CARGAMOS EL LUGAR DESDE DÓNDE EMPEZARÁ A MOSTRAR LOS DATOS EL LCD
MOVFW positivoBA
MOVWF TEMP2
MOVFW positivoAL
MOVWF TEMP1
GOTO DESCOMPONER
;
;
DATOS_NEGATIVOS
BSF STATUS,RP0
BSF STATUS,RP1 ;BANCO 3
MOVFW prom_neg
BCF STATUS,RP0 ;BANCO 0
BCF STATUS,RP1
MOVWF prom_neg_alt
BSF STATUS,RP0
BSF STATUS,RP1 ;BANCO 3
MOVFW dir2
MOVWF FSR
MOVFW INDF
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF ACCbHI
BSF STATUS,RP0
BSF STATUS,RP1
INCF FSR,F
MOVFW INDF
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF ACCbLO
BSF STATUS,RP0
BSF STATUS,RP1
INCF FSR,F
MOVFW FSR
MOVWF dir2
;
SUMAR_PROMEDIO_NEG
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
MOVFW dir2
MOVWF FSR
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
MOVWF ACCaHI
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
INCF FSR,F
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
MOVWF ACCaLO
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
INCF FSR,F
MOVFW FSR
MOVWF dir2
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
CALL D_addF
DECFSZ prom_neg_alt,F
GOTO SUMAR_PROMEDIO_NEG
;
;OBTUVIMOS LA SUMA EN ACCb, AHORA HACEMOS EL PROMEDIO DIVIDIENDO POR LA CANTIDAD DE MUESTRAS OBTENIDAS
;
CLRF negativoBA
CLRF negativoAL
PROM_POS_A CLRF ACCaHI
BSF STATUS,RP1
BSF STATUS,RP0 ;BANCO 3
MOVFW prom_neg
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
MOVWF ACCaLO
CALL RESTA
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO PROM_NEG_A
MOVLW .1
ADDWF negativoBA,F
BTFSS STATUS,C ;¿HUBO EXESO?
GOTO PROM_POS_A
ADDWF negativoAL,F
GOTO PROM_POS_A
;
;EL ÚLTIMO PASO ES CHEQUEAR QUE SI HAY POSITIVOS Y NEGATIVOS A RESTAR. EN ESTA PARTE NO SABEMOS SI HAY DE LOS DOS O UNO SOLO.
;
PROM_NEG_A BTFSC estado,1 ;¿HAY POSITIVOS?
GOTO RESTAR_AMBOS ;SI, HAY QUE RESTAR POSITIVOS - NEGATIVOS.
MOVFW negativoBA ;NO, MOSTRAMOS EL PROMEDIO NEGATIVO AL LCD
MOVWF TEMP2
MOVFW negativoAL
MOVWF TEMP1
CALL VALOR_NEGATIVO
GOTO DESCOMPONER
;
;------------------------------------------------------------------
;RESTAMOS LOS POSITIVOS CON NEGATIVOS. EL RESULTADO QUEDA EN ACCb Y HAY QUE PASARLO
;SEGÚN EL VALOR, SI ES POSITIVO O NEGATIVO (positivo O negativo). Y LUEGO MOSTRARLO AL LCD.
;------------------------------------------------------------------
;
RESTAR_AMBOS
MOVFW positivoBA
MOVWF ACCbLO
MOVFW positivoAL
MOVWF ACCbHI
MOVFW negativoBA
MOVWF ACCaLO
MOVFW negativoAL
MOVWF ACCaHI
CALL RESTA
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO PROMEDIO_NEGATIVO
CALL VALOR_POSITIVO ;CARGAMOS EL LUGAR DESDE DÓNDE EMPEZARÁ A MOSTRAR LOS DATOS EL LCD
MOVFW ACCbLO
MOVWF TEMP2
MOVFW ACCbHI
MOVWF TEMP1
GOTO DESCOMPONER
;
PROMEDIO_NEGATIVO
CALL VALOR_NEGATIVO
MOVFW ACCbLO
MOVWF TEMP2
MOVFW ACCbHI
MOVWF TEMP1
;VAMOS A DESCOMPONER
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
;
;BORRAMOS LAS VARIABLES Y PASAMOS EL RESULTADO DE LA OPERACIÓN ANTERIOR A DATO.
;Y LO PASAMOS A TEMP PARA SALVAR EL VALOR SI ES NEGATIVO.
;
DESCOMPONER BCF STATUS,IRP ;DIRECCIONAMIENTO INDIRECTO PÁGINA 0;1
CLRF centena
CLRF decena
CLRF unidad
CLRF decimo
;
MOVFW TEMP2
MOVWF ACCbLO
MOVFW TEMP1
MOVWF ACCbHI
;------------------------------------------------------------
;DIVIMOS EL PROMEDIO EN:
;1.000, LUEGO EN 100, LUEGO EN 10 Y POR ÚLTIMO EN OBTUVIMOS EL DÉCIMO.
;------------------------------------------------------------
;
;RESTAMOS 10.000
;
MOVLW H'03'
MOVWF ACCaHI
MOVLW H'E8'
MOVWF ACCaLO
CALL RESTA
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO CEN_NEG ;SI, RECUPERO EL RESULTADO
INCF centena,F ;NO, INCREMENTO Y COMO NO PUEDE SUPERAR DE 1, CONTINUO.
MOVFW ACCbHI
MOVWF TEMP1
MOVFW ACCbLO
MOVWF TEMP2
GOTO DEC
CEN_NEG MOVFW TEMP1
MOVWF ACCbHI
MOVFW TEMP2
MOVWF ACCbLO
;
;RESTAMOS 100
;
DEC CLRF ACCaHI
MOVLW .100
MOVWF ACCaLO
CALL RESTA
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO DEC_NEG ;SI, RECUPERO EL RESULTADO
INCF decena,F ;NO, INCREMENTO
MOVFW ACCbHI
MOVWF TEMP1
MOVFW ACCbLO
MOVWF TEMP2
GOTO DEC
DEC_NEG MOVFW TEMP1
MOVWF ACCbHI
MOVFW TEMP2
MOVWF ACCbLO
;
;RESTAMOS 10
;
UNI CLRF ACCaHI
MOVLW .10
MOVWF ACCaLO
CALL RESTA
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO UNI_NEG ;SI, RECUPERO EL RESULTADO
INCF unidad,F ;NO, INCREMENTO Y COMO NO PUEDE SUPERAR DE 1, CONTINUO.
MOVFW ACCbHI
MOVWF TEMP1
MOVFW ACCbLO
MOVWF TEMP2
GOTO UNI
UNI_NEG MOVFW TEMP1
MOVWF ACCbHI
MOVFW TEMP2
MOVWF ACCbLO
;
;EL RESULTADO EN ACCbLO LO PASO A DÉCIMO
;
MOVFW ACCbLO
MOVWF decimo
;
;MOSTRAMOS LOS DATOS EN EL LCD
;
PAGESELW TABLA_2
MOVFW centena
CALL TABLA_2
CALL LCD_DATO
PAGESELW TABLA_2
MOVFW decena
CALL TABLA_2
CALL LCD_DATO
PAGESELW TABLA_2
MOVFW unidad
CALL TABLA_2
CALL LCD_DATO
MOVLW ','
CALL LCD_DATO
PAGESELW TABLA_2
MOVFW decimo
CALL TABLA_2
CALL LCD_DATO
GOTO DEMORA ;DEMORA DE 1 SEGUNDO. NO ES NECESARIO EJECUTARLO. SE PUEDE ELIMINAR TRANQUILAMENTE.
;
;************************************************************************************************
;NOTA: COMO SE PUEDE OBSERVAR, SE HISO UNA RUTINA COMPLETA DE SENSADO DE UN LM35 Y MOSTRARLO AL LCD
; ASÍ, ESTA RUTINA SE PUEDE LLAMAR POR MEDIO DE CALL Y VOLVER CON EL DATO MOSTRADO EN EL LCD.
;************************************************************************************************
;
INICIO BCF STATUS,RP0
BCF STATUS,RP1
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTC
CALL M_TEMP ;MOSTRAMOS TEMPERATURA EN EL LCD
CALL GRADO ;CREAR UNA RUTINA PARA QUE MUESTRE °C
GOTO PRE_ADQ_TEMP ;EMPEZAMOS A SENSAR LA TEMPERATURA.
;
END
Hola David Met, queria comentarte que tambien estoy creando mi propia estacion meteorologica (hace mucho tiempo que trabajo en ello), y que estoy usando un sensor de temperatura de microchip, el TC1047 que te permite medir de -40 a + 125ºc sin necesidad de tension negativa, y que mido la humedad con el HIH4000.
Si te interesa podemos seguir intercambiando datos
Un saludo
Hola Ricber. Bienvenido al foro y muchas gracias por registrarte.
La verdad, me interesa mucho. Si quieres puedes postear el hardware como el software. Al momento modifiqué el software anterior, sacrificando sensibilidad por estabilidad, ya que, si bien es muy sensible, también varía mucho la lectura de la temperatura dando la idea que varía mucho la temperatura ambiente cuando no es así. Para que me entiendas, en un minuto me mostraba 24,4; 23,1; 24,4; 24,9 etc, cuando la temperatura era de 24,4°C
Yo vivo en Argentina, y traté de usar componentes fáciles de conseguir y accesibles al bolsillo y buscar que sea muy preciso. Los sensores que me dijiste, me interesan mucho por lo que cuando haga mi segunda estación meteorológica, ya usaré sensores más precisos.
Cualquier cosa que necesites saber, avisame. Como habrás visto, programo en ASM.
Saludos.
Hola, yo tambien soy de Agentina, en cuanto a las variaciones de la temperatura se puede deber a ruidos en el circuito, tal vez tengas que poner capacitores de .1 entre los pines de alimentacion del micro y del resto de los integrados, como algun filtro pasa bajos entre la salida del sensor de temp. y la entrada del A/D.
Con respecto a los circuitos los puedo poner pero tengo que dibujarlos primero.
Lo que si estoy teniendo es un problema con el sensor de presion que no mide bien, no me convence lo que estoy midiendo aunque no soy metorologo lo contarsto con las paginas del tiempo, estoy en duda si no estara fallado???????,
Lo que puedo poner son una parte de los datos que estuve midiendo en estas ultimos dias.
Un saludo, nos mantenemos en contacto
Ya he intentado colocarle un filtro pasa bajo y la medición fue peor. Sin duda alguna, es ruido ya que lo tengo montado en un portorboard y con cables largos. Ahora trabajo el A/D del pic en 8 bit y anda mejor. Haré las pruebas siguientes, montado en un PCB para ver su funcionamiento.
En cuanto a la presión, no te fies mucho en las estaciones meteorológicas (a no ser que te puedas acercar a una y hacer las comparaciones) La presión no es contante y en pocos kilómetros puede variar mucho. Si quieres comparar tus datos con los de una estación, tiene que estar en la estación meteorológica de referencia.
Si estás cerca del aeropuerto Internacional de San Fernando, podemos arreglar para encontrarnos y hacer las mediciones de tu estación y calibrarla lo mejor posible. Yo trabajo en el aeropuerto.
Si no, lo que podemos hacer, decime en dónde estás, yo trabajo el jueves a la noche, y me fijo en el ploteo y te digo aproximadamente cual es la presión a una hora determinada. Por ejemplo, podemos hacer lo siguiente, medis la presión a las 10 de la mañana y te doy la presión según tu ubicación.
¿te parece?
Hola, Perdon por no responder ayer, pero no tuve tiempo de hacerlo con tranquilidad.
Yo estoy en La Plata, ya algo habia escuchado que la presion era muy variable en pocos km.
Tu propuesta seria lo mejor pero mis tiempos no me dan para llegarme hasta San Fernando, si podriamos hacer la otra propuesta, pero antes tal vez lo pueda solucionar contrastando con esos aparatos que venden en algunas relojerias que miden la presion, temp. y humedad, la pregunta es esos aparatos son fiables??, conoces algo de eso??.
Con respecto a lo tuyo yo deje de usar los protoboard hace tiempo porque me causaban algunos problemas con los contactos y eso genera ruidos y cosas raras y si el proyecto es muy grande se complica.
El hecho de usar 8bit no te quita sensiblidad?.
Bueno seguimos en contacto.
La verdad que de La Plata a San Fernando te queda un poco trasmano, pero la buena noticia que tienes, es que en La Plata, tienes una estación meteorológica del SMN. Tienes 2 opciones:
1- Te vas hasta el aeropuerto y le pides permiso al Observador de turno que te deje comparar, en la propia estación, la presión y de paso la temperatura y la humedad relativa (que sea por el psicrómetro y no por el termohigrógrafo) Ten encuenta que no tiene obligación de dejarte pasara la estación asi que pídele de favor (asi que llevate un doc. de facturas o algo jejeje) Tienen muy buena onda por lo que no te preocupes.
2- Si por algún motivo, no puedes o no te dejan comparar la medición, ingresá al aeropuerto y te vas lo más cerca posible de la estación meteorológica sobre la parte pública del aeropuerto (asi no te pueden decir nada) eliges un hora y tomas la medición. Si en el lugar tienen internet, ingresa a a la página de SMN a este enlace (http://www.smn.gov.ar/mensajes/index.php?operacion=seleccion&observacion=aeromet), eliges la opción FIR EZEIZA y elige la estación La Plata. La presión es la que dice Qxxxx.x Esta presión es a nivel del mar QNH. Si no te sirve esta presión, verás que cuando te muestra el dato, debajo de La Plata, dice Synop. La presión que corresponde a nivel de la estación es el grupo 3. Comienza a contar debajo de la leyenda AAXX y cuenta 6 grupos. El grupo de la presión comienza con 3 y los 4dígitos restante, es la presión con décimos en Hpa. Por ejemplo 30150 la presión a nivel estación es 1015.0Hpa, o 30168 la presión es 1016.8Hpa.
Por último, no te aconsejo que compares o calibres tus instrumento con eso relojes que dan la presión y la temperatura y la humedad, ya que nadie te garantiza que tengan un error muy bajo y que tengan una respuesta rápida a un cambio de un dato, ya sea presión, temperatura y humedad.
Espero no haberte mareado.
Hola que tal, no me mareaste, la explicacion estuvo muy entendible, para no molestar a nadie voy a empezar por calibrar con la pagina del smn, luego si veo que no da resulatdo comprare las facturas.
en estos dias voy hacer los dibujos del circuito asi los pongo en el foro.
Tengo otra pregunta, (que es mi proximo paso)cuando se indica la velocidad del viento, ese valor es un promedio de la hora o es el valor instanteneo de ese momento o un promedio de los ultimos minutos como deberia medirlo?
Un saludo y gracias por tus info.
El viento se mide según su necesidad. Si es para pasárselo a las aeronaves, la velocidad del viento debe ser instantánea o en un promedio de 2 min. Si es para recaudar datos y mediciones generales, se debe hacer en un promedio de 10 min. Los anemómetros digitales que emplea el SMN, tienen los tres casos, instantánes, promedio de 2 min y promedio de 10 min. Estas dos opciones, se eligen con un interruptor giratorio.
OK, gracias
Como hago para poner imagenes?
Yo los subo a esta direción http://imageshack.us/ (http://imageshack.us/) Una vez que cargó la imagen, hago un doble click en la imagen subida luego copio y pego la dirección que dice foroum.
(http://img297.imageshack.us/img297/305/diagramade6.png) (http://imageshack.us)
Hola, bueno si hice todo bien se vera un diagrama en bloques de mi estacion meteorologica.
tal Como se ve, un micro (microchip 18f252) controla el sistema y Ya que la idea era poder
tener un registro hora a hora de las variables, le agregue un reloj (motorola 68hc68), el cual
cada una hora le genera una interrupcion al micro, y este lee todos los sensores y guarda
los datos en una memoria (Microchip 25256 - 32k x 8) y como luego habia que bajar esos
datos de la memoria, le agregue una puerta serie rs232, que cambiare por una rs485
cuando coloque todo en algun lugar mas alejado.(p.ej. en un mastil, arriba de algun techo
tambien tengo previsto poder usar modulos de R.F.)
Los sensores son tc1047 para la temp., el HIH4000 para la humedad, el mpx200 para la presion
+ un ad620 como amplificador.
Para el pluviometro use el sistema del cangilon, este tiene un iman que con cada cambio
activa un sensor mangnetico el cual le genera una int. al micro y este acumula la cantidad
de veces que cambia.
Para la veleta pienso usar un disco codificado y 4 leds al cual le puedo
sacar 16 posiciones distintas, y para el anemometro todavia no tengo definido
que hacer(aunque tengo varias ideas).
Luego seguire dando mas detalles
Cualquier consulta estoy a disposicion
Saludos
Debo felicitarte por el gran trabajo realizado. La verdad que está muy bien echo y completo.
Te cuento algunas ideas de como pienso armar el anemómetro por ssi te sirve.
Vamos con la veleta:
La "flecha" va a un eje para que pueda girar libremente en los 360º. Aprovechando esto, le voy a poner sensores de efecto hall. Por ahora pienso ponerle 16 y a la veleta un iman. Con 16 pociciones, podemos detectar 32, ya que cuando se activan dos sensores, me está marcando el centro entre estos dos. Me explico. Tenemos un sensor en el NORTE, otro sensor en el NORESTE, otro sensor en el ESTE. Si se activa el sensor en el NORTE, es ovbio que el viento viene del NORTE, pasa lo mismo con en NORESTE y demás puntos cardinales. Para saber si el viento viene del NORNORESTE (NNE), voy a tener activado los sensores NORTE y NORESTE.
Medidor de la velocidad del viento:
Aquí tengo dos ideas y te la muestro como más me interesa a mi.
1- Crear una medidor de viento por coperolas. Dentro del tambor que girará según la velocidad del viento, pondré una serie de imanes separados equitativamente para hacer que el efecto hall mande una frecuencia segun su velocidad. Lugo con un conversor de frecuencia a tensión, obtengo la velocidad del viento con el PIC.
2- Crear un medidor de viento por coperolas y dentro del tambor, ponerle un fotodiodo y una fuente de luz (ya que dentro estará cerrado hermeticamente para que no entre suciedad). Y colocaré un disco con cuadrados blancos y Negros, de esta manera, el fotodiodo creará una frecuencia y con un conversor de frecuencia a tensión, mido la velocidad del viento con el PIC.
Si bien suena a complicármela, con esto, puedo medir viento de muy baja velocidad de menos de un nudo, o según como lo construya, a partir de un nudo.
Gracias, en estos dias voy a poner mas cosas,
cuando vaya armando los dibujos.
Para completar esta primera parte voy a poner parte del archivo de salida para que veas el formato y una descripcion del programa (en Visual Basic) que controla la estacion.
Con respecto a tus sugerencias:
sobre la veleta (Que sera lo proximo que voy hacer) mi idea es igual a la tuya, salvo que tenia pensado usar un disco plastico transparente donde habria algunas zonas negras (armando una codificacion binaria de 4 bits ), 4 led y 4 fotodiodos detectarian el paso o no de la luz y eso me daria el codigo de la posicion, que leeria un puerto del pic, espero que se entienda (Voy a poner dibujos para que se entienda mejor).
En tu caso como leerias la posicion de la veleta desde el pic? , o como seria la lectura
Con respecto al anemo algo de eso pense pero como es lo mas dificil lo estoy dejando para lo ultimo.
La lectura sería en la salida del transistor efecto hall. Estos se ponen a 1 cuando detectan un campo magnético y cero cuando no detectan ningún campo magnético. (aunque si no me equivoco, algunos son a la inversa, se ponen a 0 cuando detectan un campo magnético) Lo malo es que necesito 16 entredas para la veleta y sería mucho recurso, por lo que tengo pensado hacer un codificador, para obtener menos líneas. Aún no estoy en ello. Estoy mejorando el código de lectura de la temperatura, para hacerlo lo mas chico posible y más eficiente, y un autorango para la tensión de referencia. Una vez que termine esto, continuaré con el sensor de humedad.
Hola, este es el archivo de salida, donde pongo la fecha, hora y demas datos que se ven.
Este se puede levantar p.ej. con excel y hacer garficos y esas cosas.
(http://img264.imageshack.us/img264/3089/formatodatosdesalidaii8.png) (http://imageshack.us)
By ricber (http://profile.imageshack.us/user/ricber)
esta la aplicacion en visual basic que hice para estar conectado "on line", bajar datos, poner en hora, borrar la memoria, etc.
Bueno esto seria una especie de intro de mi proyecto.
Como veras el programa tiene algunos chiches como punto de rocio o sens. termica que no se si los voy a dejar, a veces me complico mas de lo necesario.
(http://img264.imageshack.us/img264/5420/progvb2sr0.png) (http://imageshack.us)
By ricber (http://profile.imageshack.us/user/ricber)
Queria comentarte que en algun momento hice algunas pruebas con conversores frec/tension para el anemometro pero no consegui buena linealidad, vos hiciste alguna prueba con eso.
Bueno, un saludo.
Si queres puedo seguir explicando algunas cosas mas de mi estacion, pero no quiero ser pesado.
Muy linda la interfaz. Ir complicandose de entrada, es solucionarce problemas futuros. Cuanto más completa es, mejor será.
Un comentario no por criticar. Tienes un error en el cálculo del punto de rocío, jamás hay tanta diferencia. Idicaría que la humedad es menor a 0%
Por mi, exlplica todo lo que quieras sobre tu estación, si tu lo quieres, puedes crear un nuevo tema hablando solo de tu estación meteorológica. Recuerda que muchas personas (incluyéndome, jeje) te pueden copiar las ideas, asi que solo digas lo que no tendrás problemas en que las demás personas se copien. Y en el nuevo tema, podrás plantear problemas de tu estación y veremos como solucionarlo.
Respondiendo a tu pregunta, no he trabajado aún con estos conversores, es solo una idea en mente, pero veo que voy a tener que pensar en otra cosa, Aún estoy atorado con una parte del programa, porque el diodo zener me entrega ruido y estoy tratando de solucionar esto haciendo que sea autoajuste el software. Ya casi lo tengo, en cuanto lo tenga subo un esquemático por si a alguien le sirve, o también el programa entero.
No hay problemas por las criticas, esa es en parte la funcion de un foro, a mi me sirven.
Voy a revisar los valores, este calculo esta hecho en funcion de una tabla que encontre en internet y que relaciona la humedad con la temp. puede ser que la tabla este mal cargada en el programa o tenga un problema en la rutina del calculo, (lo mas probable).
No es un problema que la gente copie las ideas por eso las comento (yo he copiado algunas alguna vez) y lo que necesites lo tenes a tu disposicion.
Hay unos integrados para tension de referencia que son mejoreas que los zeners, con menor ruido y mas estables en temperatura el numero es el lm336-2.5V
Saludos
Cita de: ricber
Hay unos integrados para tension de referencia que son mejoreas que los zeners, con menor ruido y mas estables en temperatura el numero es el lm336-2.5V
Saludos
Oido cocina
Voy haber si te encuentro alguna fórmula que sea en función de la humedad y temperatura. Las que yo tengo, la humedad se calcula con el punto de rocio.
Ok, gracias
Al final, opté por el LM336 de 2.5V de referencia, ya que el método que yo estaba haciendo, es muy sensible a la fuente, ya que si ésta me entrega menos de 5V (como me está pasando ahora) el valor medido cambia muy notablemente.
Muchas gracias por la sugerencia. Me vino como anillo al dedo.
Hola, bueno me alegro, tengo una pregunta y es con respecto a la hora que aparece en el informe synop, es como que hay 1 hora de diferencia, o lago asi, puede ser lo que digo??.
El link me sirvio y la presion la pude correguir bastante, pero descubri algo que hasta que no lo solucione, la presion no va andar bien, el problema esta en que el sensor (MPX200) no viene compensado en tempertaura entonces la tension de salida no es la misma si la temperatura cambia, y mas si p.ej. tenemos dias con 25º y otros con 35º
Te lo comento por si le pones uno a tu estacion tengas en cuenta de conseguir uno compensado internamente.
Saludos
Puede ser que no se allan cargado los últimos datos y en la página del SMN no esté actualizado. Muchas veces pasa y mas ahora que al haberse pasado a ser civil completamente, están renobando contratos con diferentes empresas. Es por eso que te decia que anotes las hora en que tomaste la presión y espera el último dato que corresponda a la hora en que tu mediste la presión ???
Lo que debes tener encuenta es que la hora del Synop está en hora Zulú, o sea, le tenés que restar dos horas para saber la hora local. (el 16 de marzo volvemos a 3 horas de diferencia cuando nos toque atrasar una hora todos los relojes)
Con respecto al sensor de presión, sabía ese problema, y el que tienes tu, es al menos el que conozco. Lo que tenía pensado a ser, pero que todavía no me senté a resolver, es una vez que alla medido la temperatura, mido la presión y realizo el ajuste por temperatura. Pero me tengo que sentar a resolverlo y como.
Estoy ahora en un problema, y es que el sensor de humedad, me entrega en la salida casi 4 volt a 100% de Humedad relativa, entónces tengo que poner al +Vref del CAD del PIC a Vdd y esto se traduce que si la fuente falla, o sea, que me entrega menos de 5V, el sensado es incorrecto. Veré como lo solucionaré :o
Hola, si esa correccion por soft la habia pensado, tambien se puede hacer colocando unos termistores en serie con la alimentacion del sensor, todavia no se cual adoptar.
Lo del sensor de humedad puedes probar de dejar la Vref al valor que tenes y colocar un divisor de tension a la salida del sensor de tal forma que te cuando tengas 4 volt el divisor lo baje al valor que necesitas a la entarda del A/D, luego por soft lo recompones, yo lo hice asi.
Magnífica idea :) :) Ya me estoy lanzando con el programa. Vemos que me sale.
Subo algunos avances de mi pluviómetro a cangilón. Va tomando forma. Luego prometo subir un instructivo de como armar uno. La característica de este pluviómetro, es que está echo con cosas recicladas.
(http://www.meteorologiafacil.com.ar/foros/index.php?action=dlattach;topic=25.0;attach=770)
La siguiente imágen, podemos ver como quedará con un enbudo. Este embudo no es el que lleva. Lleva uno más grande. Este está solo a modo ilustrativo.
Solo me falta hacer la parte de control y conseguir el embudo adecuado colocarlo y hacer las primeras pruebas.
(http://www.meteorologiafacil.com.ar/foros/index.php?action=dlattach;topic=25.0;attach=772)
Muy bueno, me gusto el tema de usar materiales reciclados, yo no tengo cosas para reciclar por eso tengo que comprar todo, pero la idea es muy buena.
Al mio recien le termine de montar el sensor y de ajustarlo, mañana voy a poner una imagen de como quedo colocado.
Voy a empezar con la veleta asi que mañana tambien voy a explicar cual va a ser mi idea.
Yo tengo dos ideas para hacer la veleta, talvez te sirven.
1- Como lo dije anteriormente, poner un iman y 16 sensores de efecto hall o cambiar estos sensores por los magnéticos, como el que utilizaste en tu pluviómetro.
2- Con 4 sensores, sacar las 16 direcciones. Para ello codificar la señal. Estas señales se obtendrán de sensores infrarojos y según como se obtruyan o no, me dará la codificación de la señal. La señal se producirá con un disco perforado según la codificación.
Casi termino el pluviómetro. en cuanto lo termine empiezo por el anemómetro y explico mejor mi idea. Me estoy inclinando por esta opción. Para la edición de la intencidad, utilizar un disco perforado para hacer una frecuencia y dependiendo de la frecuencia, dependerá la velocidad, y la otra opción es con un motor DC.
Bien, yo pense en hacerlo con sensores infrarrojos y un disco codificado, y con 16 direcciones ::) , pero antes de empezar pregunto, ¿Tiene mucha importancia, a los fines meterologicos, de pronostico o en el tema de aviacion, tener 16 o 32 direcciones?, ??? lo normal o lo reglementario es manejarse con 32 direcciones?. Hoy iba a empezar con eso pero voy a esperar tu respuesta.
Con respecto al anemometro, varias veces lo empece a hacer pero me resulto dificil >:( asi que segui con otras cosas, pero ya me va a llegar la hora.
Te comento algo de mi experiencia, la que mas me convencio fue la de medir la frecuencia, tambien pense en medir el tiempo que tarda en dar una vuelta y con respecto al motor de DC es la mas facil pero a baja velocidad (con una brisa por. ej.) no alcanzaba para sacarlo de reposo, use unos motores de lectores de CD talvez no sea el indicado, pero como dije no tengo cosas viejas como para probar, entonces tengo que andar rogando que me regalen disquetras o cd viejos, un lio, pero quizas vos sepas cual motor es mejor.
Un saludo.
Yo estoy mas dedicado a la aviación por mi trabajo, por eso, lo hago de 32 direcciones*, pero si lo quieres para uso personal, hazlo con las direcciones que te alcancen. ten encuenta que con más información, más vale el proyecto y de mejor calidad será la estación automática.
En estos días, voy a dibujar mi idea del anemómetro (dirección en intencidad) por si te sirve.
En cuanto a los motores, tienes razón, no había mensado en ese detalle. Por ahora no experimenté con ningún motor, por lo que no te puedo decir cual es mejor.
Voy a estudiar la función de captura del PIC16F877, para ver si me sirve o no. :D :D :D
EDITO:* La rosa de los vientos que voy hacer es de 16 direcciones.
Cita de: david metCita de: ricber
Hay unos integrados para tension de referencia que son mejoreas que los zeners, con menor ruido y mas estables en temperatura el numero es el lm336-2.5V
Saludos
Oido cocina
Voy haber si te encuentro alguna fórmula que sea en función de la humedad y temperatura. Las que yo tengo, la humedad se calcula con el punto de rocio.
Revisado mis apuntes, encontré lo que te había prometido.
Cálculo del Punto de rocío conociendo la Temperatura y la humedad.Td = T + 35 Log (HR)Td: Temperatura del punto de rocío en ºC
T: Temperatura ambiente en ºC
Log: es logaritmo
HR: Humedad relativa expresada en %/100, o sea que para una humedad relativa de 20% aplicando la fórmula 20/100 = 0.2
Conociendo la presión de vaporTd = [116.9+237.3ln(e)]/[16.78-ln(e)]Td: Temperatura del punto de rocío en ºC
ln: Logaritmo neperiano
e: Presión o tensión vapor en Kpa (kilopascal) 1Hpa = 0.1 Kpa.
Hola, gracias por acordarte, lo voy a poner en el programa.
Saludos. Muy buen proyecto, y muy creativo todo. Les comento que voy a ver un poco mas de este proyecto y si les parece les aportare algunas ideas con otros dispositivos que los consiguen y mejoraran aun mas este dispositivo. (ESTAMOS EN NEUQUEN ). Estaremos a su disposicion (por favor entender que no estamos siempre conectados) y aportaremos algunas sugerencias de ser posible con tecnologia nueva.
www.siselen.com.ar ;)
Hola totopic. Bienvenido al foro.
Nos gustaría que compartiera algunos aportes, concejos e ideas. Todo viene bien. Por lo de estar conectados, no te preocupes, cada uno se conecta en la medida que puedan.
Saludos.
Luego de acomodarme los tiempos, vuelvo a la carga con la estación automática.
Sigo con el sensor HIH-4000 (http://www.hobby-boards.com/catalog/links/hih-4000/HIH-4000%20Specifications.pdf?osCsid=e62d8162adc02e8c36a4d96dbd8ff7b6), en el datasheet dice:
NOTICE
• Do not expose sensor to condensing environments.
Exposure to condensing environments will cause sensor
output to indicate 0 %RH.
• Sensor is light sensitive. For best performance, shield
sensor from bright light.
• Sensor is static sensitive. Sensor connection protected to
15 kV maximum.
• Sensor output is ratiometric to supply voltage.
Traduzco la parte en negrita.
La salida es radiométrica a la tensión de la fuente (Supply voltage).
¿Qué es radiométrica?
ratiometric: En sistemas electrónicos o electromecánicos, se refiere al voltaje de salida como una proporción del voltaje de suministro. Por ejemplo, si el voltaje de entrada se multiplica por dos, el voltaje de salida también lo hará.
En el datasheet presentan ya la ecuación que rige al sensor: Vout=Vsupply(0.0062(sensor RH)+0.16)
Si de esa fórmula despejo sensor RH me daría la humedad ambiente. Como vemos en la fórmula, la tensión de salida es directamente proporcional a la tensión de entrada del propio sensor.
Por ejemplo, para una humedad 98% y alimentado a 5V
Según la fórmula: Vout=Vsupply(0.0062(sensor RH)+0.16)
Vout = 5 * ((0.0062 * 98) +0.16)) = 3.838V
Ahora con misma humedad 98% y alimentado a 4.5V
Vout = 4.5 * ((0.0062 * 98) + 0.16)) = 3.4542V
Al despejar la fórmula sensor RH, y conociendo la alimentación con que alimento al sensor, y midiendo por el ADC la tensión entregada por el sensor, obtengo la humedad relativa.
HR = [Vout - (Vsupply * 0.16)] / (Vsupply * 0.0062)
Lo maravilloso de todo esto, es que tengo el 70% de la fórmula resuelta, ya que yo voy a trabajar 5V. Entonces, la fórmula a implementar me quedaría así:
HR = [Vout - (5V * 0.16)] / (5V * 0.0062)
HR = (Vout - 0.8) / 0.031
Buen dia David, Excelente explicacion del sensor de humedad
Gracias Ricber. Tenía duda de la fórmula y buscando por internet daban una fórmula que no aparecía en el datasheet y por eso me puse a investigar. De echo, me parece que vos le diste una fórmula igual o parecida a otro forero en otro foro ¿es verdad? ::)
Si, a alguien le pase la formula, no recuerdo bien donde fue, pero tu analisis fue muy bueno.
Otra cosa, que me estaba olvidando, Tengo a prueba la estacion y he registrado varios dias, los he graficado en excel y vi algo que realmente me llamo la atencion, (todavia no entiendo mucho del mundo meteorologico), las curvas de los valores de temp. presion seguian el mismo patron y el de humedad aparecia con la misma tendencia pero invertida, no se si se entende, en estos dias voy tratar de poner el grafico en el foro para que se entienda mas lo que digo.
Saludos
Ricber, te respondo aquí, relación entre la temperatura, la humedad y la presión. (http://www.meteorologiafacil.com.ar/foros/index.php?topic=36.0)
Saludos tengo rato ya q quiero armar mi estacion y por azares del destino cai aqui, su analisis para cada instrumento de medicion me esta sirviendo mucho(tomare algunas ideas prestadas para la mia ::) si em lo permiten) se me ocurre que tambien se ponga en "asunto" aparte cada instr. de medicion para que sea ejemplo o base para que de ahi se den una idea de como empezarle, como ven? por mi parte yo estoy usando el 16F876(pondre en un post aparte mis avances) y uso el PBP.
Si zakario, puedes tomar todas las ideas,pues para eso, estamos posteando los avances.
Lo que no te entiendo es esto:
Citarse me ocurre que tambien se ponga en "asunto" aparte cada instr. de medicion para que sea ejemplo o base para que de ahi se den una idea de como empezarle, como ven?
Cita de: David Met en Abril 05, 2009, 11:21:20 PM
Yo estoy mas dedicado a la aviación por mi trabajo, por eso, lo hago de 32 direcciones, pero si lo quieres para uso personal, hazlo con las direcciones que te acanzen. ten encuenta que con más información, más vale el proyecto y de mejor calidad será la estación automática.
En estos días, voy a dibujar mi idea del anemómetro (dirección en intencidad) por si te sirve.
En cuanto a los motores, tienes razón, no había mensado en ese detalle. Por ahora no experimenté con ningún motor, por lo que no te puedo decir cual es mejor.
Voy a estudiar la función de captura del PIC16F877, para ver si me sirve o no. :D :D :D
Levante la mano el tarado que dice que las direcciones para darle al viento es de 32 direcciones.
David met: yo, yo, yo.
Este sarcasmo anterior, se debe a que me re equivoqué. No recuerdo que fue lo que me hiso equivocarme, pero las direcciones son 16, no 32 :-[ :-[
En resumen. La rosa de los vientos están divididos de la siguiente manera:
a- 4 (N, E, S, W)
b- 8 (N, NE, E, SE, S, SW, W, NW)
c- 16 (N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW)
¿De dónde saqué 32 direcciones? @#$&&%# >:( >:(
ah pues me referia ah que estuviera en un nuevo mensaje por ejemplo la parte del pluviometro, el anemometro.. etc para que sea de facil acceso,pero bueno eso podria ser al final cuando quede tu estacion completa.
Muy buena idea zakario. Voy a empezar por el termómetro y el sensor de humedad.
Por fin terminé de crear la etapa para censar la humedad. También cambié por completo o casi por completo el programa principal. Voy a transmitir a la etapa receptora todos los datos por medio de RF, para ello voy a utilizar los módulos TWS (http://www.alldatasheet.com/datasheet-pdf/pdf/230403/ETC/TWS-434.html) y RWS (http://www.alldatasheet.com/datasheet-pdf/pdf/230404/ETC/RWS-434.html). Esto módulos tienen un alcance de 100mts a campo abierto por lo que para mi, me alcanza y sobra.
Voy a tratar de esta tarde, subir el diagrama de flujo de la etapa transmisora. Lo que voy a subir ahora, es el programa, la parte que censo la temperatura y la humedad.
Vemos la parte de la configuración inicial y el censado de la temperatura.
INICIO BCF STATUS,RP0 ;BANCO 0
BCF STATUS,RP1 ;BANCO 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTC
CLRF PORTE
MOVLW B'10010000' ;HABILITO RB0/INT Y INTERRUPCIONES GENERALES.
MOVWF INTCON
;************************************************************************************************
;BORRO LAS POSICIONES DE MEMORIAS EN DONDE SE GUARDAN LOS DATOS SENSADOS E INICIALIZO EL LUGAR DE DÓNDE COMENZAMOS A GRABAR.
;************************************************************************************************
TEMPERATURA ;RUTINA PARA SENSAR, PROMEDIAR LAS MUESTRAS Y GUARDALAS EN LA RAM DE LA TEMPERATURA.
CALL BORRO_MEMOB2 ;LLAMO A LA RUTINA PARA BORRAR LAS POCICIONES DE MEMORIA DEL BANCO 2
CALL BORRO_MEMOB3 ;LLAMO A LA RUTINA PARA BORRAR LAS POCICIONES DE MEMORIA DEL BANCO 3
CALL AJUS_MEMO
;
;------------------------------------------------------------------------------------------------
;EMPEZAMOS LA MEDICIÓN DE TODOS LOS PARÁMETROS. PRIMERO LA TEMPERATURA, SEGUNDO LA HUMEDAD, TERCERO EL VIENTO
;CUARTO PRESIÓN. LA PRECIPITACIÓN, SE TOMA POR MEDIO DE LA INTERRUPCIÓN DE RB0. POR CADA MEDICIÓN, SE TOMA 42 MUESTRAS, SE HACE EL PROMEDIO
;Y SE GUARDA EN UNA POSICIÓN DE LA RAM PARA SU POSTERIOR TRANSMISIÓN. TERMINADO ESTE PROCESO, SE PROCEDE A SENSAR EL SIGUIENTE SENSOR.
;UNA VEZ SENSADO ESTOS PARÁMETROS, PROCEDEMOS A ENVIAR LOS DATOS A LA ESTACIÓN RECEPTORA.
;------------------------------------------------------------------------------------------------
;************************************************************************************************
;MIDO LA TEMPERATURA. TOMO 42 MUESTRAS Y LA GUARDO EN SUS RESPECTIVO LUGAR.
;************************************************************************************************
;
DATO_MUESTRAS
MOVLW .42
MOVWF muestras
;
ADQ_TEMP BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO 1
MOVLW B'00001001'
MOVWF TRISA ;RA0 y RA3 COMO ENTRADA, DEMÁS SALIDAS
MOVLW B'00000001' ;+VREF RA3, ALINEACIÓN A LA IZQUIERDA Y PORTA TODAS ANALÓGICAS.
MOVWF ADCON1 ;Y LO PASO AL ADCON1
BCF STATUS,RP0 ;BANCO 0
MOVLW B'10000001' ;ADC ENC. CANAL AN0. FREC Fosc/32
MOVWF ADCON0 ;Y LO PASO AL ADCON0
BCF PIR1,ADIF ;INDICO QUE LA CONVERSIÓN NO ESTÁ ECHA
NOP ;PARA ESTABILIZAR
CALL ADQUISICIÓN ;COMIENZO LA CONVERSIÓN
;-----------------------------------------------------------
;PASAMOS LA CONVERSIÓN A LA MEMORIA RAM. TRABAJAMOS CON 8 BITS
;-----------------------------------------------------------
MOVFW ADRESH
MOVWF DATO4
MOVWF TEMP2 ;SALVO EN TEMP1 POR SI LA RESTA ES NEGATIVO
;
ADQ_REF BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO 1
MOVLW B'00001010'
MOVWF TRISA
MOVLW B'00000001'
MOVWF ADCON1 ;+VREF RA3, ALINEACIÓN A LA IZQUIERDA Y PORTA TODAS ANALÓGICAS
BCF STATUS,RP0
MOVLW B'10001001'
MOVWF ADCON0 ;ADC ENC. CANAL AN1. FREC Fosc/32
BCF PIR1,ADIF ;INDICO QUE LA CONVERSIÓN NO ESTÁ ECHA
NOP ;PARA ESTABILIZAR
CALL ADQUISICIÓN
;-----------------------------------------------------------
;PASAMOS LA CONVERSIÓN A LA MEMORIA RAM, TRABAJAMOS CON 8 BITS
;-----------------------------------------------------------
MOVFW ADRESH
MOVWF DATO2
MOVWF TEMP4
;-----------------------------------------------------------
;RESTAMOS LOS DOS VALORES PARA QUE ME DÉ EL VALOR REAL SI EL VALOR ES NEGATIVO, LA TEMPERATURA TEMBIÉN LO ES.
;RESULTADO EN DATO4
;-----------------------------------------------------------
SUBWF DATO4,F ;RESTAMOS DATO4 - DATO2 (AL VALOR DE DATO2 AÚN LO TENEMOS CARGADOS EN W, EL RESULTADO EN DATO4
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO TEMP_NEGATIVA ;SI, LA TEMPERATURA ES NEGATIVO
BSF estado,1 ;NO. AJUSTAMOS LOS ESTADOS CORRESPONDIENTES. HAY DATOS POSITIVOS A PROMEDIAR
BSF estado,2 ;EL DATO DE AHORA ES POSITIVO.
GOTO DESCOMPONER_NÚMERO
;
TEMP_NEGATIVA
MOVFW TEMP2 ;AL SER NEGATIVO, VUELVO HACER LA RESTA PERO INVIERTIENDO
SUBWF TEMP4,W ;EL MINUENDO POR EL SUBTRAENDO, ASÍ NOS DÁ EL VALOR CORRECTO
MOVWF DATO4 ;ES POR ELLO QUE GUARDAMOS LOS DATOS EN TEMP
;PARA RESTAR INVIRTIENDO LOS VALORES Y YA NO ES NECESARIO CHEQUEAR EL
;BIT C, YA QUE SABEMOS QUE ES NEGATIVO.
;
BSF estado,0 ;HAY DATOS NEGATIVOS A PROMEDIAR
BCF estado,2 ;EL DATO DE AHORA ES NEGATIVO
;DESCOMPONER_NÚMERO
;
;-----------------------------------------------------------------
;UNA VEZ RESTADOS LAS DOS ADIQUICICIONES, MULTIPLICAMOS EL RESULTADO POR 976 ASÍ LO PASAMOS A VOLT.
;SE OBTIENE UN RESULTADO DE 24 BIT. LUEGO, LO DIVIDIMOS POR 100 PARA QUEDARNOS CON LOS VALORES DESEADOS,
;HASTA 4 DÍGITOS QUE NOS CONSUMIRÁ DOS REGISTRO DE 8 BITS.
;
;UNA VEZ ECHO ESTO,TOMAMOS 42 MUESTRAS. Y HACEMOS EL PROMEDIO. PARA ELLO, PRIMERO SUMAMOS
;TODAS LAS TEMPERATURAS, Y LUEGO LO DIVIDIMOS POR 42. ESTO NOS DA EL PROMEDIO.
;CUANDO OBTENEMOS EL PROMEDIO, LO DESCOMPONEMOS EN CENTENA, DECENA, UNIDAD Y DÉCIMO.
;
;NOTA: QUE HACER CUANDO LA TEMPERATURA ES NEGATIVA Y POSITIVA.
;SI LA TEMPERATURA ES POSITIVA, SE ALMACENAN DESDE H'110' HASTA H'168' BANCO 2
;SI LA TEMPERATURA ES NEGATIVA, SE ALMACENAN DESDE H'190' HASTA H'1E8' BANCO 3
;
;LA FORMA DE HACER EL PROMEDIO VARÍA SI TENEMOS POSITIVOS O NEGATIVOS O LOS DOS.
;1er CASO: SOLO POSITIVOS. SUMAMOS LAS 42 MUESTRAS (DOS NÚMEROS DE 8 BITS) Y LUEGO LO DIVIDIMOS POR 42
; EL RESULTADO ES EL DATO A MOSTRAR LUEGO VOLVEMOS A EMPEZAR TOMANDO DE NUEVO LAS 42 MUESTRAS
;2dO CASO: SOLO NEGATIVOS. LO TRATAMOS COMO SI FUERAN POSITIVOS Y EN EL MOMENTO DE MOSTRAR EL DATO,
; MOSTRAMOS EL SIGNO MENOS EN EL LCD.
;3er CASO: POSITIVOS Y NEGATIVOS. PRIMERO SUMAMOS LOS POSITIVOS Y HACEMOS EL PROMEDIO. LO GUARDAMOS EN LA MEMORIA
; LUEGO SUMAMOS LOS NEGATIVOS Y HACEMOS EL PROMEDIO. LO GUARDAMOS EN LA MEMORIA. PARA OBTENER EL DATO A MOSTRAR
; RESTAMOS EL PROMEDIO POSITIVO CON EL PROMEDIO NEGATIVO. DE ESTA MANERA TENEMOS 3 OPCIONES
; 1- EL PROMEDIO POSITIVO ES MAYOR QUE EL NEGATIVO, EL DATO OBTENIDO ES POSITIVO. NOS DAMOS CUENTA CHEQUEANDO EL BIT C
; 2- EL PROMEDIO POSITIVO EN MENOR QUE EL NEGATIVO, EL DATO OBTENIDO ES NEGATIVO. NOS DAMOS CUENTA CHEQUEANDO EL BIT C
; 3- EL PROMEDIO POSITIVO ES IGUAL QUE EL NEGATIVO, EL DATO OBTENIDO ES CERO.
;
;
;MULTIPLICAMOS POR 977.
;
DESCOMPONER_NÚMERO
;
MOVFW DATO4 ;EL RESULTADO ANTERIOR QUE ESTÁ EN DATO4, LO PASAMOS A MULTIPLICADOR
MOVWF multiplicadorBA
CLRF multiplicadorAL
MOVLW B'00000011'
MOVWF DATO3
MOVLW B'11010001'
MOVWF DATO4 ;MENOS SIGNIFICATIVO
CLRF DATO2
CLRF DATO1
CALL MULTIPLICAR ;MULTIPLICAMOS Y OBTUVIMOS UN RESULTADO DE 24 BIT EN DATO2, DATO3, DATO4 (MENOS SIGNIFICATIVO)
;
;...................................
;DIVIDIMOS EN 100 PARA OBTENER EL VALOR A ALMACENAR SOLO EN 4 DÍGITOS, EL RESULTADO OBTENIDO ESTA EN DATO
;...................................
;
MOVLW .100 ;DIVISOR
MOVWF FUNC4
CLRF FUNC3
CLRF DATO1 ;BORRO DATO1.
CALL DIVISION ;EL RESULTADO DE LA MULTIPLICACIÓN POR 977 LO DIVIDO POR 100, EL RESULTADO EN DATO.
;
;ANALIZAMOS SI LA TEMPERATURA ES NEGATIVA O PISITIVA
;
RES_NEG BTFSS estado,2 ;¿ES POSITIVO?
GOTO DATO_NEG ;ES NAGATIVO
;
;GUARDAMOS LOS DATOS EN EL BANCO CORRESPONDIENTE
;
;PARA POSITIVOS
;
BCF STATUS,RP0 ;ES POSITIVO
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1 ;DIRECCIÓN A APUNTAR
MOVWF FSR ;APUNTAMOS
BCF STATUS,RP1 ;BANCO 0
MOVFW RESDIV3 ;RECUPERO EL RESULTADO MAS SIGNIFICATIVO
BSF STATUS,RP1 ;BANCO 2
MOVWF INDF ;GUARDAMOS EL DATO EN LA POCICIÓN APUNTADA EN FSR
INCF FSR,F ;INCREMENTAMOS EL FSR PARA GUARDAR EL RESULTADOS MENOS SIGNIFICATIVO
BCF STATUS,RP1 ;BANCO 0
MOVFW RESDIV4 ;RECUPERO EL RESULTADO MENOS SIGNIFICATIVO
BSF STATUS,RP1 ;BANCO 2
MOVWF INDF ;PASAMOS EL VALOR A LA POCICIÓN APUNTADA EN FSR
INCF prom_pos,F ;INCREMENTO EN 1 A PROM_POS
INCF FSR,F
MOVFW FSR ;PASAMOS EL DATO A W
MOVWF dir1 ;Y LO SALVAMOS PARA SU POSTERIOR USO
BCF STATUS,RP1 ;BANCO 0
GOTO TOTAL_MUESTRAS
;
;PARA NEGATIVOS
;
DATO_NEG BSF STATUS,RP0 ;
BSF STATUS,RP1 ;BANCO 3
MOVFW dir2
MOVWF FSR
BCF STATUS,RP0
BCF STATUS,RP1
MOVFW RESDIV3
BSF STATUS,RP0
BSF STATUS,RP1
MOVWF INDF
INCF FSR,F
BCF STATUS,RP0
BCF STATUS,RP1
MOVFW RESDIV4
BSF STATUS,RP0
BSF STATUS,RP1
MOVWF INDF
INCF prom_neg,F
INCF FSR,F
MOVFW FSR
MOVWF dir2
BCF STATUS,RP0
BCF STATUS,RP1
;
TOTAL_MUESTRAS
DECFSZ muestras,F ;¿TOMÉ LAS 42 MUESTRAS?
GOTO ADQ_TEMP ;NO, SIGO MIDIENDO LA TEMPERATUA.
CALL AJUS_MEMO ;SI, DEJO INICIALIZADA LAS DIRECCIONES A APUNTAR PARA PODER PROMEDIAR LAS MUESTRAS.
;
;REALIZAMOS EL PROMEDIO
;
FIN_PROMEDIO
BTFSS estado,1 ;¿HAY VALORES POSITIVOS?
GOTO DATOS_NEGATIVOS ;NO HAY. SOLOS NEGATIVOS.
;
;DATOS POSITIVOS, LOS SUMAMOS Y EL RESULTADO ESTÁ EN DATO3, DATO4
;
BCF STATUS,RP0 ;SI HAY
BSF STATUS,RP1 ;BANCO 2
MOVFW prom_pos ;SALVAMOS LA CANTIDAD DE DATOS POSITIVOS
BCF STATUS,RP1 ;BANCO 0
MOVWF prom_pos_alt ;PARA SABER CUANTAS VECES HAY QUE SUMARLAS, PARA LUEGO DIVIDIRLAS.
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1
MOVWF FSR ;DIRECCIÓN A LEER
MOVFW INDF ;EL VALOR EN FSR SE GUARDA EN W
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO3
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F ;DIRECCIÓN A APUNTAR SEGUNDO DATO
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO4
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW FSR
MOVWF dir1
;
SUMAR_PROMEDIO
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1
MOVWF FSR
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO1
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO2
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW FSR
MOVWF dir1
BCF STATUS,RP1 ;BANCO 0
CALL D_addF
DECFSZ prom_pos_alt,F
GOTO SUMAR_PROMEDIO
;
;OBTUVIMOS LA SUMA EN DATO3, DATO4, AHORA HACEMOS EL PROMEDIO DIVIDIENDO POR LA CANTIDAD DE MUESTRAS OBTENIDAS EL RESULTADO EN DATO
;
CLRF FUNC3
BSF STATUS,RP1 ;BANCO 2
MOVFW prom_pos
BCF STATUS,RP1 ;BANCO 0
MOVWF FUNC4
CALL DIVISION
;
;CHEQUEAMOS SI HAY NEGATIVOS.
;
PROM_NEG BTFSC estado,0 ;¿HAY DATOS NEGATIVOS?
GOTO DATOS_NEGATIVOS ;SI HAY
ANT_DESCOMPONER ;NO HAY
BSF estado,3 ;NO. AJUSTAMOS LA VARIABLE ESTADO
MOVFW DATO4
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
GOTO HUMEDAD
;
DATOS_NEGATIVOS
BSF STATUS,RP0
BSF STATUS,RP1 ;BANCO 3
MOVFW prom_neg
BCF STATUS,RP0 ;BANCO 0
BCF STATUS,RP1
MOVWF prom_neg_alt
BSF STATUS,RP0
BSF STATUS,RP1 ;BANCO 3
MOVFW dir2
MOVWF FSR
MOVFW INDF
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF DATO3
BSF STATUS,RP0
BSF STATUS,RP1
INCF FSR,F
MOVFW INDF
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF DATO4
BSF STATUS,RP0
BSF STATUS,RP1
INCF FSR,F
MOVFW FSR
MOVWF dir2
;
SUMAR_PROMEDIO_NEG
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
MOVFW dir2
MOVWF FSR
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
MOVWF DATO1
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
INCF FSR,F
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
MOVWF DATO2
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
INCF FSR,F
MOVFW FSR
MOVWF dir2
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
CALL D_addF
DECFSZ prom_neg_alt,F
GOTO SUMAR_PROMEDIO_NEG
;
;OBTUVIMOS LA SUMA EN DATO3, DATO4, AHORA HACEMOS EL PROMEDIO DIVIDIENDO POR LA CANTIDAD DE MUESTRAS OBTENIDAS EL RESULTADO EN DATO
;
CLRF FUNC3
BSF STATUS,RP1
BSF STATUS,RP0 ;BANCO 3
MOVFW prom_neg
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
MOVWF FUNC4
CALL DIVISION
;
;EL ÚLTIMO PASO ES CHEQUEAR QUE SI HAY POSITIVOS Y NEGATIVOS A RESTAR. EN ESTA PARTE NO SABEMOS SI HAY DE LOS DOS O UNO SOLO.
;
PROM_NEG_A BTFSC estado,1 ;¿HAY POSITIVOS?
GOTO RESTAR_AMBOS ;SI, HAY QUE RESTAR POSITIVOS - NEGATIVOS.
MOVFW DATO4 ;NO, GUARDAMOS LOS DATOS EN LA RAM PARA SER ENVIADO A LA ESTACIÓN RECEPTORA
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
BCF estado,3 ;LA TEMPERATURA ES NEGATIVA. NO OLVIDAR DE ENVIAR ESTE DATO A LA ESTACIÓN RECEPTORA.
GOTO HUMEDAD ;SENSAMOS LA HUMEDAD.
;
;------------------------------------------------------------------
;RESTAMOS LOS POSITIVOS CON NEGATIVOS. EL RESULTADO QUEDA EN DATO3, DATO4 Y HAY QUE PASARLO
;SEGÚN EL VALOR, SI ES POSITIVO O NEGATIVO (positivo O negativo). Y LUEGO MOSTRARLO AL LCD.
;------------------------------------------------------------------
;
RESTAR_AMBOS
MOVFW positivoBA
MOVWF DATO4
MOVFW positivoAL
MOVWF DATO3
MOVFW negativoBA
MOVWF DATO2
MOVFW negativoAL
MOVWF DATO1
CALL RESTA
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO PROMEDIO_NEGATIVO
BSF estado,3 ;LA TEMPERATURA ES POSITIVA. NO OLVIDAR DE ENVIAR ESTE DATO A LA ESTACIÓN RECEPTORA.
MOVFW DATO4
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
GOTO HUMEDAD
;
PROMEDIO_NEGATIVO ;INVIERTO LOS DATOS PORQUE EL RESULTADO ES NEGATIVO
MOVFW positivoBA ;POR ENDE, VOLVEMOS HACER LA RESTA PARA QUE NOS DEA
MOVWF DATO2 ;EL RESULTADO CORRECTO.
MOVFW positivoAL
MOVWF DATO1
MOVFW negativoBA
MOVWF DATO4
MOVFW negativoAL
MOVWF DATO3
CALL RESTA
BCF estado,3 ;LA TEMPERATURA ES NEGATIVA. NO OLVIDAR DE ENVIAR ESTE DATO A LA ESTACIÓN RECEPTORA.
MOVFW DATO4
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
;VAMOS A SENSAR HUMEDAD
Censado de la humedad.
;**********************************************************************
;MEDIMOS LA HUMEDAD.
;------------------
;PASOS A SEGUIR.
;
;1- CONFIGURAR EL ADC Y TRISB
;2- MEDIR EL ADC DE LA HUMEDAD Y GUARDAMOS EL VALOR EN RAM
; TENEMOS QUE APLICAR LA FÓRMULA SIGUIENTE PARA OBTENER LA HUMEDAD HR = (Vout - 0,8) / 0,031
;3- PARA ELLO, DEVEMOS MULTIPLICAR EL ADC POR 196 PARA PASARLO A TENSIÓN (EN REALIDAD DEBERÍA SER 195 PERO CON ESTE, EL ERROR ES MAS GRANDE).
;4- LUEGO LO VOLVEMOS A MULTIPLICAR POR 1.000 PARA TRABAJAR CON LA SIGUIENTE FÓRMULA HR = (Vout - 800) / 31
;5- APLICAMOS LA FORMULA HR = (Vout - 800) / 31,
;5- EL RESULTADO LO DIVIDIMOS POR 10.000 PARA OBETENER LA HUMEDAD RELATIVA EN 2 DÍGITOS (O 1.000 PARA OBTENER 3 DÍGITOS, ANALIZAMOS MAS ADELANTE ESTO)
;6- LO GUARDAMOS EN LA RAM
;7- TOMAMOS 42 MUESTRAS
;8- HACEMOS EL PROMEDIO, PARA ELLO SUMAMOS LAS 42 MUESTRAS ENTRE SI Y LUEGO LA DIVIDIMOS POR 42
;9- EL RESULTADO DEL PROMEDIO LO GUARDAMOS EN LA RAM humedad
;10- SENSAMOS EL VIENTO.
;**********************************************************************
;
HUMEDAD CALL BORRO_MEMOB2 ;BORRO EL BANCO 2 DE LA RAM PARA ALMACENAR LAS 42 MUESTRAS DE LA HUMEDAD.
CALL AJUS_MEMO
MOVLW .42 ;TOMAMOS 42 MUESTRAS
MOVWF muestras
ADQ_HUMEDAD BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO 1
MOVLW B'00001100'
MOVWF TRISA ;RA2 y RA3 COMO ENTRADA, DEMÁS SALIDAS
MOVLW B'00000000' ;+VREF VSS, ALINEACIÓN A LA IZQUIERDA Y PORTA TODAS ANALÓGICAS.
MOVWF ADCON1 ;Y LO PASO AL ADCON1
BCF STATUS,RP0 ;BANCO 0
MOVLW B'10010001' ;ADC ENC. CANAL AN2. FREC Fosc/32
MOVWF ADCON0 ;Y LO PASO AL ADCON0
BCF PIR1,ADIF ;INDICO QUE LA CONVERSIÓN NO ESTÁ ECHA
NOP ;PARA ESTABILIZAR
CALL ADQUISICIÓN ;COMIENZO LA CONVERSIÓN
;-----------------------------------------------------------
;PASAMOS LA CONVERSIÓN A LA MEMORIA RAM. TRABAJAMOS CON 8 BITS Y LO MULTIPLICAMOS POR 196. EL RESULTADO EN DATO
;-----------------------------------------------------------
MOVFW ADRESH
MOVWF multiplicadorBA ;PASAMOS EL RESULTADO DE LA CONVERSIÓN A MULPLICADOR PARA MULTIPLICARLO POR 196
CLRF multiplicadorAL
MOVLW .196
MOVWF DATO4 ;MENOS SIGNIFICATIVO
CLRF DATO3
CALL MULTIPLICAR ;MULTIPLICAMOS Y OBTUVIMOS UN RESULTADO DE 24 BIT EN DATO2, DATO3, DATO4 (MENOS SIGNIFICATIVO)
;------------------------------------------------------------
;MULTIPLICAMOS POR 1.000 PARA PODER TRABAJAR CON LA FÓRMULA. EL RESULTADO EN DATO.
;------------------------------------------------------------
MOVLW H'03'
MOVWF multiplicadorAL
MOVLW H'E8'
MOVWF multiplicadorBA
CALL MULTIPLICAR
;------------------------------------------------------------
;APLICAMOS LA FÓRMULA HR = (Vout - 800) / 31
;------------------------------------------------------------
;PRIMERO RESTAMOS EL RESULTADO ANTERIOR - 800. COMO YA TENEMOS CARGADO EL RESULTADO A RESTAR EN DATO, SOLO CARGAMOS 800 EN FUNC Y EL RESULTADO ESTA EN RES
;------------------------------------------------------------
MOVLW H'20'
MOVWF FUNC4
MOVLW H'03'
MOVWF FUNC3
CLRF FUNC2
CLRF FUNC1
CALL RESTA2
;-------------------------------------------------------------
;CON EL RESULTADO EN RES, LO PASAMOS A DATO Y EL DIVISOR (31) LO CARGAMOS EN TEMP. EL RESULTADO EN DATO
;-------------------------------------------------------------
MOVFW RES1
MOVWF DATO1
MOVFW RES2
MOVWF DATO2
MOVFW RES3
MOVWF DATO3
MOVFW RES4
MOVWF DATO4
MOVLW .31
MOVWF FUNC4
CLRF FUNC3
CALL DIVISION
;------------------------------------------------------------
;EL RESULTADO ANTERIOR, LO DIVIDIMOS POR 10.000 Y EL RESULTADO LO TENEMOS EN DATO
;------------------------------------------------------------
MOVLW H'27'
MOVWF FUNC3
MOVLW H'10'
MOVWF FUNC4
CALL DIVISION
;--------------------------------------------------------------------------------------------------------------------------
;YA TENEMOS LA HUMEDAD EN DOS DÍGITOS. AHORA LO GUARDAMOS EN LA RAM HASTA TOMAR LAS 42 MUESTRAS.
;--------------------------------------------------------------------------------------------------------------------------
BCF STATUS,RP0 ;ES POSITIVO
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1 ;DIRECCIÓN A APUNTAR
MOVWF FSR ;APUNTAMOS
BCF STATUS,RP1 ;BANCO 0
MOVFW RESDIV4 ;RECUPERO EL RESULTADO MAS SIGNIFICATIVO
BSF STATUS,RP1 ;BANCO 2
MOVWF INDF ;GUARDAMOS EL DATO EN LA POCICIÓN APUNTADA EN FSR
INCF FSR,F ;INCREMENTAMOS EL FSR PARA GUARDAR EL RESULTADOS MENOS SIGNIFICATIVO
MOVFW FSR ;PASAMOS EL DATO A W
MOVWF dir1 ;Y LO SALVAMOS PARA SU POSTERIOR USO
BCF STATUS,RP1 ;BANCO 0
MUESTRAS_HUMEDAD
DECFSZ muestras,F
GOTO ADQ_HUMEDAD
CALL AJUS_MEMO
;
;DATOS HUMEDAD, LOS SUMAMOS Y EL RESULTADO ESTÁ EN DATO3, DATO4
;
BCF STATUS,RP0 ;
BCF STATUS,RP1 ;BANCO 0
CLRF DATO3
CLRF DATO1
MOVLW .42
MOVWF prom_pos_alt ;PARA SABER CUANTAS VECES HAY QUE SUMARLAS, PARA LUEGO DIVIDIRLAS.
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1
MOVWF FSR ;DIRECCIÓN A LEER
MOVFW INDF ;EL VALOR EN FSR SE GUARDA EN W
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO4
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW FSR
MOVWF dir1
;
PROMEDIO_HUMEDAD
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1
MOVWF FSR
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO2
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW FSR
MOVWF dir1
BCF STATUS,RP1 ;BANCO 0
CALL D_addF
DECFSZ prom_pos_alt,F
GOTO PROMEDIO_HUMEDAD
;
;OBTUVIMOS LA SUMA EN DATO3, DATO4, AHORA HACEMOS EL PROMEDIO DIVIDIENDO POR LA CANTIDAD DE MUESTRAS OBTENIDAS
;
CLRF FUNC3
BSF STATUS,RP1 ;BANCO 2
MOVLW .42
BCF STATUS,RP1 ;BANCO 0
MOVWF FUNC4
CALL DIVISION
;--------------------------------------------------------------------------------------------------
;EL RESULTADO LO GUARDO EN LA RAM PARA SER ENVIADA AL RECEPTOR.
;--------------------------------------------------------------------------------------------------
NEG_HUM MOVFW DATO4
MOVWF humedad
GOTO VIENTO
;**************************************************************************************************
VIENTO
Veamos ahora la parte de las rutinas.
;
;************************************************************************************
;
;AUTOR: LEO D. PERSI
;FECHA: 16/12/2008
;
;WEB: WWW.METEOROLOGIAFACIL.COM.AR
;
;LIBRERÍA: MULTIPLICA UN NÚMERO DE 8 BIT POR UN NÚMERO DE 16 BIT.
; EL RESULTADO ES UN NÚMERO DE 24BIT
;
;SE NECESITA:
; LIBRES EN LA RAM PARA:
;
; DATO3 ;RESULTADO MENOS SIGNIFICATIVO
; DATO2 ;RESULTADO
; DATO1 ;RESULTADO MÁS SIGNIFICATIVO
;
; multiplicador ;NÚMERO QUE MULTIPLICA
;
; resBA ;AUXILIAR
; resAL ;AUXILIAR
;
;PASOS A SEGUIR:
;
;1- CARGAR EL PRIMER NÚMERO EN MRESULT1
;2- CARGAR EL SEGUNDO NÚMERO EN MRESULT2
;3- CARGAR EL NÚMERO MULTIPLICADOR EN MULTIPLICADOR
;4- LLAMAR A LA RUTINA MULTIPLICAR
;5- RETORNA CON EL RESULTADO CARGADO EN MRESUL3, MRESUL2, MRESUL1
;
;NOTA: ESTA RUTINA ES CONMUTATIVA SI SE UTILIZA PARA MULTIPLICAR DOS NÚMEROS DE 8 BIT
;
;*************************************************************************************
MULTIPLICAR CLRF DATO2
CLRF DATO1
MOVFW DATO4
MOVWF resBA
MOVFW DATO3
MOVWF resAL
MOVLW .0
XORWF multiplicadorBA,W
BTFSC STATUS,Z ;¿ES CERO?, SI MULTIPLICADORBA ES 0, CHEQUEAMOS LA PARTE ALTA, SI ES CERO TAMBIÉN EL RESULTADO TAMBIÉN LOS ES (X*0=0)
GOTO M23D ;SI
M2A DECFSZ multiplicadorBA,F
GOTO M1A
MOVLW .0
XORWF multiplicadorAL,W
BTFSC STATUS,Z
RETURN
M1A MOVFW resBA ;PASO A W EL VALOR A SUMAR A SI MISMO
ADDWF DATO4,F ;Y LO SUMO A mresul1
BTFSS STATUS,C ;¿ACARREO?
GOTO M22D ;NO,
MOVLW .1 ;SI
ADDWF DATO3,F
BTFSS STATUS,C
GOTO M22D ;NO
MOVLW .1 ;SI
ADDWF DATO2,F ;SUMO 1 A DATO2
BTFSS STATUS,C
GOTO M22D
MOVLW .1
ADDWF DATO1,F
M22D MOVFW resAL
ADDWF DATO3,F
BTFSS STATUS,C ;¿ACARREO?
GOTO M22C ;NO
MOVLW .1 ;SI
ADDWF DATO2,F ;
BTFSS STATUS,C
GOTO M22C
MOVLW .1
ADDWF DATO1,F
M22C MOVLW .0
XORWF multiplicadorBA,W
BTFSS STATUS,Z ;¿ES CERO?
GOTO M2A ;NO, NOS FALTA DECREMENTAR LA PARTE BAJA
MOVLW .0
XORWF multiplicadorAL,W
BTFSC STATUS,Z
RETURN
M2B DECF multiplicadorAL,F
GOTO M2A
M23D MOVLW .0
XORWF multiplicadorAL,W
BTFSS STATUS,Z ;¿ES CERO?
GOTO M2A ;NO, REALIZO LA MULTIPLICACIÓN.
CLRF DATO4 ;SI. BORRO EL RESULTADO PORQUE EL MULTIPLICADOR ES 0.
CLRF DATO3
RETURN ;EL RESULTADO ES CERO.
;
;------------------------------------------
;RUTINA PARA DIVIDIR UN VALOR DE 32 BIT POR UN VALOR DE 32 BITS.
;------------------------------------------
;
;------------------------------------------
;AUTOR: DESCONOCIDO RE-EDITADO POR Leo D. Persi.
;
;FECHA: 25/04/09 ARGENTINA
;
;www.meteorologiafacil.com.ar
;------------------------------------------
;QUE SE NECESITA
;------------------------------------------
;* 9 pociciones en la RAM.
;
;DATO1 ;MÁS SIGNIFICATIVO.
;DATO2
;DATO3
;DATO4 ;MENOS SIGNIFICATIVO.
;
;FUNC3 ;MAS SIGNIFICATIVO
;FUNC4 ;MENOS SIGNIFICATIVO.
;
;TEMP2 ;VARIABLE AUXILIAR
;TEMP3 ;RESTO MÁS SIGNIFICATIVO
;TEMP4 ;RESTO MENOS SIGNIFICATIVO
;------------------------------------------
;MODO DE USO.
;------------------------------------------
;1- CARGAR EL DIVISOR EN FUNC
;2- CARGAR EL DIVIDENDO EN DATO
;3- LLAMAR A DIVISION
;4- EL RESULTADO ESTÁ EN DATO
;
;NOTA: LA DIVISIÓN ES DATO / FUNC = DATO
;
DIVISION
CLRF TEMP3
CLRF TEMP4
MOVLW d'32'
MOVWF TEMP2
Div_1
RLF DATO4,w
RLF DATO3,f
RLF DATO2,f
RLF DATO1,f
RLF FUNC4,f
RLF FUNC3,f
RLF DATO4,f
MOVF FUNC3,W
SUBWF TEMP4,F
MOVF FUNC4,W
BTFSS STATUS,C
INCFSZ FUNC4,W
SUBWF TEMP3,F
BTFSC STATUS,C
BSF DATO4,0
BTFSC DATO4,0
GOTO Div_2
ADDWF TEMP3,F
MOVF FUNC3,W
ADDWF TEMP4,F
Div_2
DECFSZ TEMP2,F
GOTO Div_1
RETURN
;
; Variables a definir en la RAM
;CARRY EQU .32
;DATO1 EQU .33 ; dato 1 (8 bits + significativos)
;DATO2 EQU .34 ;
;DATO3 EQU .35 ;
;DATO4 EQU .36 ; dato 1 (8 bits - significativos)
;FUNC1 EQU .37 ; dato 2 (8 bits + significativos)
;FUNC2 EQU .38 ;
;FUNC3 EQU .39 ;
;FUNC4 EQU .40 ; dato 2 (8 bits - significativos)
;RES1 EQU .41 ; resultado (8 bits + significativos)
;RES2 EQU .42 ;
;RES3 EQU .43 ;
;RES4 EQU .44 ; resultado (8 bits - significativos)
;.............................................................................
;Para saber si el valor es negativo chequear el bit C del registro STATUS
;Si es 0, el valor es negativo, si es 1 el valor es positivo.
;
;NOTA, cuando el valor es negativo, no da el resultado correcto.
;
;la fórmula es DATO - FUNC = RES
;
RESTA2 ;32 - 32
clrf CARRY
comf DATO4,W
addwf FUNC4,W
movwf RES4
btfsc STATUS,C
incfsz FUNC3,F
goto IOP1
incfsz FUNC2,F
goto IOP1
incfsz FUNC1,F
goto IOP1
bsf CARRY,0
IOP1
comf DATO3,W
addwf FUNC3,W
movwf RES3
btfsc STATUS,C
incfsz FUNC2,F
goto IOP2
incfsz FUNC1,F
goto IOP2
bsf CARRY,0
IOP2
comf DATO2,W
addwf FUNC2,W
movwf RES2
btfsc STATUS,C
incfsz FUNC1,F
goto IOP3
bsf CARRY,0
IOP3
comf DATO1,W
addwf FUNC1,W
movwf RES1
btfsc STATUS,C
bsf CARRY,0
;
bcf STATUS,C
btfss CARRY,0
bsf STATUS,C
comf RES4,F
comf RES3,F
comf RES2,F
comf RES1,F
return
;
;******************************************************************************************
;
;Rutina para RESTAR y SUMAR dos número de 16 bit obteniendo como resultado otro númerod e 16 bit
;
;******************************************************************************************
;------------------------------------------------------------------------------------------
;SE NECESITA:
; 4 POCICIONES DE RAM PARA:
; ACCaHI---->DATO1
; ACCaLO---->DATO2
; ACCbHI---->DATO3
; ACCbLO---->DATO4
;
;NOTA: para saber si el resultado es negativo, chequear el bit C del registro STATUS.
; si es 1, el resultado es POSITIVO, y si es 0, el resultado es NEGATIVO.
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
;Para RESTAR: (ACCb - ACCa = ACCb)(DATO3,DATO4 - DATO1,DATO2)
;
;1- CARGAR EL MINUENDO EN ACCbLO Y ACCbHI
;2- CARGAR EL SUBTRAENDO EN ACCaLO Y ACCaHI
;3- LLAMAR A LA SUBRUTINA RESTA
;4- EL RESULTADO ESTÁ EN ACCbLO Y ACCbHI
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
;Para SUMAR:
;
;1- CARGAR EL PRIMER NÚMERO EN ACCaLO Y ACCaHI
;2- CARGAR EL SEGUNDO NÚMERO EN ACCbLO Y ACCbHI
;3- LLAMAR A LA SUBRUTINA D_add
;4- EL RESULTADO ESTÁ EN ACCbLO Y ACCbHI
;-------------------------------------------------------------------------------------------
;
RESTA call neg_A1 ; At first negate ACCa; Then add (DATO3,DATO4 - DATO1,DATO2 = DATO3,DATO4)
D_addF movf DATO2,W
addwf DATO4, F ; add lsb
btfsc STATUS,C ; add in carry
incf DATO3, F
movf DATO1,W
addwf DATO3, F ; add msb
retlw 0
neg_A1 comf DATO2, F ; negate ACCa ( -ACCa -> ACCa )
incf DATO2, F
btfsc STATUS,Z
decf DATO1, F
comf DATO1, F
RETLW 0
;
ADQUISICIÓN BSF ADCON0,GO ;INICIO LA CONVERSIÓN
CAD BTFSC ADCON0,GO ;¿TERMINÓ LA CONVERSIÓN?
GOTO CAD ;NO, VUELVO A CAD
RETURN
;
VALOR_POSITIVO
MOVLW H'8C'
MOVWF poeslcd
CALL PO_ES_LCD
MOVLW ' '
CALL LCD_DATO
RETURN
;
VALOR_NEGATIVO
MOVLW H'8C'
MOVWF poeslcd
CALL PO_ES_LCD
MOVLW '-'
CALL LCD_DATO
RETURN
;
;********************************************************************************
;RUTINA PARA AJUSTAR DESDE DONDE SE EMPIEZA A GRABAR O LEER LOS DATOS ALMACENADOS.
;no se ajusta el bit de direccionamiento indirecto.
;********************************************************************************
AJUS_MEMO MOVLW H'69' ;dir1
MOVWF FSR
MOVLW H'10' ;dir1 = 10
MOVWF INDF
MOVLW H'E9' ;dir2
MOVWF FSR
MOVLW H'90' ;dir2 = 90
MOVWF INDF
RETURN
;********************************************************************************
;RUTINA PARA BORRAR LAS VARIABLES DONDE SE ALOJARÁN LAS MUESTRAS DEL BANCO 2 INCLUYE EL REGISTRO ESTADO
;********************************************************************************
BORRO_MEMOB2
BCF STATUS,RP0
BSF STATUS,RP1 ;BANCO 2
CLRF prom_pos
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
CLRF estado ;BORRAMOS EL REGISTRO ESTADO
MOVLW .84
MOVWF muestras ;CARGAMOS CON 42 A MUESTRAS (EN REALIDAD ES 84 POR QUE CADA MUESTRA OCUPA DOS POCICIONES)
BSF STATUS,IRP ;DIRECCIONAMIENTO INDIRECTO BANCO 2,3
MOVLW H'10'
MOVWF FSR ;DIRECCIÓN A APUNTAR
REP_POS CLRF INDF ;BORRO LA POCICIÓN APUNTADA
INCF FSR,F
DECFSZ muestras,F ;¿ES CERO?
GOTO REP_POS ;NO
RETURN ;SI, RETORNAMOS
;********************************************************************************
;RUTINA PARA BORRAR LAS VARIABLES DONDE SE ALOJARÁN LAS MUESTRAS DEL BANCO 2 NO INCLUYE EL REGISTRO ESTADO.
;********************************************************************************
BORRO_MEMOB3
BSF STATUS,RP0
BSF STATUS,RP1 ;BANCO 3
CLRF prom_neg
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
MOVLW .84
MOVWF muestras ;CARGAMOS CON 42 A MUESTRAS (EN REALIDAD ES 84 POR QUE CADA MUESTRA OCUPA DOS POCICIONES)
BSF STATUS,IRP ;DIRECCIONAMIENTO INDIRECTO BANCO 2,3
MOVLW H'90'
MOVWF FSR
REP_NEG CLRF INDF
INCF FSR,F
DECFSZ muestras,F ;¿ES CERO?
GOTO REP_NEG ;NO
CALL AJUS_MEMO ;SI, AJUSTAMOS DESDE DONDE SE EMPIEZA A GRABAR LOS DATOS.
RETURN
Breve explicación.
El programa es cíclico. Primero empieza a cansar la temperatura, para ello, toma 42 muestras en total, que según la temperatura ambiente, podrán ser, 42 muestras temperaturas negativas, 42 muestras temperatura positivas, o 42 muestras entre temperaturas negativas y positivas. Si la temperatura en negativa, la guarda en el banco 3 de la RAM, y si es positiva, lo guarda en el banco 2 de la RAM. Para el primer caso, solo negativas, una vez tomado las 42 muestras, las suma a todas y la divide por 42 luego lo guarda en la RAM temperaturaAL; temperaturaBA mas un registro llamado "estado" (no confundir con STATUS), este último nos informará si la temperatura guardada en temperatura (AL y BA) es negativo o positivo.
Lo mismo hace con las 42 muestras positivas. En el tercer caso, temperaturas negativas y positivas, primero suma las positivas y hace el promedio, lo guarda en la RAM. Luego suma las negativas y hace le promedio y lo guarda en la RAM. Después de esto, resta ambos promedios y de acuerdo al resultado, nos quedará si es negativo o positivo y también lo guarda en temperatura (AL y BA) para ser trasmitido a la estación receptora.
Una vez censado la temperatura, censamos la humedad. Tomamos 42 muestras y se lo guarda en el banco 2. Por cada muestra, lo pasamos a volt, multiplicado por 196, al resultado lo multiplicamos por 1.000, para poder aplicar la fórmula HR = (Vout - 800) / 31, así que, último resultado, le restamos 800 y luego o dividimos por 31. Y tenemos la HR pero con múchos dígitos, asi que, lo dividimos por 10.000 para quedarnos con dos dígitos y lo guardamos en la RAM. Hacemos esto 42 veces como dije antes. Una vez tomado las 42 muestras, hacemos el promedio, para ello, sumamos las 42 muestras y la dividimos por 42, el resultado lo guardamos en "humedad" para ser enviado para el transmisor.
Los datos serán transmitidos al receptor cuando hallamos terminado de censar todos los parámetros. Una vez terminado de transmitir, volvemos a medir todo de nuevo.
Ustedes se preguntarán, ¿por qué no guardar los datos directo del CAD y al final de todo solo aplicar la fórmula solo una sola vez? porque entre muestras y muestras, se consume un tiempo. Este tiempo, lo tomamos como ventaja. Supongamos que en el momento de haber medido el sensor, justo hubo ruido eléctrico, este ruido eléctrico nos afectará en la medición dándonos errores en la medición. Si midiera una tras otro, lo que va a suceder es que censo ese mismo ruido eléctrico una y otra vez dándome un error muy grande en la medición, pero como tardo entre una medición y otra, este ruido eléctrico, habrá terminado y censamos los valores correctos. ;)
Lamentablemente aún, no he podido comprar el sensor de humedad para hacer la prueba, pero para matar el tiempo inactivo, decidí hacer algo indispensable para la estación automática, el abrigo meteorológico (http://www.meteorologiafacil.com.ar/foros/index.php?topic=89.0)
La razón porque lo puse aparte, es para que quede todo ordenado así, si alguien busca un tema en especial, no se tiene que leer todo este tema (que ya es largo). :\
Como hace rato que no coloco novedades de mi estación, les comento que ya compré el sensor pero aún no logré hacer las pruebas. Esto se debe que, mientras esperaba comprar el sensor, modifiqué de nuevo la estación de la manera que va a quedar finalizada.
Me explico, en realidad voy hacer la estación automática y que en forma inalámbrica me pase los datos a un receptor que tendré dentro de mi casa colgado en la pared, y haré un segundo receptor para enviar los datos a internet, si es que no logro hacerlo todo junto desde el primer receptor. Esto lo veré más adelante.
Estoy trabado en una parte que justamente es la comunicación asincrónica de los dos dispositivos, el transmisor (Tx) que estará ubicado en la estación automática recaudando datos y la estación receptora (Rx) que me visualizará por medio de un LCD de 20 caracteres por dos líneas que rescaté de un fax.
No logro comunicar los dos pic entre ellos. Al parecer el Tx envía los datos pero el Rx no los recibe. El chiste de todo esto es que por ahora los dispositivos están conectado físicamente por medio de un cable y como no dispongo de un osciloscopio no tengo forma de ver si la trama es enviada desde Tx a Rx.
Una vez que logre comunicar los dos dispositivos, haré la prueba por medio de RF y si anda todo bien, ya monto la estación automática enviándome los datos de temperatura, humedad y precipitación hasta tanto realice el resto de los sensores.
Hola David, como andas, estas usando interrupcion para detectar los datos?,
Te comento algunos cosas a tener en cuenta, aunque seguro lo conoces bien.
habilitaste la recepcion continua, CREN: bit4 del RCSTA
habilitaste la puerta serie SPEN: bit7 del RCSTA
Tenes bien el valor del Baud Rate,
Configuraste el pin como entrdada.
Bueno espero haberte ayudado en algo.
Yo tambien hace tiempo no escribo nada, pero creo que para la semana que viene voy a estar poniendo algo del anemometro, y despues tengo pensado (lo estoy preparando en realidad :)) un detalle de los circuitos y programas.
Un abrazo.
Lo voy a chequear porque otra cosa no me queda por hacer. :( :(
Bueno, algo e avanzado pero no he logrado una comunicación completa. El problema viene que el datasheet hay un error de las configuraciones del modo de alta velocidad y baja velocidad, los valores decimales que hay que cargar con el generador de baudios. Al parecer, cuando uno selecciona a que velocidad de transmisión desea hacerlo, se fija en la tabla para ajustar los valores correctos. Si uno desea transmitirlo a alta velocidad la tabla está mal y me parece que la tabla de baja velocidad está mal también.
Ahora voy hacer un pequeña comprobación enviando solo un dato y me lo muestre directamente en el LCD para ver que recibe.
Hola David, yo no encuentro error P.ej. a alta velocidad BRGH =1 y Fosc 4Mhz y 9600 bps el valor segun la tabla es 25, ahora si aplicamos la formula con esos valores BR= Fosc/(16*(X+1)) esto es
4.000.000/(16*(25+1))=9615
Creo que esta bien lo que hice, no quiero confundir mas las cosas.
Pues es lo que me desconcierta a mi también.
Hace dos días que no toco la estación automática por falta de tiempo. Voy a intentar seguir hoy.
Hoy logré hacerlo andar. :\ :\ :\
Gracias a la ayuda de usuarios del foro de electrónica logré hacerlo andar.
El error estaba en que no deshabilitaba el módulo de transmisión una vez que terminaba de transmitir y no borraba el bit OERR que indica si hubo un error. Cuando ocurre un error en la transmisión, no permite leer el registro RCSTA (al menos eso entendí en el datasheet).
Subo el código por si alguien lo necesita:
Tx
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
BSF STATUS,RP0 ;BANCO 1
CLRF TRISA
MOVLW H'FF'
MOVWF TRISB
CLRF TRISC
CLRF TRISD
CLRF TRISE
MOVLW 0x06
MOVWF ADCON1
BSF TRISC,7
;
;INICIALIZACIÓN DEL MÓDULO USART
;
BSF TXSTA,BRGH
MOVLW .25
MOVWF SPBRG
BCF TXSTA,SYNC
BCF STATUS,RP0 ;BANCO 0
BSF RCSTA,SPEN
;
;ACTIVACIÓN DEL MÓDULO USART
;
TRANSMITIR BSF STATUS,RP0 ;BANCO 1
BSF TXSTA,TXEN
;
;ENVÍO DE DATOS AL USART
;
BCF STATUS,RP0 ;BANCO 0
REPETIR MOVFW PORTB
MOVWF TXREG
BSF STATUS,RP0 ;BANCO 1
ESPERAR BTFSS TXSTA,TRMT ;¿SE VACIÓ EL REGISTRO TSR?
GOTO ESPERAR ;NO, ESPERAMOS PARA ELLO
BCF TXSTA,TXEN ;DESHABILITO LA TRANSMISIÓN
BCF STATUS,RP0 ;BANCO 0
GOTO TRANSMITIR
Rx
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
BSF STATUS,RP0 ;BANCO 1
CLRF TRISA
CLRF TRISB
CLRF TRISC
CLRF TRISD
CLRF TRISE
MOVLW 0x06
MOVWF ADCON1
BSF TRISC,6
BSF TRISC,7
;
;INICIALIZACIÓN DEL MÓDULO USART
;
BSF TXSTA,BRGH
MOVLW .25
MOVWF SPBRG
BCF TXSTA,SYNC ;ASINCRONO
BCF STATUS,RP0 ;BANCO 0
BSF RCSTA,SPEN
;
;ACTIVACIÓN DEL MÓDULO USART
;
BSF RCSTA,CREN
;
;RECEPCIÓN DE DATOS DEL USART
;
NO_RECIBIDO BTFSS PIR1,RCIF
GOTO NO_RECIBIDO
MOVFW RCREG
MOVWF PORTA
BCF RCSTA,OERR
BCF RCSTA,CREN ;DESHABILITO LA RECEPCIÓN
NOP ;PARA ESTABILIZAR.
BSF RCSTA,CREN ;HABILITO LA RECEPCIÓN
GOTO NO_RECIBIDO
Ahora puedo continuar con mi estación automática :\
Me alegro que hayas podido destrabar el problema, y que eso te permita continuar.
Hola Ricardo. Tengo un pequeño problema y ya me trabé y no se como continuar.
Para medir la presión, voy a utiliza el sensor MPX201.
Ya despejé la fórmula para obtener la presión y que es P = Vout - Voff / sensibilidad.
Dónde:
P = presión.
Vout = es la tensión de salida del sensor.
Voff = es la tensión de offset y que según el datasheet, para el sensor utilizado es 20 mV (típico)
Sensibilidad = es la variación de la tensión de salida con la presión y que según el datasheet es de 0,3mV/Kpa pero la voy a actualizar a Hpa.
El problema que tengo, es que no logro encontrar la forma de hacer la corrección por temperatura. Tu, ¿cómo lo has echo?
Para variar, siempre me explico de una forma compleja (por no decir complicada e inentendible) y ahora que lo vuelvo a leer me doy cuenta que di la mitad de la información.
En realidad, encontré la fórmula pero no entiendo como utilizarla.
La fórmula está un poco confusa y no me cierra su uso:
EDITO: El archivo adjunto quedó dañado en la última mudanza del foro y se perdió.
No logro entender como despejaron la fórmula >:( ya que yo la despejé y me da de otra manera.
La fórmula que el datasheet expone es:
TCVFSS = (VFSS / T) x (1 / VFSS [25°c])
Al despejar la fórmula para obtener VFSS me da lo siguiente:
VFSS = TCVFSS x VFSS[25°c] x T
La T es la temperatura, dato conocido por el sensor de temperatura.
VFSS[25°C] es la tensión que entrega a full escala a máxima presión que puede sensar, o sea a 200Kpa VFSS = 60mV
TCVFSS es el coeficiente de temperatura que es otro dato conocido dado por el datasheet y es igual a -0.19%/°C
Lo que más me desconcierta, es que reemplazando los valores, no me da lo que le da en el datasheet, aún usando su fórmula. Me explico, la fórmula que ellos despejaron, reemplazaron los valores y muestran un resultado, pues no me da igual.
Hola David, por ahora no me complique mucho con las formulas, use el -0.19%/ºc, y 25ºc como base, osea que 26ºc la salida del sensor va a ser 0.19% menos y asi sucesivamente.
Me entedes
Ok Ricardo. Te voy hacer caso porque sino, no lo termino.
El tema va hacer para valores inferiores a 25°C, o para ese caso, ¿en vez de restarle debería sumarle la salida?
Por ejemplo, para valores positivos de temperatura. Tomando como referencia lo que me dices, 0,19% y 25°C hago una simple regla de 3. Veamos para un caso de 30°C temperatura del aire y la presión entregada por el sensor es de 1030,4Hpa.
Y = (30°C x 0,19%) / 25°C donde Y es el porcentaje que debo restarle a la presión obtenida.
Y = 0,228%
Pr = Ps - [(Ps x Y) / 100%] donde Pr es la presión real; Ps es la presión entregada por el sensor; Y es el porcentaje que varía
Pr = 1030,4 Hpa - [(1030,4Hpa x 0,228%) / 100%]
Pr = 1028,05Hpa
Veamos un ejemplo para valores inferiores a 25°C
T = -10°C Ps = 1010,9Hpa
Y = [-10°C x 0,19%) / 25°C
Y = -0,076%
Pr = Ps - [(Ps x Y) / 100%]
Pr = 1010,9Hpa - [(1010,9Hpa x 0,076%) / 100%
Pr = 1011,66Hpa
¿Es así como debo hacerlo?
Hola David, yo lo implemente asi:
al valor que me da conversor le aplico lo siguiente:
1.0019^(25-temp actual)
si la temp es 25 el valor seria 25-25=0 Y 1.0019^0 =1 Y
1* el valor digital queda igual.
Si fuera 26º el calculo seria 25-26 = -1
1.0019^-1= .9981 esto se lo aplico a la salida digital
osea voy a tener un valor inferior, ya que la variacion es inversa.
Si la temp fuera 24º seria 25 - 24=1
1.0019^1 = 1.0019 esto se lo aplico al valor digital osea voy a tener un valor mayor
en 0.19%.
Espero haberlo explicado bien, sino observame lo que no entiendas.
Gracias Ricber.
Hay algo que no entiendo, el siguiente símbolo ^ ¿Qué significa? porque para mi significa que lo eleve, o sea, 2x2x2=8 = 2^3=8
Hola, si es asi, es elevar, aunque hay otras forma que tambien se pueden usar.
el tema es asi:
supongamos que la salida del ad sea 100mv a 25º si bajara a 22 serian (3º de diferencia.)
podriamos hacer
100*1.0019=100,19 a 24º
100.19 * 1.0019 = 100.38 a 23º
100.38*1.0019 = 100.57 a 22º
tambien lo puedes hacer ((0.0019*3)+1)*100=100.57
o tambien
100*(1.0019^3)=100.57
como te resulte mas facil de implementar, los 3 casos dan igual.
Para temp mayores los valores serian menores de 100mv p.ej
100*(1.0019^-3)=99.43
O ((.0019*-3)+1)*100=99.43
Ahora si te entendí.
Muchas gracias. Voy a analizarlo bien detenidamente y luego te muestro como lo voy a implementar según mejor me convenga en ASM :P
Algo que me olvidé de consultarte, tu error en porcentaje por temperatura ¿es de 1,0019%/°C?
Hola David, el error por temperatura va a depender, me parece, del error del sensor de temp., porque si el sensor tiene un error p.ej cuando hay 13º me dice que hay 14º estariamos corrgiendo el sensor de presion sobre la base de 14º. (los valores estan un poco exagerados).
Un abrazo
No, no me entendiste la temperatura o yo no ten entiendo a ti.
Al principio creía que había entendido, pero cuando estuve mirando más detalladamente y de donde sale cada cosa, no entiendo esto:
100*1.0019=100,19 a 24º
100.19 * 1.0019 = 100.38 a 23º
100.38*1.0019 = 100.57 a 22º
con esto:
((0.0019*3)+1)*100=100.57
Lo que está en negrita me produce confusión. Entiendo el procedimiento para tratar el error por temperatura, pero no entiendo porque en una fórmula se utiliza 1,0019 y en otra 0,0019
Hola David, en esta formula
((0.0019*3)+1)*100=100.57
tambien se le suma 1, (en negrita y cursiva) lo que pasa es que primero juntamos la variacion de la temperatura y despues le sumamos el 1.
Pero para que te sea mas facil entender, supongamos que en vez de 3º de variacion fuera 1º el calculo seria
((0.0019*1)+1)*100=100.19, resolviendo el parentesis quedaria 1.0019 que despues lo multiplicamos por 100 en este ejemplo.
Se entiende?
Muchas gracias Ricber, ahora si se de donde sale cada cosa.
Entendía la diferencia de temperatura y como implementarlo pero no me cerraba porqué en un lado era 0,0019 y en otro 1,0019. Ahora entendí eso.
:\
EDITO: Opte por la siguiente fórmula ((0,19 * Dt) + 1) * V = Vr
donde Dt es la diferencia de temperatura a 25°C
V es la tensión obtenida en el CAD del PIC
Vr es la tensión real con corrección de temperatura.
Gracias de nuevo.
Hola amigos,
Quiero compartir con Uds. el proyecto que estoy elaborando y por el que descubrí este foro. Antes de continuar con el proyecto les quiero comentar que mi formación académica es en el ámbito informático y no electrónico, por lo tanto el desarrollo de la Estación meteorológica automática fue encarado como medio de aprender el uso de microcontroladores. Además del desafío de aprender el uso y programación de los microcontroladores, quiero desarrollar este dispositivo para que el mismo reporte sus datos a través del sistema de radioaficionados conocido como APRS (la radio, mi otra afición).
La premisa del proyecto es que los costos no sean elevados, es por este motivo que cada sensor (dentro de lo posible) lo desarrollo en forma artesanal y con elementos recuperados.
La idea es que mida:
• Temperatura exterior (lm35)
• Velocidad del viento (anemómetro de copas – Sensor óptico/mecánico)
• Dirección del viento ( Veleta de 8 posiciones sensores ópticos/mecánicos)
• Humedad (Todavía no implementado pero será del tipo HIH-3610 o lo que se consiga )
• Presión (Todavía no implementado pero será un MPX4115 de Motorola ya que está compensado por temperatura)
• Sensor de lluvia.(circuito impreso con dos pistas entrelazadas muy próximas, en fabricación)
• Pluviómetro (de doble cazoleta basculante con sensor óptico/mecánico o reed switch/imán en desarrollo)
Como les contaba estoy tratando de utilizar la mayor parte de los materiales accesibles y/o reciclados, por ejemplo algunos de los sensores ópticos son recuperados de fotocopiadoras viejas (Gracias a mi amigo Warner que es servicio técnico de Minolta), las copas del anemómetro se realizaron con "maracas" de cotillón cortadas al medio, utilicé caños de 60 mm de desagües, etc.
Como computadora central uso un PIC de Microtrol 16f877A, que posee entradas digitales y analógicas lo que me evita el uso de conversores A/D los cuales son onerosos. Para mostrar los valores he colocado un display LCD de 16 caracteres por 2 líneas. La comunicación con la PC se realiza a través del puerto serie RS-232. El lenguaje de programación con el que he comenzado es PicBasic Pro 2.5 dado que no quería incorporar mas problemas, pero luego lo mudaré a C.
Construcción del Anemómetro:
Me decidí por un anemómetro del tipo de copas (o cazoletas) por su simplicidad constructiva. Las 3 copas separadas 120 grados una de otra moverán una rueda con 24 perforaciones (recuperada de una fotocopiadora) y el sensor óptico (también recuperado) con 24 perforaciones harán que el PIC cuente 24 pulsos/vuelta. Para facilitar la rotación del sistema de copas utilicé el rodamiento y anclaje de una disquetera de 5 ¼ abandonada hace mucho tiempo, estos rodamientos de alta precisión permiten el giro de las copas minimizando el rozamiento. El muestreo se realiza en 1 segundo, las velocidades se promedian (debo modificar el soft para que promedien en 10 min. según lo que he leído) y por software guardo la ráfaga máxima y el promedio. }
Para calibrarlo utilicé el sistema del auto: un día sin viento realice el muestreo a distintas velocidades, verificadas con el GPS, este método no es muy preciso pero es el único al no disponer de un sistema patrón. No obstante las pruebas me mostraron un comportamiento lineal que me permitió encontrar una relación directa entre la velocidad y los pulsos contados, asimismo he contrastado los valores con estaciones meteorológicas de la zona y son bastante parecidos.
Tipo de los Sensores recuperados
(http://img403.imageshack.us/img403/2530/sensoresopticos.jpg)
Adaptación electrónica de los sensores ópticos
(http://img403.imageshack.us/img403/2369/adaptacionopticos.jpg)
Fotos del anemómetro finalizado:
(http://img403.imageshack.us/img403/4452/013zv.jpg)
(http://img403.imageshack.us/img403/7755/014da.jpg)
(http://img403.imageshack.us/img403/3651/024zb.jpg)
Dirección del viento. Veleta
En esta etapa he realizado una veleta utilizando 3 sensores ópticos (estos comprados) conectados con la adaptación utilizada en el anemómetro, y un disco codificado que permite obtener 8 posiciones, los que se leen en 3 entradas digitales del PIC.
En un futuro realizaré una veleta con 4 sensores para obtener 16 direcciones con el mismo sistema.
Al igual que el anemómetro se monto sobre rodamientos de disquetera de 5 ¼ recuperados.
(http://img403.imageshack.us/img403/817/veleta.jpg)
En el análisis previo surgió como posibilidad el uso de un potenciómetro de una vuelta lo que me facilitaría la lectura al necesitar sólo un cable para la obtención del dato. Probé con un potenciómetro de un control analógico de un Joystick de Play Station pero resulto muy endeble en construcción y no lo consideré muy bueno para realizar el sensor. Luego busque infructuosamente algún pote de este tipo en los comercios del ramo en mi localidad pero no conseguí ninguno que se adapte a este sistema, por lo que quedará para una etapa posterior. El modelo sería algo así
(http://img403.imageshack.us/img403/8792/pote.jpg)
Por lo tanto la implementación quedo de la siguiente manera:
(http://img403.imageshack.us/img403/5236/022il.jpg)
(http://img403.imageshack.us/img403/5305/023vj.jpg)
El conjunto Anemómetro – Veleta quedó conformado de la siguiente manera:
(http://img403.imageshack.us/img403/2732/009iu.jpg)(http://img38.imageshack.us/img38/9073/017bz.jpg)
Medición de Temperatura con LM35.
Opté por este sensor debido a su económico precio. El LM35 reacciona linealmente (o casi) entre temperaturas de -50° a 150° Celsius variando la tensión de su pata de salida en 10mV/°C por lo tanto para registrar en el rango de temperaturas ambientes (-30 °C a 50 °C) hay que realizar una adaptación en la implementación electrónica. Esta adaptación la encontré en http://www.ucontrol.com.ar/Articulos/E-S/e-s.htm#26 la que una vez realizada y calibrada resulto bastante acertada a la realidad contrastada con un termómetro de bulbo. Probado a temperaturas de 40°C y cercanas a -20°C en el Frízer.
(http://img403.imageshack.us/img403/2038/adaptacionlm35.jpg)
Según el artículo: con el circuito mostrado más arriba obtenemos lo deseado. Su implementación es muy sencilla y para tal es necesario en uso de 2 entradas análogas del PIC y la entrada de tensión de referencia para el convertidor.
Las resistencia de 1K5 y 3K3 (deben ser de 1%) proveen la tensión de referencia y con tales valores será de aproximadamente 3.5Vcc
Los diodos 1N914 le otorgan al LM35 de una tensión de masa superior a la masa real del circuito y esto es lo que nos permite medir temperaturas por debajo de 0°C.
Por el motivo anterior y considerando que la tensión que el LM35 tomará como masa puede variar con la temperatura es necesario conoces esa tensión para luego con los consiguientes cálculos matemáticos obtener la temperatura real, para conoces esa tensión de "masa" se usa la entrada AN1.
La señal de salida del LM35 es introducida al PIC por medio de AN0, entonces a esta altura ya tenemos todas las señales necesarias dentro del PIC, por lo que solo falta realizar los cálculos.
Para los mismo se hace lo siguiente:
Si AN0 > AN1
(Valor de AN0) - (Valor de AN1) = (Valor Temp.)
Si AN0 < AN1
(Valor de AN1) - (Valor de AN0) = (Valor Temp.)
Una ves obtenido Valor Temp hacemos:
(Valor Temp.) * (344 / 1023) = Temp ----------> si usamos conversor de 10 bits
(Valor Temp.) * (344 / 255 ) = Temp ----------> si usamos conversor de 8 bits
donde:
344 = tensión de referencia * 100
Entonces ya tenemos la temperatura real, solo faltaría saber si es por sobre o debajo de cero grado, para lo cual analizamos nuevamente cual de los 2 valores de entrada era el mayor:
Si AN0 > AN1 la temperatura es por sobre cero grado centígrado o sea +XX°C
Si AN0 < AN1 la temperatura es por debajo de cero grados centígrados o sea -XX°C
El sensor de temperatura quedó de la siguiente manera:
(http://img403.imageshack.us/img403/9733/018ki.jpg)
Bueno, hasta aca llegue con el informe, en un par de días continuo con la implementación de la placa del PIC y lo que llevo elaborado del software del mismo. A su vez algo que tengo funcionando en la PC para recibir los datos (en PERL sobre LINUX)
Gracias por la atención
DANIEL - LU5YBR
Espectacular Dani. Mis más sinceras felicitaciones por el trabajo.
Me encantó como quedó el anemómetro. Muy prolijo y se ve muy robusto para aguantar ráfagas de viento fuertes al igual que la veleta.
Para calcular la velocidad del viento, puedes medir las RPM y ésta, pasarla a km/h. La fórmula es, RPS x 3,14 x d = m/s
Donde
RPS = revoluciones por segundo
d = Diámetro del anemómetro en metros.
Luego, con el dato en m/s, lo multiplicas por 3,6 y te da en km/h y a su vez, lo puedes pasar en nudos u otra unidad.
Muchas gracias por compartirlo con la comunidad de meteorólogos :\ :\
Gracias David,
te comento que la dupla anemómetro/veleta en las últimas semanas han soportado vientos muy fuertes con ráfagas del orden de los 90 km/h.
Este tipo de vientos son típicos en esta época del año en la Patagonia. En cuanto al cálculo teórico de la velocidad en función de la velocidad angular lo había probado pero cuando realicé las pruebas los valores resultaban inferiores (considerablemente) a los valores medidos con el GPS, si bien la turbulencia generada por el auto al circular podía cambiar los valores encontré una relación entre los muestreos realizados y la velocidad.
Para esto tuve que hacer un programa para el PIC que contaba los pulsos y cuando presionaba un pulsador los transmitia a una Notebook, luego de una considerable cantidad de muestras (alrededor de 150) y desechando las que se encontraban excesivamente lejos de la media, calculé el coeficiente de la recta que mas se acerca a la Velocidad/pulsos.
Seguramente las desviaciones con respecto al teórico se deben a rozamientos, efectos de las cazoletas, etc.
Como dije en el informe, comparado con otras estaciones existentes en la zona los valores son comparable.
Cuando tenga otro rato sigo escribiendo sobre la placa del PIC.
Un saludo y gracias por compartir sus conocimiento, lo que se publica realmente me ha servido mucho.
Daniel
¡Qué bien!. Linda velocidad de viento ha soportado :\ :\
En cuanto al error de la velocidad angular teórico, es verdad lo que decís. De seguro el rozamiento del anemómetro, más la fuerza que se necesita para mover las coperolas (que dicho sea de paso, se suma automáticamente con el rozamiento) te está dando una velocidad muy menor.
Las coperolas, se caracterizan por generar una turbulencia muy menor con respecto a otros anemómetros por lo que optar por un instrumento así es lo mejor.
Esto es viento patagónico!!!
(http://img44.imageshack.us/img44/2723/viento1.png)(http://img44.imageshack.us/img44/8828/viento2.png)
Caida de árboles
(http://img44.imageshack.us/img44/5682/viento3.png)
Linda tempestad de tierra se ha levantado :o :o
Hola Daniel, te doy mis saludos y me sumo a los elogios de David.
Esas fotos de que lugar de la Patagonia son?
tocayo, estas en Neuquen o Zapala ? por aca tambien la semana pasada tubimos unas pequeñas brisas patagonicas.
Saludos desde un poquito mas al sur (Bariloche) 73's
Daniel.
Disculpen la tardanza en contestar, es que me hice de un finde largo y me fui al norte Neuquino (Andacollo, Huinganco, Las Ovejas, Varvargo, Termas del Domuyo) y estuve "desconectado". Las fotos son de Neuquén Capital (en Zapala vientos de 90 km/h son brisas ;D).
Daniel, cuando en Bariloche llueve o nieva en Neuquén tenemos viento... es el destino del Norpatagónico.
Cuando tenga un rato sigo subiendo el proyecto de Estación.
Saludos a la barra meteoróloga.
Daniel - Neuquén
Wow, linda "brisa" se levanta por esos lados :P
Retomando el hilo original, les quiero comentar que acabo de descubrir unos errores en la programación.
En algún momento he estado metiendo mano, y me mandé una buena metida de pata. Lamentablemente me hace volver para atrás, pero no más de un día, porque al tener todo explicado paso a paso, podré ver con más claridad las metida de pata que me mandé.
Hoy, dormido porque hace 24 horas que no duermo porque estoy trabajando, encontré de casualidad un error. El lunes que voy a estar despierto, haré las modificaciones necesarias.
También terminé la parte del sensado de la presión por lo que más adelante, compiaré el programa del censado de la presión. Solo me falta el anemómetro y la veleta para ya armarla físicamente :\ :\
Hola David, has podido implementar el calculo de la correccion por temperatura del sensor de presion.
Si. Lo he echo.
El método utilizado es el que me indicaste porque vi que era más simple y más seguro.
Luego subo el programa. Primero tengo que resolver algunas partes del programa de multiplicación porque en algún momento hice una modificación y metí la pata.
De seguro tengo que editar la fórmula utilizada en el sensor de temperatura, humedad y presión. :-\ :-\
Hace un par de años me puse a buscar en internet dispositivos para medir los parámetros meteorológicos para contruir una estación automática, entre las cosas que encontré se encuentra el ROTORVANE, que es un anemómetro con veleta "todo en uno". En si es un anemómetro de copas (caperolas, cazoletas, etc o como le quieran llamar) con una pequeña veleta en una de las copas, esto produce un desfasaje que a través de una medición desfasada 90 grados nos permite determinar aparte de la velocidad del viento la dirección del mismo.
Luego este "invento" fue patentado y ya no se consigue los detalles del diseño. Por lo tanto les dejo el link del archivo PDF de la revista donde fue publicado con el circuito correspondiente y los programas. La idea es usar el mismo principio para desarrollar uno en una estación completa. Este diseño sirve para los que quieran ahorrarse el trabajo de fabricar la veleta por separado.
El archivo lo subí a Mediafire
http://www.mediafire.com/file/k2njnwwcjzw/Rotorvane.pdf
Proyecto completo:
http://www.mediafire.com/file/nthjnemynt2/Rotovecta_030371-11.zip
Saludos
Daniel
Hola Daniel, muy interesante el articulo, ya me baje los archivos, mañana los voy a leer en detalle.
Coincido con Ricber.
Muy ingenioso la forma de medir la dirección del viento a travéz de las coperolas.
Me gustaría saber, por medio de un túnel de viento, como son las respuesta de aceleración y desaceleración ante el viento real. Me refiero claro, la sensibilidad a esta parte del sensor. Más precisamente en el momento de colocarse paralelamente y perpendicularmente al viento. Me parece ser el punto débil de este sensor, pero no lo sé.
Ricber, David,
como les decia, este ROTORVANE es ahora un producto comercial, cuya licencia es de Raymarine certificado por CSIRO (Commonwealth Scientific and Industrial Research Organisation). Esta empresa te entrega el certificado si se lo solicitás, por lo tanto calculo que ya se han hecho los estudios correspondientes.
(http://img163.imageshack.us/img163/3757/rotoranm.gif)
Saludos
Daniel
Tienes razón Daniel. Si es un producto comercial, me imagino que deben de haber tomado todos los recaudos necesarios.
Sin duda, si está certificado es por algo.
Estuve leyendo una parte y me parece algo muy complicado para hacer de forma casera.
Buen día, He hecho una Estación Meteorológica parecida a la que comentan aca, estoy en la fase de calibración. Lo que hice fue ponerla junto a una Davis Vantage Pro y posteriormente comparar ambas gráficas. Mi gráficas sostienen una correlación muy fuerte con la Davis. La de temperatura es igual, la de humedad estoy abajo entre 2-5 %. Sin embargo,mi sensor de presión, aunque también existe una correlación muy fuerte, estoy abajo por unos 9-11 mbar (lo cual es mucho). Lo que hice fue sacar una diferencia de los datos y después un promedio de las diferencias, este último dato lo sume y obtengo una curva muy similar a la de la Davis pero hay puntos de hasta 1.5 mbar de diferencia. Teniendo en cuenta que el sensor de presión en la Davis se encuentra en el monitor (interior)y no en la estación (exterior), (diferencia de unos 8-9 mts). Se puede considerar correcto mi ajuste???
Espero sus comentarios y saludos desde México.
Hola Ricardog. Bienvenido al foro.
Ten en cuenta que, la presión varía un promedio de 1milibar (hectopascal) cada 8 metros cerca de la superficie, por lo que, la diferencia de altura y la diferencia de presión, es muy parecidos, por lo que se puede decir que has calibrado muy bien el sensor de presión con respecto a la estación automática Davis.
Lo que tendrías que averiguar antes de confirmar lo que digo, es si la estación Davis Vantage Pro, te está entregando la presión a nivel de estación, a nivel del mar o nivel de superficie.
En el caso de que te esté entregando la presión a nivel superficie, entonces la calibración no está bien ya que te está dando la presión con corrección al mismo nivel que tu estación creada por ti.
No entiendo muy bien que es "Presión a Nivel de Estación" y "A nivel de Superficie"
La siguiente parte es de la hoja técnica de la Davis:
Al ingresar la altitud, es "Presión a nivel de Estación"????
Barometric Pressure.
.
.
...
For example, atmosphericpressure is greater at sea level than on a mountaintop.
To compensatefor this difference and facilitate comparison between locations with different
altitudes, atmospheric pressure is generally adjusted to the equivalent sea level
pressure. This adjusted pressure is known as barometric pressure. In reality,
the Vantage Pro2 measures atmospheric pressure. When you enter your location's
altitude in Setup Mode, the Vantage Pro2 stores the necessary offset value
to consistently translate atmospheric pressure into barometric pressure.
Barometric pressure also changes with local weather conditions, making barometric
pressure an extremely important and useful weather forecasting tool
.
.
...
CitarAl ingresar la altitud, es "Presión a nivel de Estación ????
Dependiendo de la altitud ingresada, será la presión con corrección a nivel del mar (QNH), a nivel de estación, o a nivel de estación.
Te paso explicar la diferencias y las diferentes correcciones por altitud.
Supongamos lo siguiente, tu estás en una ciudad situada a 5 metros con respecto al nivel medio del mar (QNH). Tu estación automática está situada a 9 metros con respecto a la superficie.
Si a la estación automática le ingresas la altitud 0 metros, te estará dando la presión a nivel de estación donde está situada ella, o sea, a 9 metros de la superficie terrestre y a 14 metros a nivel medio del mar (9m + 5m). Pero si le ingresas la corrección a 9 metros, te estará dando la presión a nivel de superficie. Y si le ingresas la corrección a 14 metros, te estará dando la presión a nivel medio del mar (QNH).
Entiendo que por ahora estarás un poco confundido por lo que te daré otro ejemplo para que compares y entiendas. Antes resumimos lo siguiente:
Altitud de la ciudad 5 m con respecto al QNH.
Altitud de la estación automática 9 m con respeto a la superficie de la tierra.
Bien, veamos otros ejemplo:
Altitud de la ciudad 0 m con respecto al QNH
Altitud de la estación automática 3 metros con respecto a la superficie de la tierra.
Si a la estación automática le ingresas la corrección 0 metros, te estará dando la presión a nivel de estación (3 metros de la superficie de la tierra y del QNH). Pero si le ingresas la corrección de 3 metros, te estará dando la presión QNH y a nivel de superficie, porque la ciudad está al mismo nivel que el QNH.
Un último ejemplo.
Altitud de la ciudad 0 m con respecto al QNH.
Altitud de la estación automática 0 m con respecto a la superficie de la tierra.
En este caso, la única corrección que podrás ingresar será de 0 metros y la corrección dada por la estación será a QNH, nivel de estación y nivel de superficie.
Cita de: David Met en Diciembre 12, 2009, 07:50:11 PM
Retomando el hilo original, les quiero comentar que acabo de descubrir unos errores en la programación.
En algún momento he estado metiendo mano, y me mandé una buena metida de pata. Lamentablemente me hace volver para atrás, pero no más de un día, porque al tener todo explicado paso a paso, podré ver con más claridad las metida de pata que me mandé.
Hoy, dormido porque hace 24 horas que no duermo porque estoy trabajando, encontré de casualidad un error. El lunes que voy a estar despierto, haré las modificaciones necesarias.
También terminé la parte del sensado de la presión por lo que más adelante, compiaré el programa del censado de la presión. Solo me falta el anemómetro y la veleta para ya armarla físicamente :\ :\
Vuelvo a dar un paso para atrás y gigantesco :'( :'(
EL error lo tengo porque la fórmula que coloqué para calcular la presión la estoy mal interpretando ya que no me dan los resultados esperados. Es una mala interpretación del datasheet que estoy repasando de nuevo.
En algunas horas vuelvo con las fórmulas que estoy utilizando e indico cual es mi mala interpretación.
Hola David, que sensor estas usando, si te puedo dar una mano avisame.
Saludos
Anoche estuve trabajando y la verdad que con lo dormido que estoy no tengo ganas de estar renegando con el sensor. El sensor aún no lo compré pero voy a utilizar el MPX201A.
Si mañana tengo tiempo, subo el problema que tengo y las dudas, con todas las fórmulas a utilizar.
Bueno. Ahora que ya me ordené con todo esto del foro y de la web, retomo con la estación automática.
Resulta que estoy mal interpretando mal el datasheet, más precisamente las fórmulas a utilizar.
Cuando pensaba que lo tenía echo, resultó que me estaba dando cualquier cosa. La fórmula para obtener la presión, no me da los valores que yo esperaba y aquí es donde deduge que estoy entendiendo mal las cosas.
Primero voy a copiar todas las fórmulas que estoy utilizando y sus características del sensor:
El sensor utilizado es el MX201.
Censa desde 0 a 200 kpa.
Tensión de alimentación : 0 - 3V
Voff : 20
Sensitivity: 0,30
La fórmula para obtener la tensión de salida es:
Vout = Voff + Sensitivity X P
Si reemplazamos la fórmula por los valores correspondiente, tenemos que:
Vout = 20 + 0,30 X 200 = 4060mV
Miren con atención las gráficas que presenta el datasheet:
(http://img94.imageshack.us/img94/6417/sensormx201tensinsalida.jpg)
Hola David, recien me di cuenta que andaba el foro, mañana voy a leer bien lo del sensor de presion.
Saludos
Ningún problema Ricber.
Consulta, ¿cómo lo ves ahora al foro? ¿está más rápido o igual?
Hola David,
si, se nota mas rapido, te lo iba a comentar, porque lo note enseguida.
Con respecto al sensor de presion, te faltan un parentesis, la formula queda asi:
10mv+(0.3mv/kpa * 200kpa) = 70mv (que es el valor del grafico)
El offset es de un poquito mas de 10mv (segun el grafico), estos 70mv es lo que deberia haber entre las dos salidas del sensor cuando tenga 200kpa de presion, ademas tene en cuenta que todos estos valores son a 3v de alimentacion y que cambia si cambia la alimentacion porque es ratiometrico.
aaaa, perdón, es mi culpa. Me olvidé de subir la parte donde indica la fórmula.
No obstante, muchísimas gracias. No se me había ocurrido buscarle algunos paréntesis :-[ :-[ :P :P
(http://img85.imageshack.us/img85/9259/sensorpresinfrmula.jpg)
Esto indica que no hay que fiarse 100% en el datasheet. Hay que esperar errores.
El problema es que ahora tengo que modificar mucho en el programa ya que programo en ASM y hacer una modificación así, lleva tiempo. Cabe aclarar que este será mi último programa que lo haré en ASM, me voy a pasar a CCS, C18 (que es gratuito ya que es de Microchip) Esta desición hace meses que ya lo había tomado.
Me parece lo mas acertado que te pases al C, cuando veas lo sencillo que es es en C poner la formula y que el compilador la resuelva, te va a dar un gran alivio.
Yo deje el asm hace tiempo, ya me cuesta enteder algunas cosas del asembler.
Volviendo al sensor esos mv de salida tienes que amplificarlo para llevarlo a los niveles del conversor A/D.
Cita de: Ricber en Enero 08, 2010, 09:22:51 AM
Me parece lo mas acertado que te pases al C, cuando veas lo sencillo que es es en C poner la formula y que el compilador la resuelva, te va a dar un gran alivio.
Yo deje el asm hace tiempo, ya me cuesta enteder algunas cosas del asembler.
Si, tienes razón. Ya vengo estudiando el C despacio para poder empezar con algo censillo. Quise hacer un proyecto en ASM para adentrarme bien en la programación de los PIC y es la mejor forma de entender su arquitectura.
Citar
Volviendo al sensor esos mv de salida tienes que amplificarlo para llevarlo a los niveles del conversor A/D.
Por lo que estuve viendo, no lo voy a necesitar, si haré un seguidor de tensión con un amplificador operacional para adaptar impedancias, por las dudas. Como voy a tomar muestras con el A/D de 0 a 2,5 voltios a 8 bit de resolución, cada incremento del A/D será cada 0,0097656 Voltios. Parece ser una muestra muy razonable. Tu que tienes más experiencia que yo, ¿cómo lo ves? ¿es factible?.
Ahora me tengo que ir, despues lo pienso y te comento, pero tu sensibilidad del ad es 9,7mv y la del sensor 0,3mv, fijate que tiene que cambiar mucho la presion para mover al ad, pero despues lo pienso bien y te digo.
Una vez más tienes razón. Aprovecho el Amplificador Operacional para amplificar la tensión y hacer la adaptación de impedancia.
El echo es que, 1 Kpa = 10Hpa. Por lo tanto la sensibilidad del sensor es de 0,3mv por cada 10Hpa. Pero para incrementar el A/D se necesita 9,7mV esto quiere decir que la presión tiene que variar casi 40 Hpa, para incrementar al A/D. :P
Algo asi es la cosa, lo que tienes que ver es que esos 0.3 mv se amplifiquen hasta llegar a 9,7mv, creo que es como 30 veces si no lo calcule mal.
Como la salida del sensor es diferencial se usa en estos casos los amplificadores para instrumentacion
en este link http://es.wikipedia.org/wiki/Amplificador_de_instrumentaci%C3%B3n puedes ver un ejemplo con calculo incluido. 8)
Un abrazo
Muchísimas gracias.
Estoy chequeando el link :\
Hola, me presento, soy Ivan, he leido todo el hilo entero por que lo he encontrado buscando informacion para hacerme una estacion meteorologica y realmente esta muy muy bien explicado todo con formulas y demas, sois unos cracks!
He visto que comentabais que se pasara david met a "c", yo utilizo el PicBasicPro y de momento me va genial, he hecho alguna aplicacion para mover servos de radiocontrol, y me funcionaban perfectamente.
Dejadme que opine del tema del amplificador de laboratorio:
Si el sensor da 70mV al maximo de presion, despues de regular el amplificador con una ganancia de 30, al maximo de presion tendras 2,1V a la salida del ampli, con lo que tendras que hacerte las reglas de tres, si a 2,5v (tension de referencia) en la entrada del ADC tienes un valor de 255, a 2,1v tienes un valor de 214 (214,2) y a 0,3v (los 10mV que marcan el 0) tienes un valor de 31 (30,6) por lo que de 31 a 214 es el rango de medicion de tu sensor y por lo tanto tu presion a 25º claro...
Espero no haberme equivocado... ;)
Saludos y enhorabuena por el foro!
Hola, bienvenido al foro, me alegra saber que todo esto te es util y por supuesto, no hay problema en usar el PicBasic como lenguaje de programacion.
Con respecto al sensor solo hay que lograr que la minima variacion que querramos medir se representen los 9mv que necesita el A/D, a veces los valores que ponemos son aproximados y mas que nada para entender el problema, luego habra que ajustar todo muy bien.
Un saludo...
Esta claro que los valores que pongamos son totalmente teoricos, pero tenemos que empezar con algun valor... ;)
Saludos!
Quisiera comentaros que, si tienen tiempo, me gustaria que, ya que tienen terminadas las estaciones, acaben de completar los posts relativos al anemometro, la veleta, etc... es una fuente increible de datos que vendrian genial a principiantes como yo.
Saludos!
Perfecto Dark.
De todas maneras, a mi me falta por terminar la estación, solo me falta el barometro y la veleta con el anemómetro, pero puedo ampliar más detalles de los otros censores.
Hola Dark,
Mi estacion esta avanzada pero no esta terminada, esta en una fase de prueba, porque no me gustaria publicarla completa y que luego aparezcan defectos.
Si bien la tengo adquiriendo datos (temp. presion, humedad y lluvia) todavia me falta el anemometro, y ver como se comporta por ej. los dias de lluvia fuerte con mucho viento, donde la interrupciones al micro le van a llegar de varios lados.
El tema de la veleta que puse esta completo, si tenes alguna duda con algo preguntalo que te lo aclaro.
Con respecto al anemometro es cierto que falta terminar, no he tenido tiempo, sobre todo para hacer pruebas y calibracion, ya que pienso probarlo comparando con el velocimetro del auto, y no es tan facil de hacerlo.
Un saludo.
Os agradezco el interes, es de halagar el trabajo que habeis hecho y por eso me gustaria "plagiaros" un poco los diseños etc...
Me interesa por ejemplo, el material con el que esta hecho la veleta de ricber, se ve muy buena y equilibrada. yo habia pensado utilizar tanto para el anemometro como para la veleta las barillas de fibra de vidrio o carbono que se venden para las cometas (no se si en argentina se llaman igual) ya que son extremadamente resistentes y muy ligeros, ademas, como son huecos, siempre se podra atornillar las cazoletas del anemometro, o la cola y/o punta de la veleta... ademas de rodamientos de patines "inline" ya que todo este material lo puedo encontrar en una tienda de deportes normalita.
Gracias chicos!
El cuerpo de la veleta esta hecho con tapas para caño de PVC de 65mm, ambas tapas se sostienen justamente con un aro hecho con caño de pvc de 65 mm.
El buje lo saque de una disquetera en desuso, la cola es de aluminio de 0,7mm de espesor y la varilla que la sostiene es de bronce de 4mm de diametro, te aclaro que la hice con componentes que encontre en mi casa, pero tu opcion de fibra de carbono esta excelente, aca creo que se consigue en casas de aeromodelismo y me parece que no son nada economicas.(ojo, por ahi me equivoco)
Para la construccion de disco codificado, primero lo dibuje con programa tipo cad, luego lo imprimi sobre una filmina y para darle rigidez la coloque entre medio de dos placas de plastico tranasparente.
Bueno, creo que te explique todo o casi, si me falto algo hacemelo saber, te dejo un dibujo del disco codificado talves lo quieras usar.
(http://img264.imageshack.us/img264/3216/vadecode.png)
Saludos
Gracias ricber!
Lo del tema de la codificacion, creo que voy a intentar usar un potenciometro solidario al eje de giro de la veleta, uno de esos que no tiene fin. Si veo que no hay manera de engancharlo, probare con el codigo GRAY.
Saludos y muchas gracias!!
Cita de: Ricber en Enero 08, 2010, 06:51:20 PM
Algo asi es la cosa, lo que tienes que ver es que esos 0.3 mv se amplifiquen hasta llegar a 9,7mv, creo que es como 30 veces si no lo calcule mal.
Como la salida del sensor es diferencial se usa en estos casos los amplificadores para instrumentacion
en este link http://es.wikipedia.org/wiki/Amplificador_de_instrumentaci%C3%B3n puedes ver un ejemplo con calculo incluido. 8)
Un abrazo
Cita de: David Met en Enero 08, 2010, 08:38:09 PM
Muchísimas gracias.
Estoy chequeando el link :\
Está excelente el circuito y de echo ya hacen CI con esa configuración. El más conocido es el INA114. El factor de acumulación tiene que ser de 32 ya que 32 * 0,3 = 9,6mV a solo 0,1mV de diferencia :\ :\
Una pregunta Ricber, ¿has podido conseguir este CI o has utilizado otro igual?
Recien entré a la página web de GM electrónica pero no lo tienen. Estoy tratando de entrar a la página de electrónica liniers pero no se carga la página web.
Sino me equivoco, no tengo que modificar nada del soft, ni siquiera el factor de multiplicación del ADC para poder convertirlo en voltios.
Hola David, yo estoy probando el AD620 que es muy similar, pero creo que es mas comun,
pero fijate que en este lugar esta http://www.dinastiasoft.com.ar/precios.htm figura en su lista de productos y cuesta algo de 10 dolares, el tema es saber si hay o solo esta en las listas.
Un abrazo.
Consulta aca tambien http://www.cdronline.com.ar/detalle.php3?titulo=AD620AN-LOW-POWER-INST.-AMP&rubro=12&expand=SI&articulo=---------CIL0387&perfil=&marca=&subrubro=107
aca tambien pueden tenerlo http://www.dicomse.com.ar
Muchas gracias Ricber.
Por cierto, en dinastiasoft tienen circuitos interesantes. ^-^
Si, muy interesantes los modulos inalambricos.
He tenido que cambiar la fórmula de corrección por temperatura que tan gentilmente me ha ayudado Ricber. La principal razón es porque se me complicaba mucho a la hora de implementarlo en el lenguaje ASM.
Para ello tuve que ponerme con papel y lapiz y empezar a buscar una fórmula un poco más fácil, la cual es:
(T x CT x Vout / 100) + Vout - K = Vr
Donde:
T = temperatura del aire en °C
CT = Coeficiente de temperatura y en mi caso es de 0,22 mV/°C
Vout = Tensión de salida del sensor en mV
Vr = Tensión corregida a 25°C listo para aplicar la fórmula de presión.
K = Constante. Es igual a 3,85
La principal ventaja es que es má fácil implementarla en ASM pero como gran desventaja es que no se puede usar en presiones por debajo de 300 Hpa, pero como es para medir la presión atmosférica, no me entorpece para nada.
Los mantengo informado.
Saludos.
Hola David, segun veo me parece que la vr aumenta con la temp. cuando la correccion debe ser negativa osea debe bajar al aumentar la temp.
Si no talvez entendi mal la formula, me la puedes explicar.
Saludos.
Por lo que yo entiendo de este gráfico, la salida máxima del sensor es de 70mV. Pero el rango de presión máximo que podrá medir el sensor, dependerá de la temperatura, por ejemplo, a -40°C, el sensor es capaz de medir hasta los 24 PSI o 165Kpa aproximadamente.
(http://img94.imageshack.us/img94/6417/sensormx201tensinsalida.jpg)
Para dar otro ejemplo, si la presión de la atmósfera es de 80 kpa o en su defecto 800 hpa, a 125°C, el sensor entregará 30mV, pero si es de 25°C la tensión de salida será de 35mV, o a -40°C la tensión de salida será de 40mV.
Mi fórmula que expuse, no es nada precisa y necesita ser mejorada, pero para empezar a medir algo es suficiente. Algo para destacar del gráfico es que en la parte izquierda verás que a mayor temperatura, la tensión de salida aumenta, pero pasado los 4 PSI la tensión de salida disminuye con el aumento de temperatura. La verdad que el comportamiento del sensor es muy raro.
Imagino que como no te vas a mover demasiado lejos de los 100KPa el comportamiento del sensor en su extremo mas bajo no te importa demasidao (creo yo... no?)
Saludos!
Exacto. Al sensor lo voy a utilizar solo para medir la presión atmosférica.
El rango esperado es entre los 940 hpa a 1100 hpa.
Ya he implementado la fórmula en la programación.
Es un dolor de cabeza trabajar con coma en assembler. Para eliminarlas, he tenido que multiplicar por 100 algunos resultados para trabajar correctamente.
Las pruebas, por ahora funcionaron pero la verdadera prueba estará dada con el sensor.
Ahora me toca hacer la programación para el censado del viento y termino la parte del datalogger.
Cita de: David Met en Abril 26, 2009, 10:11:56 AM
Por fin terminé de crear la etapa para censar la humedad. También cambié por completo o casi por completo el programa principal. Voy a transmitir a la etapa receptora todos los datos por medio de RF, para ello voy a utilizar los módulos TWS (http://www.alldatasheet.com/datasheet-pdf/pdf/230403/ETC/TWS-434.html) y RWS (http://www.alldatasheet.com/datasheet-pdf/pdf/230404/ETC/RWS-434.html). Esto módulos tienen un alcance de 100mts a campo abierto por lo que para mi, me alcanza y sobra.
Voy a tratar de esta tarde, subir el diagrama de flujo de la etapa transmisora. Lo que voy a subir ahora, es el programa, la parte que censo la temperatura y la humedad.
Vemos la parte de la configuración inicial y el censado de la temperatura.
INICIO BCF STATUS,RP0 ;BANCO 0
BCF STATUS,RP1 ;BANCO 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTC
CLRF PORTE
MOVLW B'10010000' ;HABILITO RB0/INT Y INTERRUPCIONES GENERALES.
MOVWF INTCON
;************************************************************************************************
;BORRO LAS POSICIONES DE MEMORIAS EN DONDE SE GUARDAN LOS DATOS SENSADOS E INICIALIZO EL LUGAR DE DÓNDE COMENZAMOS A GRABAR.
;************************************************************************************************
TEMPERATURA ;RUTINA PARA SENSAR, PROMEDIAR LAS MUESTRAS Y GUARDALAS EN LA RAM DE LA TEMPERATURA.
CALL BORRO_MEMOB2 ;LLAMO A LA RUTINA PARA BORRAR LAS POCICIONES DE MEMORIA DEL BANCO 2
CALL BORRO_MEMOB3 ;LLAMO A LA RUTINA PARA BORRAR LAS POCICIONES DE MEMORIA DEL BANCO 3
CALL AJUS_MEMO
;
;------------------------------------------------------------------------------------------------
;EMPEZAMOS LA MEDICIÓN DE TODOS LOS PARÁMETROS. PRIMERO LA TEMPERATURA, SEGUNDO LA HUMEDAD, TERCERO EL VIENTO
;CUARTO PRESIÓN. LA PRECIPITACIÓN, SE TOMA POR MEDIO DE LA INTERRUPCIÓN DE RB0. POR CADA MEDICIÓN, SE TOMA 42 MUESTRAS, SE HACE EL PROMEDIO
;Y SE GUARDA EN UNA POSICIÓN DE LA RAM PARA SU POSTERIOR TRANSMISIÓN. TERMINADO ESTE PROCESO, SE PROCEDE A SENSAR EL SIGUIENTE SENSOR.
;UNA VEZ SENSADO ESTOS PARÁMETROS, PROCEDEMOS A ENVIAR LOS DATOS A LA ESTACIÓN RECEPTORA.
;------------------------------------------------------------------------------------------------
;************************************************************************************************
;MIDO LA TEMPERATURA. TOMO 42 MUESTRAS Y LA GUARDO EN SUS RESPECTIVO LUGAR.
;************************************************************************************************
;
DATO_MUESTRAS
MOVLW .42
MOVWF muestras
;
ADQ_TEMP BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO 1
MOVLW B'00001001'
MOVWF TRISA ;RA0 y RA3 COMO ENTRADA, DEMÁS SALIDAS
MOVLW B'00000001' ;+VREF RA3, ALINEACIÓN A LA IZQUIERDA Y PORTA TODAS ANALÓGICAS.
MOVWF ADCON1 ;Y LO PASO AL ADCON1
BCF STATUS,RP0 ;BANCO 0
MOVLW B'10000001' ;ADC ENC. CANAL AN0. FREC Fosc/32
MOVWF ADCON0 ;Y LO PASO AL ADCON0
BCF PIR1,ADIF ;INDICO QUE LA CONVERSIÓN NO ESTÁ ECHA
NOP ;PARA ESTABILIZAR
CALL ADQUISICIÓN ;COMIENZO LA CONVERSIÓN
;-----------------------------------------------------------
;PASAMOS LA CONVERSIÓN A LA MEMORIA RAM. TRABAJAMOS CON 8 BITS
;-----------------------------------------------------------
MOVFW ADRESH
MOVWF DATO4
MOVWF TEMP2 ;SALVO EN TEMP1 POR SI LA RESTA ES NEGATIVO
;
ADQ_REF BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO 1
MOVLW B'00001010'
MOVWF TRISA
MOVLW B'00000001'
MOVWF ADCON1 ;+VREF RA3, ALINEACIÓN A LA IZQUIERDA Y PORTA TODAS ANALÓGICAS
BCF STATUS,RP0
MOVLW B'10001001'
MOVWF ADCON0 ;ADC ENC. CANAL AN1. FREC Fosc/32
BCF PIR1,ADIF ;INDICO QUE LA CONVERSIÓN NO ESTÁ ECHA
NOP ;PARA ESTABILIZAR
CALL ADQUISICIÓN
;-----------------------------------------------------------
;PASAMOS LA CONVERSIÓN A LA MEMORIA RAM, TRABAJAMOS CON 8 BITS
;-----------------------------------------------------------
MOVFW ADRESH
MOVWF DATO2
MOVWF TEMP4
;-----------------------------------------------------------
;RESTAMOS LOS DOS VALORES PARA QUE ME DÉ EL VALOR REAL SI EL VALOR ES NEGATIVO, LA TEMPERATURA TEMBIÉN LO ES.
;RESULTADO EN DATO4
;-----------------------------------------------------------
SUBWF DATO4,F ;RESTAMOS DATO4 - DATO2 (AL VALOR DE DATO2 AÚN LO TENEMOS CARGADOS EN W, EL RESULTADO EN DATO4
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO TEMP_NEGATIVA ;SI, LA TEMPERATURA ES NEGATIVO
BSF estado,1 ;NO. AJUSTAMOS LOS ESTADOS CORRESPONDIENTES. HAY DATOS POSITIVOS A PROMEDIAR
BSF estado,2 ;EL DATO DE AHORA ES POSITIVO.
GOTO DESCOMPONER_NÚMERO
;
TEMP_NEGATIVA
MOVFW TEMP2 ;AL SER NEGATIVO, VUELVO HACER LA RESTA PERO INVIERTIENDO
SUBWF TEMP4,W ;EL MINUENDO POR EL SUBTRAENDO, ASÍ NOS DÁ EL VALOR CORRECTO
MOVWF DATO4 ;ES POR ELLO QUE GUARDAMOS LOS DATOS EN TEMP
;PARA RESTAR INVIRTIENDO LOS VALORES Y YA NO ES NECESARIO CHEQUEAR EL
;BIT C, YA QUE SABEMOS QUE ES NEGATIVO.
;
BSF estado,0 ;HAY DATOS NEGATIVOS A PROMEDIAR
BCF estado,2 ;EL DATO DE AHORA ES NEGATIVO
;DESCOMPONER_NÚMERO
;
;-----------------------------------------------------------------
;UNA VEZ RESTADOS LAS DOS ADIQUICICIONES, MULTIPLICAMOS EL RESULTADO POR 976 ASÍ LO PASAMOS A VOLT.
;SE OBTIENE UN RESULTADO DE 24 BIT. LUEGO, LO DIVIDIMOS POR 100 PARA QUEDARNOS CON LOS VALORES DESEADOS,
;HASTA 4 DÍGITOS QUE NOS CONSUMIRÁ DOS REGISTRO DE 8 BITS.
;
;UNA VEZ ECHO ESTO,TOMAMOS 42 MUESTRAS. Y HACEMOS EL PROMEDIO. PARA ELLO, PRIMERO SUMAMOS
;TODAS LAS TEMPERATURAS, Y LUEGO LO DIVIDIMOS POR 42. ESTO NOS DA EL PROMEDIO.
;CUANDO OBTENEMOS EL PROMEDIO, LO DESCOMPONEMOS EN CENTENA, DECENA, UNIDAD Y DÉCIMO.
;
;NOTA: QUE HACER CUANDO LA TEMPERATURA ES NEGATIVA Y POSITIVA.
;SI LA TEMPERATURA ES POSITIVA, SE ALMACENAN DESDE H'110' HASTA H'168' BANCO 2
;SI LA TEMPERATURA ES NEGATIVA, SE ALMACENAN DESDE H'190' HASTA H'1E8' BANCO 3
;
;LA FORMA DE HACER EL PROMEDIO VARÍA SI TENEMOS POSITIVOS O NEGATIVOS O LOS DOS.
;1er CASO: SOLO POSITIVOS. SUMAMOS LAS 42 MUESTRAS (DOS NÚMEROS DE 8 BITS) Y LUEGO LO DIVIDIMOS POR 42
; EL RESULTADO ES EL DATO A MOSTRAR LUEGO VOLVEMOS A EMPEZAR TOMANDO DE NUEVO LAS 42 MUESTRAS
;2dO CASO: SOLO NEGATIVOS. LO TRATAMOS COMO SI FUERAN POSITIVOS Y EN EL MOMENTO DE MOSTRAR EL DATO,
; MOSTRAMOS EL SIGNO MENOS EN EL LCD.
;3er CASO: POSITIVOS Y NEGATIVOS. PRIMERO SUMAMOS LOS POSITIVOS Y HACEMOS EL PROMEDIO. LO GUARDAMOS EN LA MEMORIA
; LUEGO SUMAMOS LOS NEGATIVOS Y HACEMOS EL PROMEDIO. LO GUARDAMOS EN LA MEMORIA. PARA OBTENER EL DATO A MOSTRAR
; RESTAMOS EL PROMEDIO POSITIVO CON EL PROMEDIO NEGATIVO. DE ESTA MANERA TENEMOS 3 OPCIONES
; 1- EL PROMEDIO POSITIVO ES MAYOR QUE EL NEGATIVO, EL DATO OBTENIDO ES POSITIVO. NOS DAMOS CUENTA CHEQUEANDO EL BIT C
; 2- EL PROMEDIO POSITIVO EN MENOR QUE EL NEGATIVO, EL DATO OBTENIDO ES NEGATIVO. NOS DAMOS CUENTA CHEQUEANDO EL BIT C
; 3- EL PROMEDIO POSITIVO ES IGUAL QUE EL NEGATIVO, EL DATO OBTENIDO ES CERO.
;
;
;MULTIPLICAMOS POR 977.
;
DESCOMPONER_NÚMERO
;
MOVFW DATO4 ;EL RESULTADO ANTERIOR QUE ESTÁ EN DATO4, LO PASAMOS A MULTIPLICADOR
MOVWF multiplicadorBA
CLRF multiplicadorAL
MOVLW B'00000011'
MOVWF DATO3
MOVLW B'11010001'
MOVWF DATO4 ;MENOS SIGNIFICATIVO
CLRF DATO2
CLRF DATO1
CALL MULTIPLICAR ;MULTIPLICAMOS Y OBTUVIMOS UN RESULTADO DE 24 BIT EN DATO2, DATO3, DATO4 (MENOS SIGNIFICATIVO)
;
;...................................
;DIVIDIMOS EN 100 PARA OBTENER EL VALOR A ALMACENAR SOLO EN 4 DÍGITOS, EL RESULTADO OBTENIDO ESTA EN DATO
;...................................
;
MOVLW .100 ;DIVISOR
MOVWF FUNC4
CLRF FUNC3
CLRF DATO1 ;BORRO DATO1.
CALL DIVISION ;EL RESULTADO DE LA MULTIPLICACIÓN POR 977 LO DIVIDO POR 100, EL RESULTADO EN DATO.
;
;ANALIZAMOS SI LA TEMPERATURA ES NEGATIVA O PISITIVA
;
RES_NEG BTFSS estado,2 ;¿ES POSITIVO?
GOTO DATO_NEG ;ES NAGATIVO
;
;GUARDAMOS LOS DATOS EN EL BANCO CORRESPONDIENTE
;
;PARA POSITIVOS
;
BCF STATUS,RP0 ;ES POSITIVO
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1 ;DIRECCIÓN A APUNTAR
MOVWF FSR ;APUNTAMOS
BCF STATUS,RP1 ;BANCO 0
MOVFW RESDIV3 ;RECUPERO EL RESULTADO MAS SIGNIFICATIVO
BSF STATUS,RP1 ;BANCO 2
MOVWF INDF ;GUARDAMOS EL DATO EN LA POCICIÓN APUNTADA EN FSR
INCF FSR,F ;INCREMENTAMOS EL FSR PARA GUARDAR EL RESULTADOS MENOS SIGNIFICATIVO
BCF STATUS,RP1 ;BANCO 0
MOVFW RESDIV4 ;RECUPERO EL RESULTADO MENOS SIGNIFICATIVO
BSF STATUS,RP1 ;BANCO 2
MOVWF INDF ;PASAMOS EL VALOR A LA POCICIÓN APUNTADA EN FSR
INCF prom_pos,F ;INCREMENTO EN 1 A PROM_POS
INCF FSR,F
MOVFW FSR ;PASAMOS EL DATO A W
MOVWF dir1 ;Y LO SALVAMOS PARA SU POSTERIOR USO
BCF STATUS,RP1 ;BANCO 0
GOTO TOTAL_MUESTRAS
;
;PARA NEGATIVOS
;
DATO_NEG BSF STATUS,RP0 ;
BSF STATUS,RP1 ;BANCO 3
MOVFW dir2
MOVWF FSR
BCF STATUS,RP0
BCF STATUS,RP1
MOVFW RESDIV3
BSF STATUS,RP0
BSF STATUS,RP1
MOVWF INDF
INCF FSR,F
BCF STATUS,RP0
BCF STATUS,RP1
MOVFW RESDIV4
BSF STATUS,RP0
BSF STATUS,RP1
MOVWF INDF
INCF prom_neg,F
INCF FSR,F
MOVFW FSR
MOVWF dir2
BCF STATUS,RP0
BCF STATUS,RP1
;
TOTAL_MUESTRAS
DECFSZ muestras,F ;¿TOMÉ LAS 42 MUESTRAS?
GOTO ADQ_TEMP ;NO, SIGO MIDIENDO LA TEMPERATUA.
CALL AJUS_MEMO ;SI, DEJO INICIALIZADA LAS DIRECCIONES A APUNTAR PARA PODER PROMEDIAR LAS MUESTRAS.
;
;REALIZAMOS EL PROMEDIO
;
FIN_PROMEDIO
BTFSS estado,1 ;¿HAY VALORES POSITIVOS?
GOTO DATOS_NEGATIVOS ;NO HAY. SOLOS NEGATIVOS.
;
;DATOS POSITIVOS, LOS SUMAMOS Y EL RESULTADO ESTÁ EN DATO3, DATO4
;
BCF STATUS,RP0 ;SI HAY
BSF STATUS,RP1 ;BANCO 2
MOVFW prom_pos ;SALVAMOS LA CANTIDAD DE DATOS POSITIVOS
BCF STATUS,RP1 ;BANCO 0
MOVWF prom_pos_alt ;PARA SABER CUANTAS VECES HAY QUE SUMARLAS, PARA LUEGO DIVIDIRLAS.
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1
MOVWF FSR ;DIRECCIÓN A LEER
MOVFW INDF ;EL VALOR EN FSR SE GUARDA EN W
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO3
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F ;DIRECCIÓN A APUNTAR SEGUNDO DATO
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO4
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW FSR
MOVWF dir1
;
SUMAR_PROMEDIO
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1
MOVWF FSR
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO1
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO2
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW FSR
MOVWF dir1
BCF STATUS,RP1 ;BANCO 0
CALL D_addF
DECFSZ prom_pos_alt,F
GOTO SUMAR_PROMEDIO
;
;OBTUVIMOS LA SUMA EN DATO3, DATO4, AHORA HACEMOS EL PROMEDIO DIVIDIENDO POR LA CANTIDAD DE MUESTRAS OBTENIDAS EL RESULTADO EN DATO
;
CLRF FUNC3
BSF STATUS,RP1 ;BANCO 2
MOVFW prom_pos
BCF STATUS,RP1 ;BANCO 0
MOVWF FUNC4
CALL DIVISION
;
;CHEQUEAMOS SI HAY NEGATIVOS.
;
PROM_NEG BTFSC estado,0 ;¿HAY DATOS NEGATIVOS?
GOTO DATOS_NEGATIVOS ;SI HAY
ANT_DESCOMPONER ;NO HAY
BSF estado,3 ;NO. AJUSTAMOS LA VARIABLE ESTADO
MOVFW DATO4
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
GOTO HUMEDAD
;
DATOS_NEGATIVOS
BSF STATUS,RP0
BSF STATUS,RP1 ;BANCO 3
MOVFW prom_neg
BCF STATUS,RP0 ;BANCO 0
BCF STATUS,RP1
MOVWF prom_neg_alt
BSF STATUS,RP0
BSF STATUS,RP1 ;BANCO 3
MOVFW dir2
MOVWF FSR
MOVFW INDF
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF DATO3
BSF STATUS,RP0
BSF STATUS,RP1
INCF FSR,F
MOVFW INDF
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF DATO4
BSF STATUS,RP0
BSF STATUS,RP1
INCF FSR,F
MOVFW FSR
MOVWF dir2
;
SUMAR_PROMEDIO_NEG
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
MOVFW dir2
MOVWF FSR
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
MOVWF DATO1
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
INCF FSR,F
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
MOVWF DATO2
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
INCF FSR,F
MOVFW FSR
MOVWF dir2
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
CALL D_addF
DECFSZ prom_neg_alt,F
GOTO SUMAR_PROMEDIO_NEG
;
;OBTUVIMOS LA SUMA EN DATO3, DATO4, AHORA HACEMOS EL PROMEDIO DIVIDIENDO POR LA CANTIDAD DE MUESTRAS OBTENIDAS EL RESULTADO EN DATO
;
CLRF FUNC3
BSF STATUS,RP1
BSF STATUS,RP0 ;BANCO 3
MOVFW prom_neg
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
MOVWF FUNC4
CALL DIVISION
;
;EL ÚLTIMO PASO ES CHEQUEAR QUE SI HAY POSITIVOS Y NEGATIVOS A RESTAR. EN ESTA PARTE NO SABEMOS SI HAY DE LOS DOS O UNO SOLO.
;
PROM_NEG_A BTFSC estado,1 ;¿HAY POSITIVOS?
GOTO RESTAR_AMBOS ;SI, HAY QUE RESTAR POSITIVOS - NEGATIVOS.
MOVFW DATO4 ;NO, GUARDAMOS LOS DATOS EN LA RAM PARA SER ENVIADO A LA ESTACIÓN RECEPTORA
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
BCF estado,3 ;LA TEMPERATURA ES NEGATIVA. NO OLVIDAR DE ENVIAR ESTE DATO A LA ESTACIÓN RECEPTORA.
GOTO HUMEDAD ;SENSAMOS LA HUMEDAD.
;
;------------------------------------------------------------------
;RESTAMOS LOS POSITIVOS CON NEGATIVOS. EL RESULTADO QUEDA EN DATO3, DATO4 Y HAY QUE PASARLO
;SEGÚN EL VALOR, SI ES POSITIVO O NEGATIVO (positivo O negativo). Y LUEGO MOSTRARLO AL LCD.
;------------------------------------------------------------------
;
RESTAR_AMBOS
MOVFW positivoBA
MOVWF DATO4
MOVFW positivoAL
MOVWF DATO3
MOVFW negativoBA
MOVWF DATO2
MOVFW negativoAL
MOVWF DATO1
CALL RESTA
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO PROMEDIO_NEGATIVO
BSF estado,3 ;LA TEMPERATURA ES POSITIVA. NO OLVIDAR DE ENVIAR ESTE DATO A LA ESTACIÓN RECEPTORA.
MOVFW DATO4
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
GOTO HUMEDAD
;
PROMEDIO_NEGATIVO ;INVIERTO LOS DATOS PORQUE EL RESULTADO ES NEGATIVO
MOVFW positivoBA ;POR ENDE, VOLVEMOS HACER LA RESTA PARA QUE NOS DEA
MOVWF DATO2 ;EL RESULTADO CORRECTO.
MOVFW positivoAL
MOVWF DATO1
MOVFW negativoBA
MOVWF DATO4
MOVFW negativoAL
MOVWF DATO3
CALL RESTA
BCF estado,3 ;LA TEMPERATURA ES NEGATIVA. NO OLVIDAR DE ENVIAR ESTE DATO A LA ESTACIÓN RECEPTORA.
MOVFW DATO4
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
;VAMOS A SENSAR HUMEDAD
Hola David
Probaste èste programa midiendo temperaturas negativas?
Pudiste solucionar el tema de la fuente, o cambiaste de circuito?
No, aún no lo probé con temperaturas negativas porque no he tenido tiempo de montarlo, amén de que no compre todavía el CI que me hace una fuente común a fuente simétrica. :-\
Lo he simulado con el MPLAB y anduvo de 10.
Perfecto, yo nunca intente hacerlo pero me estan dando unas ganas barbaras.
No conozco ese integrado, ¿donde encuentro alguna nota de aplicacion?
Yo tengo algunos circuitos para lograr el mismo objetivo pero para obtener 5V. con doble polaridad, la fuente simple, deberìa tener por lo menos 20v.(poco practico)
Al LM35 lo uso con 9V. y fuente de doble polaridad con transformador ¿con que voltaje alimentas al sensor?
Al sensor LM35 lo alimento con 5 volts. En cuanto el datasheet del ICL7660 aquí puedes verla http://www.alldatasheet.com/datasheet-pdf/pdf/67436/INTERSIL/ICL7660.html
Cita de: David Met en Marzo 06, 2010, 01:45:38 PM
Al sensor LM35 lo alimento con 5 volts. En cuanto el datasheet del ICL7660 aquí puedes verla http://www.alldatasheet.com/datasheet-pdf/pdf/67436/INTERSIL/ICL7660.html
Gracias David Met!
Interesante circuito, :\ ya lo tengo archivado, voy a ver si lo consigo.
Saludos
Cita de: David Met en Marzo 05, 2010, 10:38:34 PM
No, aún no lo probé con temperaturas negativas porque no he tenido tiempo de montarlo, amén de que no compre todavía el CI que me hace una fuente común a fuente simétrica. :-\
Lo he simulado con el MPLAB y anduvo de 10.
Ya està, ya me decidì..... :baba
Si me autorizàs a probar el còdigo para la mediciòn de temp., verè como resuelvo el pasar los datos de los registros TemperaturaAL y TemperaturaBA al display.
Creo que primero configurarè donde poner el dato (tengo un LCD 2x20)
Luego tomarè el valor del registro TemperaturaAL y lo convertirè a ascii para pasarlo al LCD
Seguirè con el registro Temp.....BA y luego hare un bucle para comenzar la mediciòn nuevamente.
Corregime si estoy equivocado.
Lo que me quedò una duda con respecto a los registros ACCaHI y LO ¿En èsta version de 8 bits los cambiaste a todos por DATO1,2,3y4 o usas todos ?
Si tengo suerte, en èsta semana consigo los componentes que me faltan y ensamblo algo. ;D
Saludos
Si, puedes usarlo tranquilamente, para eso lo subí.
Te subo el código completo de nuevo. Recuerdo haberle echo una corrección pero lo que no recuerdo es si fue antes o después de subir el programa.
En cuanto a ACCaHI y LO fue reemplazado por DATO1;2;3;4
El bit 7 del registro temperaturaAL marca si la temperatura es positiva o negativa. Si es 1 es negativo, pero si es 0, es positivo.
Parte 1
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF & _WRT_OFF
ERRORLEVEL -302
;
;---------------------------------------------------------------
;VARIABLES.
;---------------------------------------------------------------
;
CBLOCK H'20'
dem1
dem2
cursor
curdisp
poeslcd
cuenta_tabla
centena ;millar por que llega hasta 1024
decena ;centena idem anterior
unidad ;decena idem anterior
decimo ;unidad idem anterior
multiplicadorAL
multiplicadorBA ;
resAL ;RESTA 1 AUXILIAR
resBA ;RESTA 2 AUXILIAR
CARRY ;
DATO1 ; dato 1 (8 bits + significativos)
DATO2 ;30
DATO3 ;
DATO4 ; dato 1 (8 bits - significativos)
FUNC1 ; dato 2 (8 bits + significativos)
FUNC2 ;
FUNC3 ;
FUNC4 ; dato 2 (8 bits - significativos)
RES1 ; resultado (8 bits + significativos)
RES2 ;
RES3 ;
RES4 ; resultado (8 bits - significativos)
TEMP1 ;
TEMP2 ;
TEMP3 ;
TEMP4 ;
PTEMP1 ;Salva temporalmente la conversión a volt del sensor de presión.
PTEMP2 ;Salva temporalmente la conversión a volt del sensor de presión.
PTEMP3 ;Salva temporalmente la conversión a volt del sensor de presión.
PTEMP4 ;Salva temporalmente la conversión a volt del sensor de presión.
PDel0 ;
PDel1 ;
PDel2 ;
muestras ;
positivoAL ;
positivoBA ;
negativoAL ;
negativoBA ;
temperaturaAL ;Salva la parte alta de la temperatura para ser mostrada en el LCD
temperaturaBA ;Salva la parte baja de la temperatura para ser mostrada en el LCD,
;no olvidar de chequear el B3 de la variable estado para saber si la temperatura en positiva o negativa.
humedad ;Salva la humedad para ser mostrada en el LCD
v_direcciónAL ;Salva la parte alta de la dirección del viento para ser mostrada en el LCD
v_direcciónBA ;Salva la parte baja de la dirección del viento para ser mostrada en el LCD
v_velocidadAL ;Salva la velocidad del viento para ser mostrada en el LCD. Parte Alta
v_velocidadBA ;Salva la velocidad del viento para ser mostrada en el LCD. Parte Baja.
precipitación ;Salva la precipitación para ser mostrada en el LCD
presiónAL ;Salva la parte alta de la presión para ser mostrada en el LCD
presiónBA ;Salva la parte baja de la presión para ser mostrada en el LCD
parámetros ;Indica a quién pertenecen los datos a transmitir viento, temperatura, etc. (se explica en la rutina TX)
dato_enviar
dato_enviar_temp
contador
cont_bit
bandera_viento ;Bandera para determinar cuando contar las RPM en un segundo.
manchester_ALTO ;Variable donde se aloja los 4 bit más significativos del código manchester
manchester_BAJO ;Variable donde se aloja los 4 bit menos significativos del código manchester
ENDC
;
;******************************************
;BLOQUE DE MEMORIA ACCESIBLE DE TODOS LOS BANCOS 70h A 7Fh.
;******************************************
;
CBLOCK H'70'
SALVAR_W ;SALVA EL CONTENIDO DE W EN UN INTERRUPCIÓN
SALVAR_STATUS ;SALVA EL CONTENIDO DE STATUS EN UNA INTERRUPCIÓN
SALVAR_FSR ;SALVA EL CONTENIDO DE FSR EN UNA INTERRUPCIÓN
SALVAR_PCLATH ;SALVA EL CONTENIDO DE PCLATH EN UNA INTERRUPCIÓN
SALVAR_OPTION_REG ;SALVA EL CONTENIDO DE OPTION_REG EN UNA INTERRUPCIÓN
estado ;7F ESTE REGISTRO NOS PERMITE SABER SI HAY DATOS POSITIVOS Y/O NEGATIVOS PARA LA TEMPERATURA.
ENDC
;
;*****************************************************
;ESTADO:
;
;B0: 1: HAY DATOS NEGATIVOS
; 0: NO HAY DATOS NEGATIVOS
;
;B1 1: HAY DATOS POSITIVOS
; 0: NO HAY DATOS POSITIVOS
;
;B2 1: DATOS POSITIVOS
; 0: DATOS NEGATIVOS
;
;B3 1: LOS DATOS A MOSTRAR AL LCD SON POSITIVOS
; 0: LOS DATOS A MOSTRAR AL LCD SON NEGATIVOS
;
;
;
CBLOCK H'110'
positivo_AL ;110h HASTA 168h BANCO 2. PARTE ALTA DEL RESULTADO DEL PROMEDIO
positivo_BA ;PARTE BAJA DEL RESULTADO DEL PROMEDIO
ENDC
;
CBLOCK H'169' ;DIRECCIÓN A APUNTAR PARA LOS POSITIVOS
dir1
prom_pos ;CANTIDAD DE VECES A DIVIDIR PARA HACER EL PROMEDIO POSITIVOS
prom_pos_alt
ENDC
;
CBLOCK H'190'
negativo_AL ;190h HASTA 1E8h BANCO 3. PARTE ALTA DEL RESULTADO DEL PROMEDIO
negativo_BA ;PARTE BAJA DEL RESULTADO DEL PROMEDIO
ENDC
;
CBLOCK H'1E9' ;DIRECCIÓN A APUNTAR PARA LOS NEGATIVOS
dir2
prom_neg ;CANTIDAD DE VECES A DIVIDIR PARA HACER EL PROMEDIO NEGATIVO.
prom_neg_alt
ENDC
;
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIÓN
;
;************************************************************************************
;
;AUTOR: LEO D. PERSI
;FECHA: 16/12/2008
;
;WEB: www.meteorologiafacil.com.ar
;
;LIBRERÍA: MULTIPLICA UN NÚMERO DE 8 BIT POR UN NÚMERO DE 16 BIT.
; EL RESULTADO ES UN NÚMERO DE 24BIT
;
;SE NECESITA:
; LIBRES EN LA RAM PARA:
;
; DATO3 ;RESULTADO MENOS SIGNIFICATIVO
; DATO2 ;RESULTADO
; DATO1 ;RESULTADO MÁS SIGNIFICATIVO
;
; multiplicador ;NÚMERO QUE MULTIPLICA
;
; resBA ;AUXILIAR
; resAL ;AUXILIAR
;
;PASOS A SEGUIR:
;
;1- CARGAR EL PRIMER NÚMERO EN MRESULT1
;2- CARGAR EL SEGUNDO NÚMERO EN MRESULT2
;3- CARGAR EL NÚMERO MULTIPLICADOR EN MULTIPLICADOR
;4- LLAMAR A LA RUTINA MULTIPLICAR
;5- RETORNA CON EL RESULTADO CARGADO EN MRESUL3, MRESUL2, MRESUL1
;
;NOTA: ESTA RUTINA ES CONMUTATIVA SI SE UTILIZA PARA MULTIPLICAR DOS NÚMEROS DE 8 BIT
;
;DATO = DATO * MULTIPLICADOR
;*************************************************************************************
MULTIPLICAR CLRF DATO2
CLRF DATO1
MOVFW DATO4
MOVWF resBA
MOVFW DATO3
MOVWF resAL
MOVLW .0
XORWF multiplicadorBA,W
BTFSC STATUS,Z ;¿ES CERO?, SI MULTIPLICADORBA ES 0, CHEQUEAMOS LA PARTE ALTA, SI ES CERO TAMBIÉN EL RESULTADO TAMBIÉN LOS ES (X*0=0)
GOTO M23D ;SI
M2A DECFSZ multiplicadorBA,F
GOTO M1A
MOVLW .0
XORWF multiplicadorAL,W
BTFSC STATUS,Z
RETURN
M1A MOVFW resBA ;PASO A W EL VALOR A SUMAR A SI MISMO
ADDWF DATO4,F ;Y LO SUMO A mresul1
BTFSS STATUS,C ;¿ACARREO?
GOTO M22D ;NO,
MOVLW .1 ;SI
ADDWF DATO3,F
BTFSS STATUS,C
GOTO M22D ;NO
MOVLW .1 ;SI
ADDWF DATO2,F ;SUMO 1 A DATO2
BTFSS STATUS,C
GOTO M22D
MOVLW .1
ADDWF DATO1,F
M22D MOVFW resAL
ADDWF DATO3,F
BTFSS STATUS,C ;¿ACARREO?
GOTO M22C ;NO
MOVLW .1 ;SI
ADDWF DATO2,F ;
BTFSS STATUS,C
GOTO M22C
MOVLW .1
ADDWF DATO1,F
M22C MOVLW .0
XORWF multiplicadorBA,W
BTFSS STATUS,Z ;¿ES CERO?
GOTO M2A ;NO, NOS FALTA DECREMENTAR LA PARTE BAJA
MOVLW .0
XORWF multiplicadorAL,W
BTFSC STATUS,Z
RETURN
M2B DECF multiplicadorAL,F
GOTO M2A
M23D MOVLW .0
XORWF multiplicadorAL,W
BTFSS STATUS,Z ;¿ES CERO?
GOTO M2A ;NO, REALIZO LA MULTIPLICACIÓN.
CLRF DATO4 ;SI. BORRO EL RESULTADO PORQUE EL MULTIPLICADOR ES 0.
CLRF DATO3
RETURN ;EL RESULTADO ES CERO.
;
;------------------------------------------
;RUTINA PARA DIVIDIR UN VALOR DE 32 BIT POR UN VALOR DE 32 BITS.
;------------------------------------------
;
;------------------------------------------
;AUTOR: DESCONOCIDO RE-EDITADO POR Leo D. Persi.
;
;FECHA: 25/04/09 ARGENTINA
;
;www.meteorologiafacil.com.ar
;------------------------------------------
;QUE SE NECESITA
;------------------------------------------
;* 9 pociciones en la RAM.
;
;DATO1 ;MÁS SIGNIFICATIVO.
;DATO2
;DATO3
;DATO4 ;MENOS SIGNIFICATIVO.
;
;FUNC3 ;MAS SIGNIFICATIVO
;FUNC4 ;MENOS SIGNIFICATIVO.
;
;TEMP2 ;VARIABLE AUXILIAR
;TEMP3 ;RESTO MÁS SIGNIFICATIVO
;TEMP4 ;RESTO MENOS SIGNIFICATIVO
;------------------------------------------
;MODO DE USO.
;------------------------------------------
;1- CARGAR EL DIVISOR EN FUNC
;2- CARGAR EL DIVIDENDO EN DATO
;3- LLAMAR A DIVISION
;4- EL RESULTADO ESTÁ EN DATO
;
;NOTA: LA DIVISIÓN ES DATO1;2;3;4 / FUNC3;4 = DATO1;2;3;4 resto = TEMP3 Y TEMP4
;
DIVISION
CLRF TEMP3
CLRF TEMP4
MOVLW d'32'
MOVWF TEMP2
Div_1
RLF DATO4,w
RLF DATO3,f
RLF DATO2,f
RLF DATO1,f
RLF TEMP4,f
RLF TEMP3,f
RLF DATO4,f
MOVF FUNC4,w
SUBWF TEMP4,f
MOVF FUNC3,w
BTFSS STATUS,C
INCFSZ FUNC3,w
SUBWF TEMP3,f
BTFSC STATUS,C
BSF DATO4,0
BTFSC DATO4,0
GOTO Div_2
ADDWF TEMP3,f
MOVF FUNC4,w
ADDWF TEMP4,f
Div_2
DECFSZ TEMP2,f
GOTO Div_1
RETURN
;
; Variables a definir en la RAM
;CARRY EQU .32
;DATO1 EQU .33 ; dato 1 (8 bits + significativos)
;DATO2 EQU .34 ;
;DATO3 EQU .35 ;
;DATO4 EQU .36 ; dato 1 (8 bits - significativos)
;FUNC1 EQU .37 ; dato 2 (8 bits + significativos)
;FUNC2 EQU .38 ;
;FUNC3 EQU .39 ;
;FUNC4 EQU .40 ; dato 2 (8 bits - significativos)
;RES1 EQU .41 ; resultado (8 bits + significativos)
;RES2 EQU .42 ;
;RES3 EQU .43 ;
;RES4 EQU .44 ; resultado (8 bits - significativos)
;.............................................................................
;Para saber si el valor es negativo chequear el bit C del registro STATUS
;Si es 0, el valor es negativo, si es 1 el valor es positivo.
;
;NOTA, cuando el valor es negativo, no da el resultado correcto.
;
;la fórmula es DATO - FUNC = RES
;
RESTA2 ;32 - 32
clrf CARRY
comf DATO4,W
addwf FUNC4,W
movwf RES4
btfsc STATUS,C
incfsz FUNC3,F
goto IOP1
incfsz FUNC2,F
goto IOP1
incfsz FUNC1,F
goto IOP1
bsf CARRY,0
IOP1
comf DATO3,W
addwf FUNC3,W
movwf RES3
btfsc STATUS,C
incfsz FUNC2,F
goto IOP2
incfsz FUNC1,F
goto IOP2
bsf CARRY,0
IOP2
comf DATO2,W
addwf FUNC2,W
movwf RES2
btfsc STATUS,C
incfsz FUNC1,F
goto IOP3
bsf CARRY,0
IOP3
comf DATO1,W
addwf FUNC1,W
movwf RES1
btfsc STATUS,C
bsf CARRY,0
;
bcf STATUS,C
btfss CARRY,0
bsf STATUS,C
comf RES4,F
comf RES3,F
comf RES2,F
comf RES1,F
return
;
;******************************************************************************************
;
;Rutina para RESTAR y SUMAR dos número de 16 bit obteniendo como resultado otro númerod e 16 bit
;
;******************************************************************************************
;------------------------------------------------------------------------------------------
;SE NECESITA:
; 4 POCICIONES DE RAM PARA:
; ACCaHI---->DATO1
; ACCaLO---->DATO2
; ACCbHI---->DATO3
; ACCbLO---->DATO4
;
;NOTA: para saber si el resultado es negativo, chequear el bit C del registro STATUS.
; si es 1, el resultado es POSITIVO, y si es 0, el resultado es NEGATIVO.
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
;Para RESTAR: (ACCb - ACCa = ACCb)(DATO3,DATO4 - DATO1,DATO2)
;
;1- CARGAR EL MINUENDO EN ACCbLO Y ACCbHI
;2- CARGAR EL SUBTRAENDO EN ACCaLO Y ACCaHI
;3- LLAMAR A LA SUBRUTINA RESTA
;4- EL RESULTADO ESTÁ EN ACCbLO Y ACCbHI
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
;Para SUMAR:
;
;1- CARGAR EL PRIMER NÚMERO EN ACCaLO Y ACCaHI
;2- CARGAR EL SEGUNDO NÚMERO EN ACCbLO Y ACCbHI
;3- LLAMAR A LA SUBRUTINA D_add
;4- EL RESULTADO ESTÁ EN ACCbLO Y ACCbHI
;-------------------------------------------------------------------------------------------
;
RESTA call neg_A1 ; At first negate ACCa; Then add (DATO3,DATO4 - DATO1,DATO2 = DATO3,DATO4)
D_addF movf DATO2,W
addwf DATO4, F ; add lsb
btfsc STATUS,C ; add in carry
incf DATO3, F
movf DATO1,W
addwf DATO3, F ; add msb
retlw 0
neg_A1 comf DATO2, F ; negate ACCa ( -ACCa -> ACCa )
incf DATO2, F
btfsc STATUS,Z
decf DATO1, F
comf DATO1, F
RETLW 0
;
ADQUISICIÓN BSF ADCON0,GO ;INICIO LA CONVERSIÓN
CAD BTFSC ADCON0,GO ;¿TERMINÓ LA CONVERSIÓN?
GOTO CAD ;NO, VUELVO A CAD
RETURN
;
;********************************************************************************
;RUTINA PARA AJUSTAR DESDE DONDE SE EMPIEZA A GRABAR O LEER LOS DATOS ALMACENADOS.
;no se ajusta el bit de direccionamiento indirecto.
;********************************************************************************
AJUS_MEMO MOVLW H'69' ;dir1
MOVWF FSR
MOVLW H'10' ;dir1 = 10
MOVWF INDF
MOVLW H'E9' ;dir2
MOVWF FSR
MOVLW H'90' ;dir2 = 90
MOVWF INDF
RETURN
;********************************************************************************
;RUTINA PARA BORRAR LAS VARIABLES DONDE SE ALOJARÁN LAS MUESTRAS DEL BANCO 2 INCLUYE EL REGISTRO ESTADO
;********************************************************************************
BORRO_MEMOB2
BCF STATUS,RP0
BSF STATUS,RP1 ;BANCO 2
CLRF prom_pos
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
CLRF estado ;BORRAMOS EL REGISTRO ESTADO
MOVLW .84
MOVWF muestras ;CARGAMOS CON 42 A MUESTRAS (EN REALIDAD ES 84 POR QUE CADA MUESTRA OCUPA DOS POCICIONES)
BSF STATUS,IRP ;DIRECCIONAMIENTO INDIRECTO BANCO 2,3
MOVLW H'10'
MOVWF FSR ;DIRECCIÓN A APUNTAR
REP_POS CLRF INDF ;BORRO LA POCICIÓN APUNTADA
INCF FSR,F
DECFSZ muestras,F ;¿ES CERO?
GOTO REP_POS ;NO
RETURN ;SI, RETORNAMOS
;********************************************************************************
;RUTINA PARA BORRAR LAS VARIABLES DONDE SE ALOJARÁN LAS MUESTRAS DEL BANCO 2 NO INCLUYE EL REGISTRO ESTADO.
;********************************************************************************
BORRO_MEMOB3
BSF STATUS,RP0
BSF STATUS,RP1 ;BANCO 3
CLRF prom_neg
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
MOVLW .84
MOVWF muestras ;CARGAMOS CON 42 A MUESTRAS (EN REALIDAD ES 84 POR QUE CADA MUESTRA OCUPA DOS POCICIONES)
BSF STATUS,IRP ;DIRECCIONAMIENTO INDIRECTO BANCO 2,3
MOVLW H'90'
MOVWF FSR
REP_NEG CLRF INDF
INCF FSR,F
DECFSZ muestras,F ;¿ES CERO?
GOTO REP_NEG ;NO
CALL AJUS_MEMO ;SI, AJUSTAMOS DESDE DONDE SE EMPIEZA A GRABAR LOS DATOS.
RETURN
Parte 2
;
;************************************************************************************************
;CONFIGURO LOS PUERTOS COMO ENTRADA Y SALIDAS Y ACTIVO LA INTERRUPCIÓN.
;DE RB0/INT, AJUSTO TMR0 PARA CONTAR HASTA 50mS CARGANDO 60 EN TMR0.
;BORRO LAS VARIABLES DE TMR1L Y TMR1H, LA DE PRECIPITACIÓN.
;************************************************************************************************
;
INICIO BCF STATUS,RP0 ;BANCO 0
BCF STATUS,RP1 ;BANCO 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTC
CLRF PORTE
CLRF precipitación
MOVLW .60
MOVWF TMR0
MOVLW .20
MOVWF bandera_viento ;SE CUENTA HASTA DOS VECES, SI VALE 0, ES NECESARIO QUE EL TMR0 DESBORDE 2 VECES, SI VALE 1, ES NECESARIO QUE EL TMR0 DESVORDE UNA VEZ MÁS.
MOVLW B'11110000'
MOVWF INTCON ;HABILITO INTERRUPCIONES GENERALES, HABILITO INTERRUPCIONES PERIFÉRICAS, HABILITO INTERRUPCIÓN RB0/INT, HABILITO INTERRUPCIÓN TMR0.
BSF T1CON,TMR1CS ;TIMER 1 COMO CONTADOR. LOS PULSOS ENTRAN POR RC0
BSF T1CON,TMR1ON ;HABILITAMOS EL TIMER1
BSF STATUS,RP0 ;BANCO 1
MOVLW B'00000001'
MOVWF TRISB ;RBO/INT ENTRADA, DEMÁS SALIDAS
MOVLW B'11000111' ;RESISTENCIA INSTERNAS DESACTIVADAS, RB0/INT HABILITADO, TMR0 CON FRECUENCIA PIC, PREESCALER AL TMR0 A 1:256
MOVWF OPTION_REG
CLRF TRISC ;PUERTO C SALIDA.
BSF TRISC,0 ;RC0 COMO ENTRADA.
CLRF TRISD ;PUERTO D SALIDA.
CLRF TRISE ;PUERTO E SALIDA.
;************************************************************************************************
;CONFIGURO EL USART: ASINCRONO, 9200 BAUDIOS, 9 BIT DE DATOS, CON PARIDAD (SE HACE UNA SOLA VEZ Y AL PRINCIPIO DEL PROGRAMA.
;************************************************************************************************
BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO 1
BCF TRISC,6 ;SALIDA TX
BSF TXSTA,BRGH ;MODO ALTA VELOCIDAD
BSF TXSTA,TX9 ;HABILITACIÓN NOVENO BIT
MOVLW .25
MOVWF SPBRG
BCF TXSTA,SYNC
BCF STATUS,RP0 ;BANCO 0
BSF RCSTA,SPEN
;************************************************************************************************
;BORRO LAS POSICIONES DE MEMORIAS EN DONDE SE GUARDAN LOS DATOS SENSADOS E INICIALIZO EL LUGAR DE DÓNDE COMENZAMOS A GRABAR.
;************************************************************************************************
TEMPERATURA ;RUTINA PARA SENSAR, PROMEDIAR LAS MUESTRAS Y GUARDALAS EN LA RAM DE LA TEMPERATURA.
CALL BORRO_MEMOB2 ;LLAMO A LA RUTINA PARA BORRAR LAS POCICIONES DE MEMORIA DEL BANCO 2
CALL BORRO_MEMOB3 ;LLAMO A LA RUTINA PARA BORRAR LAS POCICIONES DE MEMORIA DEL BANCO 3 Y DENTRO DE ESTA RUTINA, LLAMA
;A LA RUTINA PARA AJUSTAR LA MEMORIA A UTILIZAR
;
;------------------------------------------------------------------------------------------------
;EMPEZAMOS LA MEDICIÓN DE TODOS LOS PARÁMETROS. PRIMERO LA TEMPERATURA, SEGUNDO LA HUMEDAD, TERCERO EL VIENTO
;CUARTO PRESIÓN. LA PRECIPITACIÓN, SE TOMA POR MEDIO DE LA INTERRUPCIÓN DE RB0. POR CADA MEDICIÓN, SE TOMA 42 MUESTRAS, SE HACE EL PROMEDIO
;Y SE GUARDA EN UNA POSICIÓN DE LA RAM PARA SU POSTERIOR TRANSMISIÓN. TERMINADO ESTE PROCESO, SE PROCEDE A SENSAR EL SIGUIENTE SENSOR.
;UNA VEZ SENSADO ESTOS PARÁMETROS, PROCEDEMOS A ENVIAR LOS DATOS A LA ESTACIÓN RECEPTORA.
;------------------------------------------------------------------------------------------------
;************************************************************************************************
;MIDO LA TEMPERATURA. TOMO 42 MUESTRAS Y LA GUARDO EN SUS RESPECTIVO LUGAR.
;************************************************************************************************
;
DATO_MUESTRAS
MOVLW .42
MOVWF muestras
;
ADQ_TEMP BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO 1
MOVLW B'00001001'
MOVWF TRISA ;RA0 y RA3 COMO ENTRADA, DEMÁS SALIDAS
MOVLW B'00000001' ;+VREF RA3, ALINEACIÓN A LA IZQUIERDA Y PORTA TODAS ANALÓGICAS.
MOVWF ADCON1 ;Y LO PASO AL ADCON1
BCF STATUS,RP0 ;BANCO 0
MOVLW B'10000001' ;ADC ENC. CANAL AN0. FREC Fosc/32
MOVWF ADCON0 ;Y LO PASO AL ADCON0
BCF PIR1,ADIF ;INDICO QUE LA CONVERSIÓN NO ESTÁ ECHA
NOP ;PARA ESTABILIZAR
CALL ADQUISICIÓN ;COMIENZO LA CONVERSIÓN
;-----------------------------------------------------------
;PASAMOS LA CONVERSIÓN A LA MEMORIA RAM. TRABAJAMOS CON 8 BITS
;-----------------------------------------------------------
MOVFW ADRESH
MOVWF DATO4
MOVWF TEMP2 ;SALVO EN TEMP1 POR SI LA RESTA ES NEGATIVO
;
ADQ_REF BSF STATUS,RP0
BCF STATUS,RP1 ;BANCO 1
MOVLW B'00001010'
MOVWF TRISA
MOVLW B'00000001'
MOVWF ADCON1 ;+VREF RA3, ALINEACIÓN A LA IZQUIERDA Y PORTA TODAS ANALÓGICAS
BCF STATUS,RP0
MOVLW B'10001001'
MOVWF ADCON0 ;ADC ENC. CANAL AN1. FREC Fosc/32
BCF PIR1,ADIF ;INDICO QUE LA CONVERSIÓN NO ESTÁ ECHA
NOP ;PARA ESTABILIZAR
CALL ADQUISICIÓN
;-----------------------------------------------------------
;PASAMOS LA CONVERSIÓN A LA MEMORIA RAM, TRABAJAMOS CON 8 BITS
;-----------------------------------------------------------
MOVFW ADRESH
MOVWF DATO2
MOVWF TEMP4
;-----------------------------------------------------------
;RESTAMOS LOS DOS VALORES PARA QUE ME DE EL VALOR REAL SI EL VALOR ES NEGATIVO, LA TEMPERATURA TEMBIÉN LO ES.
;RESULTADO EN DATO4
;-----------------------------------------------------------
SUBWF DATO4,F ;RESTAMOS DATO4 - DATO2 (AL VALOR DE DATO2 AÚN LO TENEMOS CARGADOS EN W, EL RESULTADO EN DATO4
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO TEMP_NEGATIVA ;SI, LA TEMPERATURA ES NEGATIVO
BSF estado,1 ;NO. AJUSTAMOS LOS ESTADOS CORRESPONDIENTES. HAY DATOS POSITIVOS A PROMEDIAR
BSF estado,2 ;EL DATO DE AHORA ES POSITIVO.
GOTO DESCOMPONER_NÚMERO
;
TEMP_NEGATIVA
MOVFW TEMP2 ;AL SER NEGATIVO, VUELVO HACER LA RESTA PERO INVIERTIENDO
SUBWF TEMP4,W ;EL MINUENDO POR EL SUBTRAENDO, ASÍ NOS DÁ EL VALOR CORRECTO
MOVWF DATO4 ;ES POR ELLO QUE GUARDAMOS LOS DATOS EN TEMP
;PARA RESTAR INVIRTIENDO LOS VALORES Y YA NO ES NECESARIO CHEQUEAR EL
;BIT C, YA QUE SABEMOS QUE ES NEGATIVO.
;
BSF estado,0 ;HAY DATOS NEGATIVOS A PROMEDIAR
BCF estado,2 ;EL DATO DE AHORA ES NEGATIVO
;DESCOMPONER_NÚMERO
;
;-----------------------------------------------------------------
;UNA VEZ RESTADOS LAS DOS ADIQUICICIONES, MULTIPLICAMOS EL RESULTADO POR 976 ASÍ LO PASAMOS A VOLT.
;SE OBTIENE UN RESULTADO DE 24 BIT. LUEGO, LO DIVIDIMOS POR 100 PARA QUEDARNOS CON LOS VALORES DESEADOS,
;HASTA 4 DÍGITOS QUE NOS CONSUMIRÁ DOS REGISTRO DE 8 BITS.
;
;UNA VEZ ECHO ESTO,TOMAMOS 42 MUESTRAS. Y HACEMOS EL PROMEDIO. PARA ELLO, PRIMERO SUMAMOS
;TODAS LAS TEMPERATURAS, Y LUEGO LO DIVIDIMOS POR 42. ESTO NOS DA EL PROMEDIO.
;CUANDO OBTENEMOS EL PROMEDIO, LO DESCOMPONEMOS EN CENTENA, DECENA, UNIDAD Y DÉCIMO.
;
;NOTA: QUE HACER CUANDO LA TEMPERATURA ES NEGATIVA Y POSITIVA.
;SI LA TEMPERATURA ES POSITIVA, SE ALMACENAN DESDE H'110' HASTA H'168' BANCO 2
;SI LA TEMPERATURA ES NEGATIVA, SE ALMACENAN DESDE H'190' HASTA H'1E8' BANCO 3
;
;LA FORMA DE HACER EL PROMEDIO VARÍA SI TENEMOS POSITIVOS O NEGATIVOS O LOS DOS.
;1er CASO: SOLO POSITIVOS. SUMAMOS LAS 42 MUESTRAS (DOS NÚMEROS DE 8 BITS) Y LUEGO LO DIVIDIMOS POR 42
; EL RESULTADO ES EL DATO A ENVIAR PARA ELLO LO GUARDAMOS EN temperaturaAL y temperaturaBA.
; EL BIT 7 DE temperaturaAL LO COLOCAMOS EN 0 PARA INDICAR QUE ES POSITIVO.
;2dO CASO: SOLO NEGATIVOS. LO TRATAMOS COMO SI FUERAN POSITIVOS LO GUARDAMOS EN EL MISMO REGISTRO QUE A LA
; TEMPERATURA POSITIVA Y COLOCAMOS A 1 EL BIT 7 DE temperaturaAL QUE NOS INDICARÁ TEMPERATURA NEGATIVA.
;3er CASO: POSITIVOS Y NEGATIVOS. PRIMERO SUMAMOS LOS POSITIVOS Y HACEMOS EL PROMEDIO. LO GUARDAMOS EN LA MEMORIA
; LUEGO SUMAMOS LOS NEGATIVOS Y HACEMOS EL PROMEDIO. LO GUARDAMOS EN LA MEMORIA. PARA OBTENER EL DATO A MOSTRAR
; RESTAMOS EL PROMEDIO POSITIVO CON EL PROMEDIO NEGATIVO. DE ESTA MANERA TENEMOS 3 OPCIONES
; 1- EL PROMEDIO POSITIVO ES MAYOR QUE EL NEGATIVO, EL DATO OBTENIDO ES POSITIVO. NOS DAMOS CUENTA CHEQUEANDO EL BIT C
; 2- EL PROMEDIO POSITIVO EN MENOR QUE EL NEGATIVO, EL DATO OBTENIDO ES NEGATIVO. NOS DAMOS CUENTA CHEQUEANDO EL BIT C
; 3- EL PROMEDIO POSITIVO ES IGUAL QUE EL NEGATIVO, EL DATO OBTENIDO ES CERO.
;
;MULTIPLICAMOS POR 977.
;...
DESCOMPONER_NÚMERO
MOVFW DATO4 ;EL RESULTADO ANTERIOR QUE ESTÁ EN DATO4, LO PASAMOS A MULTIPLICADOR
MOVWF multiplicadorBA
CLRF multiplicadorAL
MOVLW B'00000011'
MOVWF DATO3
MOVLW B'11010001'
MOVWF DATO4 ;MENOS SIGNIFICATIVO
CALL MULTIPLICAR ;MULTIPLICAMOS Y OBTUVIMOS UN RESULTADO DE 24 BIT EN DATO2, DATO3, DATO4 (MENOS SIGNIFICATIVO)
;...................................
;DIVIDIMOS EN 100 PARA OBTENER EL VALOR A ALMACENAR SOLO EN 4 DÍGITOS, EL RESULTADO OBTENIDO ESTA EN DATO = DATO / FUNC
;...................................
MOVLW .100 ;DIVISOR
MOVWF FUNC4
CLRF FUNC3
CLRF DATO1 ;BORRO DATO1.
CALL DIVISION ;EL RESULTADO DE LA MULTIPLICACIÓN POR 977 LO DIVIDO POR 100, EL RESULTADO EN DATO.
;...................................
;ANALIZAMOS SI LA TEMPERATURA ES NEGATIVA O PISITIVA
;...................................
RES_NEG BTFSS estado,2 ;¿ES POSITIVO?
GOTO DATO_NEG ;ES NAGATIVO
;...................................
;GUARDAMOS LOS DATOS EN EL BANCO CORRESPONDIENTE
;
;PARA POSITIVOS
;...................................
BCF STATUS,RP0 ;ES POSITIVO
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1 ;DIRECCIÓN A APUNTAR
MOVWF FSR ;APUNTAMOS
BCF STATUS,RP1 ;BANCO 0
MOVFW DATO3 ;RECUPERO EL RESULTADO MAS SIGNIFICATIVO
BSF STATUS,RP1 ;BANCO 2
MOVWF INDF ;GUARDAMOS EL DATO EN LA POCICIÓN APUNTADA EN FSR
INCF FSR,F ;INCREMENTAMOS EL FSR PARA GUARDAR EL RESULTADOS MENOS SIGNIFICATIVO
BCF STATUS,RP1 ;BANCO 0
MOVFW DATO4 ;RECUPERO EL RESULTADO MENOS SIGNIFICATIVO
BSF STATUS,RP1 ;BANCO 2
MOVWF INDF ;PASAMOS EL VALOR A LA POCICIÓN APUNTADA EN FSR
INCF prom_pos,F ;INCREMENTO EN 1 A PROM_POS
INCF FSR,F
MOVFW FSR ;PASAMOS EL DATO A W
MOVWF dir1 ;Y LO SALVAMOS PARA SU POSTERIOR USO
BCF STATUS,RP1 ;BANCO 0
GOTO TOTAL_MUESTRAS
;...................................
;PARA NEGATIVOS
;...................................
DATO_NEG BSF STATUS,RP0 ;
BSF STATUS,RP1 ;BANCO 3
MOVFW dir2
MOVWF FSR
BCF STATUS,RP0
BCF STATUS,RP1
MOVFW DATO3
BSF STATUS,RP0
BSF STATUS,RP1
MOVWF INDF
INCF FSR,F
BCF STATUS,RP0
BCF STATUS,RP1
MOVFW DATO4
BSF STATUS,RP0
BSF STATUS,RP1
MOVWF INDF
INCF prom_neg,F
INCF FSR,F
MOVFW FSR
MOVWF dir2
BCF STATUS,RP0
BCF STATUS,RP1
;
TOTAL_MUESTRAS
DECFSZ muestras,F ;¿TOMÉ LAS 42 MUESTRAS?
GOTO ADQ_TEMP ;NO, SIGO MIDIENDO LA TEMPERATUA.
CALL AJUS_MEMO ;SI, DEJO INICIALIZADA LAS DIRECCIONES A APUNTAR PARA PODER PROMEDIAR LAS MUESTRAS.
;..................................
;REALIZAMOS EL PROMEDIO
;..................................
FIN_PROMEDIO
BTFSS estado,1 ;¿HAY VALORES POSITIVOS?
GOTO DATOS_NEGATIVOS ;NO HAY. SOLOS NEGATIVOS.
;..................................
;DATOS POSITIVOS, LOS SUMAMOS Y EL RESULTADO ESTÁ EN DATO3, DATO4
;..................................
BCF STATUS,RP0 ;SI HAY
BSF STATUS,RP1 ;BANCO 2
MOVFW prom_pos ;SALVAMOS LA CANTIDAD DE DATOS POSITIVOS
BCF STATUS,RP1 ;BANCO 0
MOVWF prom_pos_alt ;PARA SABER CUANTAS VECES HAY QUE SUMARLAS, PARA LUEGO DIVIDIRLAS.
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1
MOVWF FSR ;DIRECCIÓN A LEER
MOVFW INDF ;EL VALOR EN FSR SE GUARDA EN W
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO3
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F ;DIRECCIÓN A APUNTAR SEGUNDO DATO
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO4
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW FSR
MOVWF dir1
;
SUMAR_PROMEDIO
BSF STATUS,RP1 ;BANCO 2
MOVFW dir1
MOVWF FSR
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO1
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
MOVWF DATO2
BSF STATUS,RP1 ;BANCO 2
INCF FSR,F
MOVFW FSR
MOVWF dir1
BCF STATUS,RP1 ;BANCO 0
CALL D_addF
DECFSZ prom_pos_alt,F
GOTO SUMAR_PROMEDIO
;...............................................
;OBTUVIMOS LA SUMA EN DATO3, DATO4, AHORA HACEMOS EL PROMEDIO DIVIDIENDO POR LA CANTIDAD DE MUESTRAS OBTENIDAS EL RESULTADO EN DATO
;...............................................
CLRF FUNC3
BSF STATUS,RP1 ;BANCO 2
MOVFW prom_pos
BCF STATUS,RP1 ;BANCO 0
MOVWF FUNC4
CALL DIVISION
MOVFW DATO4
MOVWF positivoBA ;GUARDAMOS LOS DATOS ACÁ POR SI TENEMOS QUE PROMEDIAR CON VALORES NEGATIVOS
MOVFW DATO3
MOVWF positivoAL ;IDEM ANTERIOR.
;...............................................
;CHEQUEAMOS SI HAY NEGATIVOS.
;...............................................
PROM_NEG BTFSC estado,0 ;¿HAY DATOS NEGATIVOS?
GOTO DATOS_NEGATIVOS ;SI HAY
ANT_DESCOMPONER ;NO HAY
MOVFW DATO4
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
BCF temperaturaAL,7 ;INDICA QUE LA TEMPERATURA ES POSITIVA.
GOTO HUMEDAD
;
DATOS_NEGATIVOS
BSF STATUS,RP0
BSF STATUS,RP1 ;BANCO 3
MOVFW prom_neg
BCF STATUS,RP0 ;BANCO 0
BCF STATUS,RP1
MOVWF prom_neg_alt
BSF STATUS,RP0
BSF STATUS,RP1 ;BANCO 3
MOVFW dir2
MOVWF FSR
MOVFW INDF
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF DATO3
BSF STATUS,RP0
BSF STATUS,RP1
INCF FSR,F
MOVFW INDF
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF DATO4
BSF STATUS,RP0
BSF STATUS,RP1
INCF FSR,F
MOVFW FSR
MOVWF dir2
;
SUMAR_PROMEDIO_NEG
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
MOVFW dir2
MOVWF FSR
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
MOVWF DATO1
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
INCF FSR,F
MOVFW INDF
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
MOVWF DATO2
BSF STATUS,RP1 ;BANCO 3
BSF STATUS,RP0
INCF FSR,F
MOVFW FSR
MOVWF dir2
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
CALL D_addF
DECFSZ prom_neg_alt,F
GOTO SUMAR_PROMEDIO_NEG
;...............................................
;OBTUVIMOS LA SUMA EN DATO3, DATO4, AHORA HACEMOS EL PROMEDIO DIVIDIENDO POR LA CANTIDAD DE MUESTRAS OBTENIDAS EL RESULTADO EN DATO
;...............................................
CLRF FUNC3
BSF STATUS,RP1
BSF STATUS,RP0 ;BANCO 3
MOVFW prom_neg
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
MOVWF FUNC4
CALL DIVISION
MOVFW DATO4 ;GUARDAMOS ACÁ POR SI TENEMOS QUE PROMEDIAR CON LO VALORES POSITIVOS.
MOVWF negativoBA
MOVFW DATO3
MOVWF negativoAL ;IDEM ANTERIOR.
;...............................................
;EL ÚLTIMO PASO ES CHEQUEAR QUE SI HAY POSITIVOS Y NEGATIVOS A RESTAR. EN ESTA PARTE NO SABEMOS SI HAY DE LOS DOS O UNO SOLO.
;...............................................
PROM_NEG_A BTFSC estado,1 ;¿HAY POSITIVOS?
GOTO RESTAR_AMBOS ;SI, HAY QUE RESTAR POSITIVOS - NEGATIVOS.
MOVFW DATO4 ;NO, GUARDAMOS LOS DATOS EN LA RAM PARA SER ENVIADO A LA ESTACIÓN RECEPTORA
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
BSF temperaturaAL,7 ;INDICA QUE LA TEMPERATURA ES NEGATIVA.
GOTO HUMEDAD ;SENSAMOS LA HUMEDAD.
;------------------------------------------------------------------
;RESTAMOS LOS POSITIVOS CON NEGATIVOS. EL RESULTADO QUEDA EN DATO3, DATO4 Y HAY QUE PASARLO
;SEGÚN EL VALOR, SI ES POSITIVO O NEGATIVO (positivo O negativo). Y LUEGO MOSTRARLO AL LCD.
;------------------------------------------------------------------
RESTAR_AMBOS
MOVFW positivoBA
MOVWF DATO4
MOVFW positivoAL
MOVWF DATO3
MOVFW negativoBA
MOVWF DATO2
MOVFW negativoAL
MOVWF DATO1
CALL RESTA
BTFSS STATUS,C ;¿ES NEGATIVO?
GOTO PROMEDIO_NEGATIVO
MOVFW DATO4
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
BCF temperaturaAL,7 ;INDICA QUE LA TEMPERATURA ES POSITIVA
GOTO HUMEDAD
;
PROMEDIO_NEGATIVO ;INVIERTO LOS DATOS PORQUE EL RESULTADO ES NEGATIVO
MOVFW positivoBA ;POR ENDE, VOLVEMOS HACER LA RESTA PARA QUE NOS DEA
MOVWF DATO2 ;EL RESULTADO CORRECTO.
MOVFW positivoAL
MOVWF DATO1
MOVFW negativoBA
MOVWF DATO4
MOVFW negativoAL
MOVWF DATO3
CALL RESTA
MOVFW DATO4
MOVWF temperaturaBA
MOVFW DATO3
MOVWF temperaturaAL
BSF temperaturaAL,7 ;INDICA QUE LA TEMPERATURA ES NEGATIVA.
;VAMOS A SENSAR HUMEDAD
Si hay algo que no entiendes, puedes preguntarme lo que necesites.
Gracias :\
Veo que reacomodaste todo de nuevo, cada véz te queda más pulido.
Lo voy a estudiar bien y despues te comento ok! ok!
Cuando copie y pegue el código, saque partes del software dedicados a otra cosa. Yo revisé bien antes de enviar el mensaje pero puede que halla sacado parte del código que utiliza el censado de la temperatura.
Si falta algo, avisame.
Cita de: David Met en Marzo 08, 2010, 10:50:54 AM
Cuando copie y pegue el código, saque partes del software dedicados a otra cosa. Yo revisé bien antes de enviar el mensaje pero puede que halla sacado parte del código que utiliza el censado de la temperatura.
Si falta algo, avisame.
Asimple vista creo que no falta nada.
Le voy a poner la rutina BCD , la tabla y la rutina de control del display
Lo que no consegui fue el LM35 AH (encapsulado metalico) :me callo:
Lo comercializaba Elko pero se le terminaron, y por ahora no lo piensan reponer
Espero conseguirlo pronto, seguire buscando.
Saludos
Hola, puedo sugerirles que vean este sensor de temperatura es el TC1047, lo venden aca http://www.mcelectronics.com.ar/componentes/ se puede medir de -40º a +125º y trabaja con fuente simple.
Saludos.
Cita de: Ricber en Marzo 08, 2010, 06:40:21 PM
Hola, puedo sugerirles que vean este sensor de temperatura es el TC1047, lo venden aca http://www.mcelectronics.com.ar/componentes/ se puede medir de -40º a +125º y trabaja con fuente simple.
Saludos.
Saludos Ricber!
Veo que llegaste de las vacaciones, espero las hayas pasado muy bien :\
Este sensor es el que definitivamente se deberìa usar, està hecho para los pic jajajajaja jajajajaja
Tension de alimentacion perfecta ok!
Acoplamiento de impedancia directa al A/D ok!
Rango de temperatura apropiada ok!
Tamaño muy reducido ok!
Costo increible ok!
Lugar de venta muy cerca ok!
Mañana llamo para ver si el precio es por unidad o por tonelada jajajajaja
Creo que habrà que reformularse todo el còdigo y lo que se simplificarà no tiene nombre.
Mil gracias por este dato ok! ok! ok! ok! ok! ok! ok! ok! ok! ok! ok!
Saludos!!
Hola a todos!
Bueno, ya averigué y el precio era por unidad nomas :\
El único problema es que se les acabaron...... Ayuda: Ayuda:
Y bue.... esperaremos
Y bue, no todo es posible.
Debo confesar que desconocía ese sensor, por lo que estará en mi estación V2.0 ok!
Hola, si, volvi de las vacaciones aunque el tiempo no fue bueno igual me sirvieron,
que lastima que no hay mas sensores, creo que te lo pueden importar aunque sea uno.
Preguntaste en electronica Elemon, lo tienen en el catalogo.
Me dijeron que para la semana entrante habia posibilidad que repongan stock
Voy a preguntar en Elemont aunque sea para comparar precios y después les cuento ;D
Listo ya averigue
Elemon lo tiene y a menos de un dolar :\ :\
¡menos de un dolar!
excelente precio.
Hola a todos!
Bueno ya tengo 10 de estos sensores en mi mano, los consegui :\ :\ :\
Ahora voy a conseguir un telescopio para ver las patitas a soldar jajajajaja
Dime Ricber, usaste alguna plaquita o lo soldaste directo a los cables?
Yo pienso soldarlo directo y sellarlo con fastix.
Voy a probarlo en un programita sensillo que tengo y luego les comento,
Hasta luego
primero le solde a las patitas unas alambres (de las que quedan cuando cortas resistecias) y luego le puse pegamento para fijar las alambres, luego solde los cables definitivos.
Despues lo puse dentro del tubo (ese dorado que se ve en las fotos) y lo rellene con una resina epoxi.
Al sensor lo puse lo mas afuera posible cosa que no le quede mucha resina encima porque sino ahi se generaria una resistencia termica.
Muy buena idea la de prolongar las patas, de esa manera nos aseguramos de no ejercer acción mecanica sobre el encapsulado al estar fijadas con epoxi ok!
Hola a todos!
Queria comentarles que conectè el sensor por medio de un cable mallado de unos tres metros directamente al AD de un 16F877, el programa no poseìa promediador, leìa una vez tras otra, y lo mostraba en un LCD.
El programa estaba preparado para una entrada de 0a 5V. con referencia de 5V, la lectura mìnima normal por tabla era de 000 y la màxima de 999 (no estaba preparado para èste sensor) pero el objetivo era verificar el ruido que se introducìa.
Al alimentarlo, comenzo a leer y entrego mediciones que variaban hasta 10puntos. (no le puedo decir grados porque no existìa conversion para ello) Fluctuaba de 10 a 20.
En las conexiones del sensor coloquè un capacitor ceramico de .1uF entre las patas de alimentaciòn y la oscilacion bajò a la mitàd.
Luego coloque un electrolìtico de 2.2 uF entre la salida y el negativo y se clavò justo en 15 sin variaciones.
Pensè que ya no andaba, pero cuando le arrimè la mano la medicion cambiò a 16 y al acercar el soldador siguiò subiendo.
Èste tipo de filtrado figura en la hoja de datos del LM35 y se utiliza cuando se realizan mediciones remotas.
Acà tambien funciona, y si no lo probaron, se los recomiendo.
Espero que èsta experiencia les sea ùtil.
saludos
Si, todas las experiencias son muy buena.
En mi caso no fue falta poner ningún capacitor, pero le he dejado el lugar para colocarlo si en un futuro tengo problemas.
Aunque ya lo deben saber, igual hago el comentario, todos los circuitos integrados deben llevar un cap. de .1 entre sus terminales de alimentacion, lo mas cerca posible.
Así es Ricber, así es.
Hola a todos!
Yo uso la técnica de colocarlos soldados directamente sobre las patas, lo aprendí de tanto ver placas de instrumentos industriales y algunas PC viejas
Es la mejor, directo sobre los pines
Hace rato que no coloco novedades sobre la estación que estoy armando.
Subo el esquemático para que lo estudie (el que quiere) y si encuentran algún error, por favor me avisan.
Ahora tengo que comprar los componentes que me faltan para armarlo en un protorboard para ver si funciona bien. Posterior irá en PCB.
Recaudador de datos estación meteorológica v1.0
(http://img594.imageshack.us/img594/1858/recaudadordedatosv10res.th.jpg) (http://img594.imageshack.us/i/recaudadordedatosv10res.jpg/)
Receptor estación meteorológica v1.0
(http://img691.imageshack.us/img691/9868/receptorestacinmeteorol.th.jpg) (http://img691.imageshack.us/i/receptorestacinmeteorol.jpg/)
Nota: están grandes porque para poder colocarlo en jpg tubo varias transformaciones el archivo. Lo estoy haciendo en kicad (si alguien quiere los archivos del programa, solo tiene que pedirlo y se lo paso). Para que se puedan ver bien, tuve que darle resolución grande.
Hola David, queria preguntarte,
el sensor de presion lo vas a usas con esa configuracion.
La parte que mide le transmite a la otra parte cada cierto tiempo, como manejas eso.
Me moviste el piso dudo:
El sensor de presión ¿No transmite en forma continua la tensión de censado?
Hola a todos!
Reaparecì :\
Cita de: Ricber en Mayo 03, 2010, 07:52:18 AM
Hola David, queria preguntarte,
el sensor de presion lo vas a usas con esa configuracion.
La parte que mide le transmite a la otra parte cada cierto tiempo, como manejas eso.
Si entendì bien la pregunta, en realidad serìan dos.
Con respecto al sensor de presiòn, creo entender que se trata de la configuraciòn sensor + seguidor con ganancia unidàd.
En coheterìa experimental amateur, usamos los altimetros con èstos sensores conectados en forma directa al pic sin circuitos intermedios y sin ningun problema.
El mìsmo sensor de humedad lo utilizo tambien directamente en el laboratorio derecho al pic.
Entiendo que la segunda pregunta està referida a la transmisiòn de los datos adquiridos.
Secuencialmente, se deberìa poner en el transmisor una palabra de inicio, otra para identificar a que sensor corresponden los datos que siguen, luego mandar los datos y por ,ultimo una palabra de finalizaciòn, se espera un tiempo lògico para tomar la siguiente mediciòn y se comienza con la rutina.
El receptor podrìa agregar fecha y hora en que recepciona cada inicio y hasta podrìa achicar el tiempo de muestreo si detectase algùn valor que se dispare, como ser aumentos o disminuciones de temperatura de manera brusca.
Lo que no me queda claro es que si se alimenta el transmisor y todo el adquisidor desde tierra, ¿porque no mandar los datos por cable en la misma forma en que se mandarian por radio?
La transmision por radio tendrìa mejor utilizaciòn si la central aerea fuera autònoma con celdas solares y baterìas recargables. Quizàs David , ya pensaste en eso y la dejas preparada para el futuro.
De todas maneras, el proyecto està fabuloso, dale para adelante David, mientras yo sigo haciendo el còdigo para la mìa, probè el promediador de 255 muestras y si no se requiere demasiada velocidàd de muestreo no hay con que darle.
saludos!
Re bienvenido YO
La forma de trabajar de la estación es así:
Primero censo la temperatura, obtengo 42 muestras y las promedio. El resultado lo guardo en una posición de la RAM. Luego censo la humedad tomando 42 muestras para promediarlas, y el resultado lo guardo en una posición de la RAM. Continúo con la dirección del viento. Aquí no hago promedio, leo los estados y obtengo la dirección del viento. Continúo censando la presión. Tomo 42 muestras, las promedio y lo guardo en una posición de la RAM.
Cuando termino de censar todos los parámetros, envío uno a uno los datos almacenados en la RAM. Primero envío dos valores de sincronismo y a continuación uno a uno los datos.
Aún falta explicar como censo la precipitación y la intencidad del viento. Ambos se hacen por medio de interrupciones. La precipitación es censado por medio de RB0/INT, cada vez que ocurre una interrupción debido a que hay un 1 y luego un 0 en este pin, incremento en 1 una posición de la RAM, cuando envío este dato por la USART, vuelvo a cero esta posición.
La intensidad (velocidad) del viento utilizo el pin RA4/T0CKI y con el TMR0 calculo la velocidad del viento. TMR0 cuenta hasta 1 segundo y con T0CKI incremento TMR1 que cuenta las RMP durante el segundo. Conociendo estos valores es posible saber la velocidad del viento. La velocidad del viento se guarda en una posición de la RAM para ser transmitida.
El censado de la velocidad del viento se realiza en forma ininterrumpida.
Hola, ahora esta claro el manejo de datos,
La pregunta ahora es para YO, que sensores usan en coheteria?
Hola
Cita de: Ricber en Mayo 07, 2010, 11:12:44 AM
Hola, ahora esta claro el manejo de datos,
La pregunta ahora es para YO, que sensores usan en coheteria?
Como les comentaba, en los altímetros hasta 10000 mts. se usa el MPX 5100 de MOTOROLA ( yo creo que es para algunos metros menos, pero como nunca llegamos a esa altura, no lo sabemos jejejeje)
En los altímetros hasta 30.000 mts. se utiliza el ASDX 015A24R de HONEYWELL
(No me pregunten como sensa a ésa altura porque lo desconosco, pero en EEUU es de uso común en altímetros, en casa tenemos uno montado en uno de los altímetros)
Yo diseñe un dispositivo para disparar la segunda y tercer etapa de cualquier cohete, está basado en tomar la temperatura de la tobera con una termocupla tipo K y cuando la temperatura comienza a decaer, es porque el motor principal ya no empuja, procediendo a encender en pleno vuelo el motor de la segunda etapa, uso un PIC 12f675
para controlar todo.
Se está experimentando con acelerómetros, inclinómetros, y lo que se te ocurra
Los sensores de proximidád se utilizan en las rampas y para detectar la separación positiva de las diferentes etapas, o que se produjo aberturas de escotillas o cargas de pago para experimentos atmosfericos.
Los colegios técnicos, preparan sus experimentos de atmósfera, o de aceleración o avionica, y los prueban en un proyecto llamado CANSAT, creado por la ACEMA
Para no desviarnos del tema, aunque de la atmósfera se trate, entrá acá y fijate las cosas que se hacen http:www.rocket.com.ar/
saludos!
uuuuuuuuuuuuu me encanta, me encanta. :\ :\
CitarEn los altímetros hasta 30.000 mts. se utiliza el ASDX 015A24R de HONEYWELL
(No me pregunten como sensa a ésa altura porque lo desconosco, pero en EEUU es de uso común en altímetros, en casa tenemos uno montado en uno de los altímetros)
Aún dentro de los 30km está dentro de la atmósfera terrestre y a esa altura aún hay presión atmosférica (muy muy baja pero lo hay) eso quiere decir que el altímetro es muy sensible a baja presiones.
¿Sabés cuando hacen otro lanzamiento? Ahí vi en la web que están aún anunciando el cuarto evento (que fue en el 2009). La verdad que me gustaría ir y presenciar. Siempre me gustó la cohetería.
Hola David
El 1º de MAYO se realizó una jornada que fué la primera del año a nivel experimental.
Se probó la eficacia de un rastreador GPS, siguiendo el vuelo desde tierra, y cuanto incidía el peso del mismo en la altura.
Para conocer todos los temas y las próximas fechas tendrás que registrarte en www.coheteriaamateur.com.ar (http://www.coheteriaamateur.com.ar) con todos los datos que te piden (son un poco estrictos en ese sentido) éste es el FORO y allí se habla de todos los temas y se deciden las próximas reuniones
Todavía no hay fecha para el próximo evento pero calculo que lo que sigue será una competencia de permanencia en el aire para los pibes de los colegios, luego la competencia SEÑOR para mayor tiempo de permanencia en el aire con carga útil (un huevo que no se tiene que romper en ningun momento) y quizas siga algun ensayo de CANSAT con los alumnos de escuelas técnicas en donde realicen experimentos, y por último otra jornada de alta potencia, con motores que empujan lindo.
De cualquier manera, cuando se decida una fecha te aviso.
saludos
Gracias YO. Estaré al tanto.
Hola, como estan, migre desde ucontrol, jeje. quisiera preguntar... finalmete usaron el HIH4000? podrian indicarme donde conseguirlo, estoy en Capital Federal, y si mas o menos tienen una idea del precio... tambien se agradece....!!
Saludos, excelente trabajo.
Velazquezbio
Hola Velazquezbio. Bienvenido al foro.
Yo he utilizado el sensor de humedad HIH4000. El mismo lo conseguí en GM electrónica (http://www.gmelectronica.com.ar)
Yo tambien use el HIH4000
Hola, gracias por las respuestas, dejo la info que obviamete puede ser modificada sin previo aviso.
GM ELECTRONICA HIH4000 $175
Elko Net (http://www.elkonet.com/iweb/modules.php?op=modload&name=iweb_ii) HIH4000 $90 jajajajaja
para pensarlo... =)
cual usaron?
HIH-4000-001
SENS. HUMEDAD +/- 0.2% EST +/- 3.5% EXA PASO 0.1" 20.4819 HONEYWELL SEMHO4000-1
HIH-4000-002
SENS. HUMEDAD +/- 1% EST, +/- 2% EXA (0.1" ), C/C. 31.7998 HONEYWELL SEMHO4000-2
HIH-4000-003
SENS. HUMEDAD +/- 1% EST, +/- 2% EXA (0.1" ), C/C. 30.9967 HONEYWELL SEMHO4000-3
HIH-4000-004
SENS. HUMEDAD +/- 1% EST, +/- 2% EXA (0.1" ), C/C. 31.0133 HONEYWELL SEMHO4000-4
recuerden que el iva en estas cosas es del 10.5%
Saludos VelazquezBio
No puedo creer la gran diferencia que hay.
Lástima que no conocía esa casa de electrónica Elko Net.
El que compré fue el HIH4000-001 ya que era el único que tenían.
Si es el HIH4000-001, creo que es como dice David, era el unico.
Hola gente,
Vuelvo a postear los avances en mi estación automática. Aunque no escribía desde hace un largo tiempo, vengo siguiendo el foro con vtras sugerencia y avances. Les comento que desde la última vez que escribí estuve ocupado en otros menesteres y no me había dedicado a la estación. No obstante hace algunos meses adquirí a través de un amigo un sensor de presión Motorola MPX2200AP ($105 en BsAs), este sensor que abarca entre 0 y 2000 hPa, entregando a fondo de escala 40 mV actuando en forma lineal con una constante k = 2.10-7 V/Pa. Por lo tanto para un valor de presión normal (1 atmósfera) el sensor devuelve 20 mV. Esto genera que haya que amplificar la señal para poder leerla con el PIC, además de adaptar el sensor ya que por su construcción la lectura de presión se adquiere por diferencia de potencial entre 2 pines del mismo sin referencia a tierra.
(http://a.imageshack.us/img716/8229/mpx2200ap.jpg)
Luego de "investigar" un poco la mejor solución para el mismo es realizar la adaptación con un Amplicicador Operacional LM324 (que se consigue en Neuquén a $3), y el esquema de adaptación es el siguiente:
(http://a.imageshack.us/img840/5802/adaptadormpx2200ap.jpg)
La ecuación de ganacia de este adaptador está dado por:
(http://a.imageshack.us/img72/992/ecuacionganancia.jpg)
Por lo tanto para una tensión en el MPX de 20mV luego del amplificador tendré aproximadamente 2.20 Volts. O sea que para una valor de Presión Atmosférica a nivel de suelo rondará ese valor de tensión (en caso de Neuquén que se encuentra a 300 msnm la presión es un poco menor a 1 atm en condiciones normales).
La placa adaptadora del MPX quedó de la siguiente forma:
(http://a.imageshack.us/img651/254/adaptadormpx2200appcb.jpg)
Cuyos componentes son:
C1 Amplificador Operacional LM324
Reg1 Regulador 7810
P Potenciómetro multivueltas de 2k Ohm
Led1 Led 5mm
C1 condensador 100 uF 25V
C2 capacitor 1uF
R1 Resistencia 1/4W de 1K Ohm
R2, R5, R7, R6 4 resistencias de 2K2 Ohm
R3 y R4 2 resistencias 1/4 W de 100 KOhm
R8 Resistencia ¼ W de 4K7 Ohm
Con el valor de amplificación y la relación del MPX podemos calcular el coeficiente del conversor del ADC, y una vez obtenido e incorporado en la rutina de lectura del PIC los ajustes menores se realizan con el Potenciometro multivuelta de 2K. En mi caso ajusté la presión con una estación automática DAVIS que se encuentra a 10 km de mi casa (y reporta por Internet) y luego de un mes de funcionamiento les puedo asegurar que no hay diferencias.
Saludos
Bueno, sigo con mis "investigaciones", luego de ver los precios de los sensores de humedad y lo oneroso que son seguí urgando en los rincones mas remotos de la red y encontré un trabajo publicado por Héctor Ulises Rodríguez Marmolejo de la Universidad Autónoma de Aguascalientes, México sobre un sensor de humedad capacitivo "casero" cuyos resultados no difieren en lo más mínimo con un sensor comercial Honeywell modelo HI 91610. Les copio lo más importante del trabajo:
..."El artículo presenta el diseño electrónico de un sistema de monitoreo de humedad relativa y tem- peratura implementado dentro de las instalacio- nes de la industria de procesamiento de alimentos frigorizados ubicada en el Parque Industrial Valle de Aguascalientes, Aguascalientes. El sistema electrónico maneja un exhibidor de cristal líquido en donde se despliega la temperatura y la humedad relativa dentro del área de embalaje de los alimentos. Hay alimentos que con temperaturas demasiado altas y con porcentajes de humedad elevados tienden a descomponerse o perder sus propiedades. Por ello es necesario estar monito- reando constantemente estas dos variables físicas. El sistema electrónico interactúa con las variables desde su muestreo, acondicionamiento, procesamiento matemático y exhibición a partir de un microcontrolador PIC16F877. Con un sensor de humedad capacitivo se varía la frecuencia de un oscilador y éste a su vez envía la señal a un convertidor de frecuencia a voltaje, traducien- do la variación de humedad en un cambio de voltaje.
Se diseña entonces un sensor capacitivo el cual varía su "capacitancia" dependiendo de la humedad en el medio ambiente, y a partir de un termistor no lineal se detecta la temperatura. Una vez que se escogieron los elementos sensores, se hace el acondicionamiento electrónico (que fue mucho más complejo para el sensor de humedad), y posteriormente se realiza el procesamiento matemático dentro del microcontrolador para exponer los resultados en la pantalla de cristal líquido. Todo el sistema debe ser lo suficientemente rápido, eficiente y económico que supere a los dispositivos que pueden encontrarse en el mercado. Ya que éstos existen pero tienen deficiencias, como son: su velocidad de respuesta, costo, dimensiones, etcétera.
MATERIALES Y MÉTODOS
El primer paso fue seleccionar el sensor que nos pudiese proporcionar un cambio de algún parámetro empleado dentro de la electrónica con la variación de humedad. Se analizaron diferentes elementos que reaccionan con la humedad, pero resultan costosos, de grandes dimensiones, vulnerables, etc. Fue por ello que se escogió un sensor hecho a partir de una placa para circuito impreso de escasas dimensiones. Con el dibujo impreso, el cobre varía su "capacitancia" con diferentes porcentajes de humedad permitidos; además de su fácil implementación, es de costo reducido
(http://a.imageshack.us/img412/9783/sensorhumedad1.jpg)
Al sensor se le agrega un capacitor de 1 microfaradio, el cual compensa ruidos electro- magnéticos que se dan en el medio ambiente, ya que sin el capacitor el sensor puede actuar como una antena o meter errores al acondiciona- miento electrónico. Se toma la variación de "capacitancia" implementando un oscilador, que varíe su frecuencia entre 4 y 5Khz al estar la humedad relativa del medio ambiente entre 10% y 100%, mediante el circuito integrado NE555 tal como se muestra
(http://a.imageshack.us/img132/9557/sensorhumedad2.jpg)
La manera más rápida de tomar la señal proporcionada por el oscilador es hacer uso del módulo de captura y comparación del microcontrolador; sin embargo, esto hace más complejo el algoritmo de procesamiento dentro del microcontrolador. Se optó por implementar el convertidor de frecuencia a voltaje mediante un circuito integrado LM2917, que fue configurado para que la variación de voltaje que proporciona con la humedad en un rango de 10 al 100% sea de 0.5 a 3 voltios, que son leídos por el microcontrolador.
(http://a.imageshack.us/img185/583/sensorhumedad3.jpg)
Cálculo de la función matemática descriptiva del sensor de humedad
Una vez que se dejó bien implementado el hard- ware del sensor de humedad relativa, es necesa rio desarrollar una función matemática que describa al sensor. Para ello se generó el Cuadro 1 de valores en donde medimos la cantidad de voltaje ge- nerado por el sensor de humedad y la humedad real medida con un higrómetro comercial marca Honeywell, modelo HI 91610.
Nro. Humedad Volts
1 10 0.61
2 40 0.92
3 50 0.99
4 70 1.52
5 77 1.47
6 90 2.03
7 100 2.47
Con los datos anteriores aplicamos el método numérico de regresión lineal cuya función lineal se muestra a continuación:
g(x)=a+bx.
Los coeficientes a, b se obtienen del sistema de ecuaciones:
A11a+ A12b= Z1
A21a+ A22b= Z2.
En donde los valores de A11, A12, A21, A22, Z1 y Z2 quedan determinados por las siguientes sumatorias:
A11= número de muestras.
A12=ΣXi.
A21=ΣXi.
A22=ΣXi*Xi.
Z1= ΣYi.
Z2= ΣXi*Yi.
Resolviendo el sistema de ecuaciones encon- tramos los coeficientes a y b que forman la función que describe el comportamiento de nuestro sensor de humedad.
g(X)=23.4646-0.533X.
Esta ecuación es programada dentro del microcontrolador para ser procesada y desplegar posteriormente a humedad relativa.
RESULTADOS
A continuación se hace la comparación de muestras de humedad tomadas con el higrómetro de la marca Honeywell modelo HI 91610 (el cual fue usado como equipo calibrador), y el higrómetro diseñado (Cuadro 2). Note entonces la gran similitud de resultados que se arrojan entre el medidor comercial de humedad relativa y el medidor diseñado, el cual procesa la función matemática propuesta y resuelta.
Humedad % Humedad%
Honeywell Casero
10 10.09
20 20.1
30 30.3
45 45.5
55 55.6
70 70.8
80 80.09
90 90.2
95 95.4
Lo anterior indica que nuestro sistema es con- fiable y además de un costo bastante reducido. Se concretó a usar el método numérico —regre- sión lineal— ya que arrojó muy buenos resultados; y por el tipo de muestras que se analizaron, no hubo necesidad de aplicar o comparar con otros métodos numéricos..."
Bueno, espero comentarios.
Saludos
Sigo con el hilo,
entre las cosas que leí fue que sensores de este tipo (como el del msje anterior) se utilizaban en las videocaseteras (VHS) "antigüas", por lo tanto recurrí al "basural" existente en mi Shack de radio (habitación de mi casa en donde tengo mis computadoras, equipos de radio, etc. a la que solo acceden mis amigos y hace rato no ve un plumero ni escoba....) en donde reposaba una videocasetera Phillips que obviamente no funcionaba, la desarmé y encontré dicho sensor cercano al cabezal de lectura. Otro aporte que hizo "el cadaver" fue un Reloj de Tiempo Real (RTC) marca Phillips modelo PCF8573 que tiene comunicación I2C lo que permite una comunicación simple con el 16F877 que estoy usando, asimismo encontré una memoria Phillips de 256 x 8-bit con I2C modelo PCF8570C. Veremos que sale de esto. Ya les contaré.
Saludos
Daniel
Excelentísimo aporte yeberere. Muy completo todo.
Personalmente me sirvió el circuito que posteate sobre el sensor de humedad. Como aún no lo tengo no he podido hacer las pruebas. De echo, me estoy enterando que la referencia del sensor no es a tierra, así que mi esquemático que he realizado tendré que modificarlo.
Usar cosas de equipos viejos o en desuso es lo mejor porque ahorra muchísimo dinero y tiempo.
David,
efectivamente el MPX no devuelve el valor de presión en forma directa por eso tiene una salida que dice OUT+ y otra OUT- si lo medís con respecto a tierra el MPX2200 AP te devuelve como 8 volts.
Los pines 1 y 3 son masa y tensión, y los 2 y 4 son las salidas, el diagrama que publiqué anda perfecto.
Les dejo algunas fotos:
(http://a.imageshack.us/img823/7241/1001448.th.jpg) (http://img823.imageshack.us/i/1001448.jpg/)(http://a.imageshack.us/img72/3376/1001457.th.jpg) (http://img72.imageshack.us/i/1001457.jpg/)
(http://a.imageshack.us/img51/3619/1001445w.th.jpg) (http://img51.imageshack.us/i/1001445w.jpg/)(http://a.imageshack.us/img823/7241/1001448.th.jpg) (http://img823.imageshack.us/i/1001448.jpg/)
(http://a.imageshack.us/img831/6290/1001454m.th.jpg) (http://img831.imageshack.us/i/1001454m.jpg/)(http://a.imageshack.us/img94/9916/1001450vg.th.jpg) (http://img94.imageshack.us/i/1001450vg.jpg/)
(http://a.imageshack.us/img401/1286/1001451sg.th.jpg) (http://img401.imageshack.us/i/1001451sg.jpg/)(http://a.imageshack.us/img25/4348/1001458ub.th.jpg) (http://img25.imageshack.us/i/1001458ub.jpg/)
Hola yebeere,
ya calibraste es sensor de presion, lo contrastaste con algun instrumento.
Hola Ricber,
La única forma que tengo de calibrarla es comparándome con una Estación Davis online (http://www.aic.gov.ar/aic/estacion/meteoweb.htm (http://www.aic.gov.ar/aic/estacion/meteoweb.htm)) que se encuentra a 10 km de mi casa), tomé a esa como patrón y vamos "palo a palo". El sensor es casi lineal, con corrección de temperatura, una vez que establecí la Presión en función de la Patrón, los valores tomados por mi son casi idénticos a la DAVIS VANTAGE PRO. Puede variar en 1 o 2 Hpascales por lo tanto en 900 Hpa el error relativo es mínimo. Y en sí lo más importante es la tendencia (siempre considerando que esta dentro del rango)
Ok, gracias por la respuesta
He llegado a un punto donde tengo que decidir que hacer con la transmisión de datos. Actualmente los datos obtenidos los envío en forma automática por el puerto RS-232 (o sea sin solicitud, al estilo de los paquetes NMEA de los GPS), para esto hice una rutina un cliente/servidor en linux que toma los datos del RS-232 y los pone a disposiciónn en un servidor TELNET.
Pero he implementado el reloj de tiempo real conn el PCF8573 (rescatado de la videocasetera) y me encuentro en la diyuntiva de tener que hacer algo para poner en hora el reloj, y se me ocurrió que lo menos complicado es a través de un comando por RS-232.
También me surgió el tema de los programas para monitoreo de las estaciones, vi que hay varios libres que a su vez generan paginas webs, pero en general levantan datos de alguna estacion comercial.
Por lo tanto se me plantea el tema del protocolo de comunicaciones de la Estación, alguno de Uds. ha visto algo, ha implementado algun software, ha visto los protocolos de las Comerciales.
Me pueden recomendar alguno en particular o tengo que hacer todo de cero??
Saludos
Daniel
Hola yebeere.
Yo tengo un idea pendiente que era realizarlo primeramente con mi estación automática y luego ampliarlo para cualquier usuario de la página web.
Mi idea es habilitar una opción en la página web para visualizar distintas estaciones meteorológica.
Si te gusta la idea, podemos empezar a implementarlo. No tengo la menor idea de como hacerlo, pero quiero hacerlo.
Muy interesante el tema de subir los datos de las estaciones a la pagina.
El tema seria primero definir un protocolo, no se si tienen material sobre el tema o tendriamos que definirlo desde cero y crearlo para poder adaptar las estaciones a dicho protocolo.
Saludos
Y si. Un protocolo es muy necesario.
Veremos que dice yebeere y si le gusta la idea, abrimos un nuevo tema y lo trataremos ahí.
Y si, me parece barbaro abrir un nuevo tema para no pisotear este con el tema del protocolo.
Saludos
Disculpen la demora,
ayer se complicó el día. Me parece bárbaro que se genere un nuevo tema. Yo he recorrido bastante la web y encontré software libre muy bueno (monitores con generación de webs y rutinas jave/php para leer archivos generados por algún soft y crear una pagina). De a poco voy a ir ingresando lo que encontré. Dale David habilitá el tema.
Saludos
Daniel
Listo, aquí está http://www.meteorologiafacil.com.ar/foros/index.php?topic=404.new#new (http://www.meteorologiafacil.com.ar/foros/index.php?topic=404.new#new)
Después de varios meses, les puedo traer unos avances de mi estación automática.
He logrado hacer envíos en forma inalámbrica desde la ubicación del Transmisor (TX) y el receptor (RX).
Para más detalle, visitar el siguiente tema. (http://www.meteorologiafacil.com.ar/foros/index.php?topic=699.new#new)
El siguiente paso, es re-escribir todo el programa en JALv2 y montarlo. :\ :\
amigo buenas tardes,serias tan amable de proporcionarme el diagrama electronico de toda la estacion? mas o menos para guiarme pretendo hacer una
Hola Edu. Bienvenido al foro de meteorología fácil.
Lamentablemente, mi estación automática no está terminada aún.
Te puedes guiar por la de Ricber; haciendo click aquí. (http://www.meteorologiafacil.com.ar/foros/index.php?topic=547.0)
Saludos.
Hola amigos del foro estoy armando una estacion meteorologica automatica, hecha con PIC que twittea los datos cada hora, pueden seguirme en @climaesperanza