Autor Tema: Medir temperatura usando una red RC  (Leído 2239 veces)

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

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Medir temperatura usando una red RC
« en: 24 de Febrero de 2017, 01:36:44 »
por curiosidad he investigado medir temperatura usando una red RC para no usar un ADC de un pic, este principio es aplicable tambien para medir resistencias y condensadores abajo se muestr el circuito que use y el grafico que explica a grndes rasgos como funciona

mi inquietud es saben como calcular la tenperatura si Rsense es sistituida por un termistor???
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Medir temperatura usando una red RC
« Respuesta #1 en: 24 de Febrero de 2017, 09:54:16 »
Buenos dias este es el programa que uso con un 16F84A............la idea es probar con el y luego adaptarlo con otros pic, este programa lo consegui del un manual de MicroChip, el AN512, esta escrito originalmente para el 16C54, lo adapte al 16F84A facilmente pero tengo un problema cuando va a ejecutar la rutina de multiplicacion..........se detiene...........en el MPLAB corre bien pero en proteus da error al comenzar la rutina de division y en el Pic Simulator Ide se detiene en la misma linea es al ir a la sub rutina Setup al carga el valor Hexadecimal 10 en TEMP   
       
   list     P=16f84a 
   #include "p16f84a.inc" 

   errorlevel -302    

   __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC

 

ACCA   EQU     8
ACCB   EQU     0A
ACCC   EQU     0C
ACCD   EQU     0E
ACCE   EQU     10
TCAL   EQU     12
TEMP   EQU     14
 
RCALMS EQU     2F              ;RCAL MSB VALUE IN HEX
RCALLS EQU     3C              ;RCAL LSB VALUE IN HEX

      goto      Inicio

; ============= Rutinas ====================

Descarga:
      bsf      STATUS,   RP0
      MOVLW   B'00001011'     ;ACTIVATE RA2
       movwf   TRISA
      bcf      STATUS,   RP0

      MOVLW   B'00000000'     ;ACTIVATE RA2
       movwf   PORTA

       MOVLW   0FF
       MOVWF   TEMP
 
LOOP   
      DECFSZ  TEMP,F            ;WAIT
       GOTO    LOOP

      bsf      STATUS,   RP0
       MOVLW   B'00001111'     ;ALL OUTPUTS OFF
       movwf   TRISA
      bcf      STATUS,   RP0
 
       Return

; =========================================

M_TIME:
      ;CLRF    1               ;CLEAR RTCC
       CLRF    ACCA+1
       CLRF    ACCA
 
TLOOP 
      INCFSZ  ACCA+1,F
       GOTO    ENDCHK
       INCFSZ  ACCA,F
       GOTO    ENDCHK
       GOTO    END_M

ENDCHK
      BTFSS   PORTA,3             ;CHECK FOR RTCC TRIP
       GOTO    TLOOP

END_M 
      MOVF    1,W
       Return

; ===== Rutina Para Multiplicar ====

