Noticias:

Grupo en telegram, del foro de meteorología fácil: https://t.me/meteorologiafacil

Para mas detalles, puedes visitar el siguiente tema http://www.meteorologiafacil.com.ar/foros/index.php?topic=1608.0

Espero que les sea de mucha utilidad.

Menú Principal

Creando mi propia estación automática.

Iniciado por David Met, Abril 05, 2009, 08:40:12 PM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

zakario

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.
Se renta este espacio!
llame al ....

David Met

Muy buena idea zakario. Voy a empezar por el termómetro y el sensor de humedad.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

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 y RWS. 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


Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

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
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

#49
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


Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

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. ;)
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

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

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). :\
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

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.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Ricber

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.

David Met

Lo voy a chequear porque otra cosa no me queda por hacer. :( :(
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

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.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Ricber

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.



David Met

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.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

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  :\
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Ricber

Me alegro que hayas podido destrabar el problema, y que eso te permita continuar.