TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: akira_ve 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???
-
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
-
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.
-
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
-
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