MPY:   CALL    SETUP           ;RESULTS IN B(16 MSB'S) AND C(16 LSB'S
 
MLOOP: 
      RRF     ACCD,F            ;ROTATE D RIGHT
       RRF     ACCD+1,F
       SKPNC                   ;NEED TO ADD?
       CALL    MADD
       RRF     ACCB,F
       RRF     ACCB+1,F
       RRF     ACCC,F
       RRF     ACCC+1,F
       DECFSZ  TEMP,F            ;LOOP UNTIL ALL BITS CHECKED
       GOTO    MLOOP
       Return
       
; ===========================================
SETUP:
       nop
       MOVLW   10          <.........................................EL PROGRAMA FALLA O SE DETIENE AL LLEGAR
       MOVWF   TEMP                                                 AQUI
       MOVF    ACCB,W          ;MOVE B TO D
       MOVWF   ACCD
       MOVF    ACCB+1,W
       MOVWF   ACCD+1
       MOVF    ACCC,W
       MOVWF   ACCE
       MOVF    ACCC+1,W
       MOVWF   ACCE+1
       CLRF    ACCB
       CLRF    ACCB+1
       Return

; ===== Rutina Para Dividir ==================

DIV:
       CALL    SETUP
       MOVLW   20
       MOVWF   TEMP
       CLRF    ACCC
       CLRF    ACCC+1
 
DLOOP 
      CLRC
       RLF     ACCE+1,F
       RLF     ACCE,F
       RLF     ACCD+1,F
       RLF     ACCD,F
       RLF     ACCC+1,F
       RLF     ACCC,F
       MOVF    ACCA,W
       SUBWF   ACCC,W          ;CHECK IF A>C
       SKPZ
       GOTO    NOCHK
       MOVF    ACCA+1,W
       SUBWF   ACCC+1,W        ;IF MSB EQUAL THEN CHECK LSB
 
NOCHK 
      SKPC                    ;CARRY SET IF C>A
       GOTO    NOGO
       MOVF    ACCA+1,W        ;C-A INTO C
       SUBWF   ACCC+1,F
       BTFSS   3,0
       DECF    ACCC,F
       MOVF    ACCA,W
       SUBWF   ACCC,F
       SETC                    ;SHIFT A 1 INTO B (RESULT)
 
NOGO   
      RLF     ACCB+1,F
       RLF     ACCB,F
       DECFSZ  TEMP,F            ;LOOP UNTILL ALL BITS CHECKED
       GOTO    DLOOP
       Return
 
; ==============================

MADD:   
      MOVF    ACCA+1,W
       ADDWF   ACCB+1,F          ;ADD LSB
       BTFSC   3,0             ;ADD IN CARRY
       INCF    ACCB,F
       MOVF    ACCA,W
       ADDWF   ACCB,F            ;ADD MSB
       Return
 ; =============================

Inicio:   
      bsf      STATUS,   RP0
      MOVLW   B'00001111'     ;SET RA0 AND RA1 HIGH (ON WHEN ACTIVATED)
       MOVWF   TRISA
      bcf      STATUS,   RP0

Calibracion:   
      CALL    Descarga        ;DISCHARGE CAPACITOR

      bsf      STATUS,   RP0
       MOVLW   B'00001110'     ;ACTIVATE RA0
       movwf   TRISA
      bcf      STATUS,   RP0

       MOVLW   B'00000001'     ;ACTIVATE RA0
       movwf   PORTA

       CALL    M_TIME          ;MEASURE TIME
       MOVF    ACCA+1,W
       MOVWF   TCAL+1          ;STORE LSB
       MOVF    ACCA,W
       MOVWF   TCAL            ;STORE MSB

Medicion:   
      CALL    Descarga         ;DISCHARGE CAPACITOR
 
      bsf      STATUS,   RP0
       MOVLW   B'00001101'     ;ACTIVATE RA1
       movwf   TRISA
      bcf      STATUS,   RP0

       MOVLW   B'00000010'     ;ACTIVATE RA0
       movwf   PORTA

       CALL    M_TIME          ;MEASURE TIME
      MOVLW   RCALLS          ;CALIBRATION LSB VALUE
       MOVWF   ACCB+1
       MOVLW   RCALMS          ;CALIBRATION MSB VALUE
       MOVWF   ACCB
       CALL    MPY             ;MULTIPLY ACCA(MEAS) * ACCB(RCAL)
       MOVF    TCAL+1,W
       MOVWF   ACCA+1
       MOVF    TCAL,W
       MOVWF   ACCA
       CALL    DIV             ;DIVIDE ACCB(MEAS * R) BY ACCA(TCAL)
 
       GOTO    Inicio
      END

gracias de antemano a todos............y su valioso aporte


Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re:Medir temperatura usando una red RC
« Respuesta #2 en: 24 de Febrero de 2017, 13:46:59 »
Buenas, antes que nada no has puesto el error que te aparece en la ejecución del proteus.
Sin embargo, y mirandolo muy por arriba, en el comienzo del programa, donde asignas el nombre de los registros a una posición de la memoria, estas usando , para guardar tus propias variables, posiciones de memoria que son reservadas para registros de control del micro.
Esto se debe cambiar, ya que el programa estaba hecho para otro micro, tienes que mirar en la hoja de datos del micro que vas a usar, y usar las posiciones de memoria adecuadas. Seguramente una vez que hagas esto vas a corregir el problema.

En el 16f84A los GPR comienzan en la dirección 0ch y de ahí en adelante tenes 68 gpr en el bco 0.   Datasheet del 16f84a página 6.
Cuando ahora en tu programa le cargas algo a los registros ACCa, ACCb estas modificando en realidad los registros eedata y pclath.

Recuerda además colocar Radix hex luego de listar el microcontrolador, apra indicar que usaras numeros en hexadecimal.

Salutes.
Nico.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Medir temperatura usando una red RC
« Respuesta #3 en: 24 de Febrero de 2017, 21:38:49 »
POr dios  :shock: :shock: que pena un error tan basico....pido disculpas por eso se detiene pues estoy dañando el programa..................simplemente el programa se detiene................gracias esa parte de la declaracion de variables no lo organice............gracias amigo al hacer eso evisare que paso........mil gracias
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Medir temperatura usando una red RC
« Respuesta #4 en: 26 de Febrero de 2017, 16:00:57 »
Amigo NIKO tenias rason Declare las variables y organice mas el programa y tenia otros problemas con la dvicion no daba bien el resultado pero pense en algo............corrigeme si estoy equivocado pero, el Tiempo de la mediocion de la temperatura no es T1-T2??? y en el manual dicen que se puede calcular la temperatura con el calculo del valor ohmico del Termistos calculado usando la formula que dan y usar una table..........pero para acortar el tiempo de ejecucion no bastaria con calcular la diferencia entre T1 y T2 y usar esa tabla??? y como usaria esa table???

El programa sin la rutina de multiplicacion y division quedo asi:

   list     P=16f84a 
        #include "p16f84a.inc" 

   errorlevel -302    

   __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC

 
   cblock   0x0C
    TEMP, TCALA, TCALB, TMEDA, TMEDB 
    endc

      ORG    0
      goto      Inicio

; ============= Rutinas ====================

Descarga:
      bsf      STATUS,   RP0
      MOVLW   B'00001011'     ;ACTIVATE RA2
           movwf   TRISA
      bcf      STATUS,   RP0

      MOVLW   B'00000000'     ;ACTIVATE RA2
           movwf   PORTA

           MOVLW   0FF
           MOVWF   TEMP
 
LOOP   
      DECFSZ  TEMP,F            ;WAIT
           GOTO    LOOP

      bsf      STATUS,   RP0
           MOVLW   B'00001111'     ;ALL OUTPUTS OFF
           movwf   TRISA
      bcf      STATUS,   RP0
 
           Return

; =========================================

M_TIME:
                                 ;CLEAR RTCC
       CLRF    ACCAA
       CLRF    ACCAB
 
TLOOP 
       INCFSZ  ACCAA,F
       GOTO    ENDCHK
       INCFSZ  ACCAB,F
       GOTO    ENDCHK
       GOTO    END_M

ENDCHK
       BTFSS   PORTA,3             ;Chequeo de que el condensador alcanzo el voltaje
       GOTO    TLOOP

END_M   
       Return

; =========================================

Inicio:   
       bsf      STATUS,   RP0
       MOVLW   B'00001111'        ; Colocamos los Pines que se conectan a Rref, Rmed y C
       MOVWF   TRISA                 ; En alta impedancia
       bcf      STATUS,   RP0

Calibracion:   
       CALL    Descarga           ; Se descarga el Condensador Antes de Medir
                       ; El TCAL
       bsf      STATUS,   RP0
       MOVLW   B'00001110'        ; Activo RA0 en el TRISA
       movwf   TRISA
       bcf      STATUS,   RP0

       MOVLW   B'00000001'      ; Activo RA0 En el PUERTO A
       movwf   PORTA

       CALL    M_TIME           ;  Medicion del Tiempo TCAL
       MOVF    ACCAA,W
       MOVWF   TCALA            ; Valor de TCAL MSB
       MOVF    ACCAB,W
       MOVWF   TCALB            ; Valor de TCAL LSB

Medicion:   
      CALL    Descarga           ; Se Descarga el Condensador antes de Medir
                   ; El TMED
       bsf      STATUS,   RP0
       MOVLW   B'00001101' ; Activo RA1 en TRISA
       movwf   TRISA
       bcf      STATUS,   RP0

       MOVLW   B'00000010'     ; Activo en el Puerto A
       movwf   PORTA

       CALL    M_TIME            ; Medicion del Tiempo TMED
       movf    ACCAA,W          ;
       MOVWF   TMEDA      ; Valor de TMED MSB
       movf    ACCAB,W          ; Valor de TMED LSB
       MOVWF   TMEDB

       GOTO    Inicio
       END
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela


 

anything