Bueno un cordial a los mienbros del foro soy nuevo por aqui y bueno necesito de su ayuda lo que pasa es que estoy tratando de medir la temperatura con el lm35 y displayarla, mi codigo corre y lo simule en proteus logro visualizar la medicion y mando un mensaje como introduccion al inicio del programa tu bien hasta ahi ocurre que lo armo en el proto y no manda nada pense que el LCD estaba mal o que mi quemador estaba mal pero probe con otro programa y si funciona nose que pueda estar pasando si el error esat en mi codigo Help me!! por favor mi codigo esta en asembler y adjunto la simulacion en proteus y el .HEX aqui lo dejo gracias
Bueno amigos buscando y buscando e intentando encontre la falla es la cabecera de los fusibles que estaba usando para este modelo de PIC debia de ser
__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF
estaba usando la cabecera mal debido a que me guiaba en el libro del pic16f84 de Enrique Palacios buenoa terminar mi rele electronico y cuando lo termine lo subire para que lo puedan mejorar saludos!!!
Código:
; ZONA DE DATOS **********************************************************************
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
ORG 0
pcl equ 0x02 ;Contador de programa (Parte baja)
estado equ 0x03 ;Registro de estados
ptoa equ 0x05 ;Puertos de E/S
ptob equ 0x06
ptoc equ 0x07
intcon equ 0x0B ;Controlador de interrupciones
eedata equ 0x0C ;Registro de datos de la EEPROM
eeaddr equ 0x0D ;Registro de direccion de la EEPROM
adres equ 0x1E ;Resultado de la conversión A/D (HIGH / LOW)
adcon equ 0x1F ;Configuración del conversor A/D
uni equ 0x20 ;Usados para manejar los datos a mostrar en display
dec equ 0x21
cen equ 0x22
tiempo1 equ 0x23 ;Usados para temporizar
tiempo2 equ 0x24
letra equ 0x25 ;Usado para apuntar la letra a colocar en el LCD
tempact equ 0x26 ;Temperatura de activación
corract equ 0x27 ;Corriente de activacion
buffer equ 0x28 ;Usado como registro temporal ; El contador a visualizar.
#define CARRY estado, 0 ;Bit de acarreo
#define CERO estado, 2 ;Flag indicador de resultado cero
#define R0 estado, 5 ;Bit 0 selector de página de memoria
#define R1 estado, 6 ;Bit 1 selector de página de memoria
#define ADGO adcon, 2 ;Bit que inicia la conversión (1) / Indica finalización (0)
#define EEREAD eedata, 0 ;Bit que inicia la lectura de la EEPROM
#define EEWRITE eedata, 1 ;Bit que inicia la escritura de la EEPROM - Indica finalización
#define EEWREN eedata, 2 ;Bit que habilita la escritura en la EEPROM
#define EEAREA eedata, 7 ;Bit que selecciona el área de EEPROM a utilizar (0=AREA DE DATOS)
#define MINS ptoa, 1 ;Sube el punto mínimo
#define MINB ptoa, 2 ;Baja el punto mínimo
#define MAXS ptoa, 3 ;Sube el punto máximo
#define MAXB ptoa, 4 ;Baja el punto máximo
#define BUZZER ptoc, 3 ;Salida al aviso acústico
#define RELE ptoc, 4 ;Relé que maneja la carga (calefactor / enfriador)
#define LCDE ptoc, 6 ;Habilitación del LCD
#define LCDRS ptoc, 7 ;Selección de modo del LCD
; ZONA DE CÓDIGOS ********************************************************************
Inicio
bsf R0 ; Acceso al Banco 1.
bcf R1
movlw b'00011111' ;Configura puerto A
movwf ptoa
clrf ptob ;Puerto B completo como salidas (bus del LCD)
clrf ptoc ;Puerto B completo como salidas
movlw b'10001110' ;Configura el coversor A/D ADCS1=1 AADCS0=0 => Fosc=/32
;CHS2=0 CHS1=0 CHS0=1 Canal AN1 por donde entrara la señal
movwf adcon ;AN0 como única entrada análoga(ojo)
bsf R1 ;Acceso al banco 3
bcf EEAREA ;Selecciona el banco de EEPROM de datos
bcf R1 ;Acceso al banco 0
bcf R0
movlw b'01000001' ;Enciende y configura el convertidor A/D - Selecciona AN0 como entrada
movwf adcon
clrf ptoa ;Apaga todo
clrf ptob
clrf ptoc
call LCD
call LECTURA ;llama a la lectura de la eeprom
call CICLO
LECTURA bsf R1 ;Acceso al banco 2
clrf eeaddr ;Direcciona la primera posición de la EEPROM
bsf R0 ;Pasa a la página 3 de memoria
bsf EEREAD ;Inicia la lectura de la EEPROM
bcf R0 ;Acceso al banco 2
movf eedata, 0 ;Dato Leído de la EEPROM -> W (eedata,0 mueve el valor de eedata en w (0 indica en w))
movwf tempact ;Guarda el dato leído de la EEPROM en tempact (punto de activación del relé x temperatura)
incf eeaddr ;Direcciona a la segunda posición de la EEPROM
bsf R0 ;Pasa a la página 3 de memoria
bsf EEREAD ;Inicia la lectura de la EEPROM
bcf R0 ;Vuelve a la página 3 de memoria
movf eedata, 0 ;Dato Leído de la EEPROM -> W
movwf corract ;Guarda el dato leído de la EEPROM en corract (punto de desactivación del relé x corriente)
bcf R1 ;Acceso banco 0
return
LCD
movlw b'00111000' ;Comunicación con el LCD a ocho bits - Dos líneas de texto
call CONTROL
movlw d'2'
call DEMORA ;Demora 2ms
movlw b'00000110' ;Mensaje estático, se desplaza el cursor hacia la derecha
call CONTROL
movlw d'2'
call DEMORA ;Demora 2ms
movlw b'00001100' ;Enciende el display - Oculta el cursor - Caracter fijo
call CONTROL
movlw d'2'
call DEMORA ;Demora 2ms
movlw b'00000001' ;Limpia la pantalla y pone cursor en posición inicial
call CONTROL
movlw d'2'
call DEMORA ;Demora 2ms
clrf letra ;Coloca el título en el LCD
call OTRA
call OTRA2
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
call Retardo_500ms
movlw b'00000001' ;Limpia la pantalla y pone cursor en posición inicial
call CONTROL
return
OTRA movf letra, 0 ;Letra actual -> W
call LINEA1 ;Obtiene el caracter a colocar desde la tabla
call DATO ;Envía el caracter al LCD
incf letra, 1
movf letra, 0 ;Comprueba si ya envió los 16 caracteres del título
sublw d'16'
btfss CERO
goto OTRA ;Si no llego a la letra 16 sigue enviando
movlw 0xC0 ;Posiciona el cursor en la 2da. linea
call CONTROL
movlw d'1'
call DEMORA ;Demora 1ms
clrf letra ;Coloca el título en el LCD
return
OTRA2 movf letra, 0 ;Letra actual -> W
call LINEA2 ;Obtiene el caracter a colocar desde la tabla
call DATO ;Envía el caracter al LCD
incf letra, 1
movf letra, 0 ;Comprueba si ya envió los 16 caracteres del título
sublw d'16'
btfss CERO
goto OTRA2 ;Si no llego a la letra 16 sigue enviando
return
CICLO bsf ADGO ;Inicia la conversión A/D
btfsc ADGO ;Espera que termine de convertir
goto $ -1
bsf R0 ;Pasa a página 1 (para acceder a los ocho bits bajos del resultado)
movf adres, 0 ;Resultado de conversión -> W
bcf R0 ;Pasa a página 1
movwf buffer ;Guarda el dato obtenido de ADRESL en el buffer temporal
bcf CARRY ;Limpia el CARRY
btfsc adres, 0 ;Mira el bit menos significativo de ADRESH (Bit 8)
bsf CARRY ;Si está en 1 pone en uno el carry
rrf buffer, 1 ;Hace desaparecer el bit 0 de ADRESL, mete el bit 0 de ADRESH por el 7 de ADRESL
movf buffer, 0 ;Dato digitalizado -> W
call DECIMAL ;Obtiene UNI, DEC y CEN con el agregado de 30h para la tabla ASCII
movlw 0x8D ;Coloca el cursor en la posición 0Dh de la pantalla.
call CONTROL
movf cen, 0 ;Coloca en el LCD las centenas
call DATO
movf dec, 0 ;Coloca las decenas
call DATO
movf uni, 0 ;Coloca las unidades
call DATO
goto CICLO ;Vuelve a medir y mostrar
LINEA1 addwf pcl, 1 ;Suma el contenido de W al contador de programa (para explorar la tabla)
retlw "R"
retlw "E"
retlw "L"
retlw "E"
retlw " "
retlw "E"
retlw "L"
retlw "E"
retlw "C"
retlw "T"
retlw "R"
retlw "O"
retlw "N"
retlw "I"
retlw "C"
retlw "O"
LINEA2 addwf pcl, 1 ;Suma el contenido de W al contador de programa (para explorar la tabla)
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw "U"
retlw "C"
retlw "S"
retlw "M"
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
CONTROL bcf LCDRS ;Pone en bajo la línea de modo del LCD (Control)
goto ENVIAR ;Se saltea la sig. línea
DATO bsf LCDRS ;Pone en alto la línea de modo del LCD (Dato)
ENVIAR movwf ptob ;Coloca el dato o control a enviar en el bus del LCD
movlw d'1'
call DEMORA ;Demora 1ms
bsf LCDE ;Habilita el LCD
movlw d'1'
call DEMORA ;Demora 1ms
bcf LCDE ;Deshabilita el LCD
movlw d'1'
call DEMORA ;Demora 1ms
return
DECIMAL movwf uni ;Convierte el dato presente en W en UNI, DEC y CEN
clrf dec
clrf cen
movlw d'100' ;Determina la cant. de centenas
CENTENA subwf uni, 1
btfss CARRY
goto CIEN
incf cen, 1
goto CENTENA
CIEN addwf uni, 1
movlw d'10' ;Determina la cant. de decenas
DECENA subwf uni, 1
btfss CARRY
goto DIEZ
incf dec, 1
goto DECENA
DIEZ addwf uni, 1 ;Uni queda con la cant. de unidades (sin decenas ni centenas)
movlw 0x30 ;Le suma 30h a los valores de UNI, DEC y CEN para que queden en ASCII
addwf uni, 1
addwf dec, 1
addwf cen, 1
return
DEMORA movwf tiempo2 ;Demora tantos milisegundos como valor en w
TOP2 movlw d'110'
movwf tiempo1
TOP1 nop
nop
nop
nop
nop
nop
decfsz tiempo1, 1
goto TOP1
decfsz tiempo2, 1
goto TOP2
return
CBLOCK
R_ContA ; Contadores para los retardos.
R_ContB
ENDC
Retardo_500ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'500' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardos_ms
movwf R_ContB ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina.
return
;org 0x2100 ;Guarda los parámetros por default en la EEPROM
;data 0x28 ;Punto de activación: 40 grados
;data 0x32 ;Punto de desactivación: 50 grados
end
Bueno amigos buscando y buscando e intentando encontre la falla es la cabecera de los fusibles que estaba usando para este modelo de PIC debia de ser
__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF
estaba usando la cabecera mal debido a que me guiaba en el libro del pic16f84 de Enrique Palacios buenoa terminar mi rele electronico y cuando lo termine lo subire para que lo puedan mejorar saludos!!!
Adjuntos
Última edición: