TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: riki en 18 de Octubre de 2010, 18:14:02
-
buenas muchachos, soy Ricardo, estoy reincorporandome al foro despues de unos meses, les saludo con respeto y les quiero dejar mi pequeño problema, todo lo que me pidan se lo voy a ir pasando, de acuerdo a lo que necesiten, ya termine el sensor de temperatura con el lm 35 y el pic 16f873A, en ensamblador, esto con ayuda de ustedes en el ultimo tema propuesto por mi, el programa dispone de unas 400 lineas de codigo, entre lectura del sensor, conversion de binario a BCD para el display, ademas del sensor, le agregue al programa la opcion de poder definir limites o rangos de temperatura en las que van a trabajar dos salidas, ya sea por ejemplo, calefaccion o ventilacion, entonces vi necesario de guardar estos dos limites tanto el inferior como el superior, les cuento, y funciona de maravilla, algo mas para llegar al problema, los 10 milivoltios del lm35 por grado celcius, lo leo y lo divido por 2, de esta manera logro obtener 5 mv, que serian aproximadamente los 4.8mv que detecta el pic por defecto para cada bit, todo esto simplemente para evitarme el trabajo de amplificar la salida del sensor, bueno hasta aca todo bien, lo programe y arme la placa, todo espectacular, ya tenia mi sensor de temperatura, ya podia ver en display la temperatura ambiente, acercaba al sensor un soldador y la temperatura aumentaba como era de esperarse, ocurre que de un momento para otro, tuve que volver aprogramar el pic para modificar el programa y hacer algunos ajustes, puse en placa, y ocurrio algo extraño, el voltaje del sensor cayo bruscamente, en el display podia notar solamente unos 17 grados, procedi a medir con voltimetro la salida del lm, este efectivamente tenia 170 milivoltios, pero la temperatura real en ese momento era de 25 grados, el sensor mantenia un voltaje de 170 mv, entonces crei que el pin analogico del pic estaba quemado, pero tampoco era asi, crei tambien que el lm estaba dañado por aplicarle mucha temperatura con el soldador, saque el mismo, de la placa, y le aplique 5 voltios y la salida tenia 250 mv, o sea que funcionaba, segui robando y probando, me tarde dias, probe con otro pic y otro lm, y el problema era el mismo, yo ya no se que acer amigos, no estoy seguro de lo que estoy haciendo mal, tambien probe poner una resistencia limitadora entre la salida del lm y el pic, pero ahi incluso bajaba mas el voltaje, media 0 grados, pero lo raro es que de un momento para otro cuando por accidente hice un cortocircuito en la pata del pic con el lm, estos funcionaron bien, midiendo la temperatura ambiente tal cual era, no se exactamente lo que paso, no se si sea alguna configuracion adicional del pic que me falta, quise ir mas a fondo y deje el pic que funcionaba a un lado y programe otro, puse en placa con el mismo sensor y no funcionaba, puse el original y todo correcto, entonces quise ser mas atrevido y programe nuevamente el pic que funcionaba, lo monte en la placa y dejo de medir bien otra vez, esta es mi historia, disculpen que sea un poco extenso, pero todo sea por tratar de explicarme mejor, quisiera saber su opinion y experiencia al respecto para poser solucionar esta situacion gracias desde ya y espero su respuesta
-
Hola Riki.
Te sugiero encarecidamente que uses la tecla Enter de tu teclado y los signos de puntuación más comunes, así como la separación por párrafos. Esto para poder leer tu mensaje más fácilmente.
-
bueno, bueno, disculpame, voy a tener muy en cuenta la sugerencia, pero qtal?? se entendio lo que trate de explicar..??
-
yo si te digo la verdad siempre que he empezado algo con programas de musica, dibujo, lu que sea... he tenido ese tipo de problemas. crees que algo esta pasando, y realmente es algo que se habia pasado por alto, normalmente minusculo pero que nos la hace. compara el programa del pic que funciona, con el hex que crees que funciona. a ver si son iguales
tambien podrias enseñarnos el circuito que a lo mejor vemos algo.
un saludo
-
Buenas tardes, aqui les dejo el circuito y el programa en assembler.
Disculpen, el asm esta un tanto desordenado, gracias LIST p=16f873A
#include p16f873a.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
estado equ 0x03
intcon equ 0x0b 0x03
porta equ 0x05
portb equ 0x06
portc equ 0x07
adcon0 equ 0x1f ;registro de control de operacion de C A/D
adcon1 equ 0x9f ;sirve para configurar las patitas como entradas analogicas o E/S digitales
adresl equ 0x9e ;parte baja del resultado de la conversion
EEDATA EQU 0X10C ;aqui se guarda valores limite superior e inferior
EEADR EQU 0X10D ;registros especificos de escritura-lectura eeprom
EECON1 EQU 0X18C
EECON2 EQU 0X18D
unidad EQU 0X20 ;aqui se guarda adresl
decena EQU 0X21 ;unidad-decena para conversion BCD
alfa equ 0x22 ;registros utilizados para retardo
beta equ 0x23
delta equ 0x24
superior equ 0x25
inferior equ 0x26
memoria1 equ 0x27
memoria2 equ 0x28
sensar_bit equ 0x29
sensar_bit_2 equ 0x3a
org 0x00
goto inicio
org 0x04
goto interrupcion ;direccion de interrupcion. 0x04
;//////////////////////////////////////////
;//////////////////////////////////////////
inicio
;BANCO1
bsf estado,5 ;accedemos al banco1
movlw b'10001110' ;EL BIT 7 ADFM=1, ENTONCES justificado a la derecha
movwf adcon1
clrf porta ;puerto A, C, como salida
clrf portc
movlw b'11110000' ;configuracion de entrada en puerto B
movwf portb
;BANCO0
bcf estado,5 ;banco0
;//////////////////////////////////////////
;//////////////////////////////////////////
movlw b'10001000' ;se habilitan las interrupciones para rb4-rb7
movwf intcon
clrf unidad ;unidad
clrf decena ;decena
clrf sensar_bit
clrf sensar_bit_2
clrf superior ;registro que compara limite superior de temperatura
clrf inferior ;registro que compara limite inferior de temperatura
clrf portb
clrf portc
movlw b'00000110' ;puerto que controla catodo de display 1==>> deshabilita 0==>> habilita
movwf porta
movlw b'11110001' ;BIT 0 ADON=1 ---> habilita analogico digital,
movwf adcon0 ;BITS 5,4,3=0 CH2, CH1, CH0 --> canal 3(RA3/AN3),
BSF portb,0 ;led indicador de sensor
movlw .40
movwf memoria1
movlw .41
movwf memoria2
call LECTURA ;lee la direccion de eeprom, en la cual estan contenidas los valores del
habilita_conversion ;limite superior e inferior de temperatura
bsf adcon0,2 ;PONIENDO A 1 SE INICIA CONVERSION, BIT GO/DONE
pregunta btfsc adcon0,2 ;fin de conversion??
goto pregunta
bsf estado,5
movf adresl,0
bcf estado,5
movwf unidad
;,,,,,,,,,,,,,,,,,PROCESO DE DIVISION POR 2,,,,,,,,,,,
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
rrf unidad,1
btfss unidad,7
goto pasar
bcf unidad,7
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
pasar clrf decena
decf unidad,1
movf unidad,0
subwf superior,0
btfsc estado,0 ;unidad es mayor a superior???
goto normal_1
bsf porta,3
goto conversion_BCD
normal_1
bcf porta,3
movf inferior,0
subwf unidad,0
btfsc estado,0 ;unidad es menor a inferior???
goto normal_2
bsf porta,5
goto conversion_BCD
normal_2
bcf porta,5
conversion_BCD
movlw .10
subwf unidad,1
btfsc estado,0
goto incrementa
movlw .10
addwf unidad,1
call muestra_en_display
goto habilita_conversion
incrementa incf decena,1
goto conversion_BCD
muestra_en_display
;muestra unidad
movlw .100
movwf alfa
load movlw .100
movwf beta
movf unidad,0
movwf portc
bcf porta,1
dec decfsz beta,1
goto dec
bsf porta,1
;muestra decena
movlw .100
movwf beta
movf decena,0
movwf portc
bcf porta,2
dec_2 decfsz beta,1
goto dec_2
bsf porta,2
decfsz alfa,1
goto load
return
;//////////////////////////////////////////////////////////////////////////////////////////
;////////////////interrupcion para programar limites inferior y superior/////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////
interrupcion
bcf porta,1 ;el programa no permite que otros pulsadores aparte de RB4, habiliten la programacion
bcf porta,2
btfsc portb,4 ;pulsa para programar
goto falsa_alarma ;si no es por RB4, era falsa alarma y vuelve a obtener datos del sensor
espera_2
btfss portb,4
goto espera
btfsc sensar_bit,0 ;este registro permite seleccionar el ingreso a la programacion de limite
goto hacer_cero ;superior o inferior, por cada pulso de RB4, sensar_bit se modifica en 1 o en 0,
bsf sensar_bit,0 ;y decide ingresar a la programacion o salir de ella, volviendo a sensar la temperatura
goto superior_inferior
espera
bcf porta,1 ;espera a que se deje de pulsar RB4
bcf porta,2
goto espera_2
hacer_cero
bcf sensar_bit,0
falsa_alarma
bcf portb,2 ;siempre que haya terminado de modificar los limites, ingresados por el usuario,
bcf portb,3 ;se vuelve al sensor por esta misma rutina, habilitando la interrupcion y retornando
bsf portb,0 ;tambien antes de salir totalmente se guarda los limites en la memoria interna eeprom del pic
bcf portb,1 ;haciendo un call para habilitar la escritura o grabacion
call ESCRITURA
bcf intcon,0 ;habilita interrupcion y retorna
retfie
superior_inferior
bcf portb,0
bsf portb,1
btfsc portb,5 ;selector para limite superior e inferior
goto inverso
espera_4 btfss portb,5
goto espera_3
btfsc sensar_bit_2,0
goto hacer_cero_2
bsf sensar_bit_2,0
goto c_superior
espera_3
bcf porta,1 ;espera a que se deje de pulsar RB5
bcf porta,2
goto espera_4
hacer_cero_2
bcf sensar_bit_2,0
goto c_inferior
inverso
btfss sensar_bit_2,0
goto c_superior
goto c_inferior
c_superior bcf portb,3
bsf portb,2
movf superior,0
movwf unidad
call pasar_2
btfsc portb,6 ;pulsador para incrementar
goto sensar_RB7
espera_6
btfss portb,6
goto espera_5
goto incrementa_superior
espera_5 bcf porta,1
bcf porta,2
goto espera_6
sensar_RB7
btfsc portb,7 ;pulsador para decrementar
goto estado_RB4
esperar_8
btfss portb,7
goto espera_7
goto decrementa_superior
espera_7 bcf porta,1
bcf porta,2
goto esperar_8
estado_RB4
btfsc portb,4
goto superior_inferior
goto espera_2
c_inferior
bcf portb,2
bsf portb,3
movf inferior,0
movwf unidad
call pasar_2
btfsc portb,6 ;pulsador para incrementar
goto sensar_RB7_2
espera_10
btfss portb,6
goto espera_9
goto incrementa_inferior
espera_9
bcf porta,1
bcf porta,2
goto espera_10
sensar_RB7_2
btfsc portb,7 ;pulsador para decrementar
goto estado_RB4
espera_12
btfss portb,7
goto espera_11
goto decrementa_inferior
espera_11
bcf porta,1
bcf porta,2
goto espera_12
incrementa_superior
incf superior,1
goto estado_RB4
decrementa_superior
decf superior,1
goto estado_RB4
incrementa_inferior
incf inferior,1
goto estado_RB4
decrementa_inferior
decf inferior,1
goto estado_RB4
pasar_2 clrf decena
BCD_3 movlw .10
subwf unidad,1
btfsc estado,0
goto incrementa_2
movlw .10
addwf unidad,1
call muestra_en_display
return
incrementa_2
incf decena,1
goto BCD_3
return
retardo movlw .100
movwf alfa
load_1 movlw .10
movwf beta
load_2 movlw .10
movwf delta
dec_3 decfsz delta,1
goto dec_3
decfsz beta,1
goto load_2
decfsz alfa,1
goto load_1
return
;;;;;;;;;;;;;;;;;;;;;;;;LEER ESTADO SUPERIOR;;;;;;;;;;;;;;;;;;;;;;;;;;
LECTURA
;BANCO2
BSF estado,6
BCF estado,5 ; Selecciona banco 2
MOVF memoria1,0 ; Dirección a leer de
MOVWF EEADR ; la EEPROM PARTE BAJA
;BANCO3
BSF estado,5 ; Selecciona banco 3
BCF EECON1,7 ; se selecciona el acceso a la eeprom
BSF EECON1,0 ; Activar lectura RD
ESPERA_13
BTFSC EECON1,0 ; Espera final de lectura
GOTO ESPERA_13 ; a que baje la bandera
;BANCO2
BCF estado,5 ; Selecciona banco 2
MOVF EEDATA,0 ; W se carga con el valor
BCF estado,6 ; Selecciona banco 0
movwf superior ; leído en eeprom
;;;;;;;;;;;;;;;;;;;;;;;;LEER ESTADO INFERIOR;;;;;;;;;;;;;;;;;;;;;;;;;;
;BANCO2
BSF estado,6
BCF estado,5 ; Selecciona banco 2
MOVF memoria2,0 ; Dirección a leer de
MOVWF EEADR ; la EEPROM PARTE BAJA
;BANCO3
BSF estado,5 ; Selecciona banco 3
BCF EECON1,7 ; se selecciona el acceso a la eeprom
BSF EECON1,0 ; Activar lectura RD
ESPERA_14
BTFSC EECON1,0 ; Espera final de lectura
GOTO ESPERA_14 ; a que baje la bandera
;BANCO2
BCF estado,5 ; Selecciona banco 2
MOVF EEDATA,0 ; W se carga con el valor
;BANCO0
BCF estado,6 ; Selecciona banco 0
movwf inferior ; leído en eeprom
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;PROCESO DE ESCRITURA DE EEPROM;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ESCRIBIR LIMITE SUPERIOR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ESCRITURA
;BANCO2
BSF estado,6 ;pasamos al banco 2
bcf estado,5 ; Establecer EEADR y EEDATA
MOVF memoria1,0
MOVWF EEADR ; Escribe la dirección en EEADR
MOVF superior,0
MOVWF EEDATA ; Se escribe el dato en EEDATA
;BANCO3
BSF estado,5 ; Selecciona el banco 3
BCF EECON1,7 ; se selecciona el acceso a la eeprom
BSF EECON1,2 ; Permiso de escritura activado
;Comienzo de la secuencia de escritura
MOVLW 0x55
MOVWF EECON2 ; Se escribe el dato 55 h en EECON2
MOVLW 0xAA
MOVWF EECON2 ; Se escribe AA h en EECON2
BSF EECON1,1 ; Comienza la escritura
BCF EECON1,2 ; Permiso de escritura desactivado
CALL retardo
ESPERA_15
BTFSC EECON1,1 ; Espera a que termine la escritura
GOTO ESPERA_15
;;;;;;;;;;;;;;;;;;;;;;;;;;;PROCESO DE ESCRITURA DE EEPROM;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ESCRIBIR LIMITE INFERIOR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;BANCO2
bcf estado,5 ; pasamos al banco 2
MOVF memoria2,0 ;Establecer EEADR y EEDATA
MOVWF EEADR ; Escribe la dirección en EEADR
MOVF inferior,0
MOVWF EEDATA ; Se escribe el dato en EEDATA
;BANCO3
BSF estado,5 ; Selecciona el banco 3
BCF EECON1,7 ; se selecciona el acceso a la eeprom
BSF EECON1,2 ; Permiso de escritura activado
;Comienzo de la secuencia de escritura
MOVLW 0x55
MOVWF EECON2 ; Se escribe el dato 55 h en EECON2
MOVLW 0xAA
MOVWF EECON2 ; Se escribe AA h en EECON2
BSF EECON1,1 ; Comienza la escritura
BCF EECON1,2 ; Permiso de escritura desactivado
CALL retardo
ESPERA_16
BTFSC EECON1,1 ; Espera a que termine la escritura
GOTO ESPERA_16
;BANCO0
BCF estado,6 ; Selecciona el banco 0
BCF estado,5 ; Selecciona el banco 0
RETURN
END
-
hola muchachos, sgo en el mismo tema, y estoy poco a poco solucionando el problema, creo que no es otra cosa que alguna interferencia electromagnetica.
Como ven en el circuito, no pongo nada en la salida del sensor, va conectado directamente a la entrada analogica del pic; y leyendo algunos otros articulos me percaté que en la salida se conectaba un capacitor y una resistencia, ambos en serie y luego conectado a tierra.
Por las dudas no tienen algun circuito similar para ver la conexion?, gracias desde ya.