Hola, estoy haciendo un programa de control de temperatura lm35 en el cual la temperatura se debe mostrar el lcd, en la simulacion de proteus si funciona, osea displaya la temperatura, pero cuando lo implemento no sale nada, ( si prende el lcd, pero no envia ningun dato al parecer.)
Gracias de antemano
A continuacion les adjunto el programa y la imagen de la simulacion.
el programa:
;-----[ Ajustes Iniciales ]----------
LIST P=PIC16F877A
include "P16F877A.INC"
;include "Macros.asm"
;----------------------------------------------------------------------------------
;-----[ Literales y Constantes ]-----
;----------------------------------------------------------------------------------
;-----[ Variables ]-----
contador equ 0x30
retardo equ 0x31
HEXADECIMAL equ 0X32
ASCII_M equ 0x33
ASCII_H equ 0x34
ASCII_L equ 0x35
;compara equ 0x32
;----------------------------------------------------------------------------------
;-----[ Vectores ]-----
org 0x000 ; Vector de todos los Re-inicios
goto Principal ; Primera línea del Programa Principal
org 0x005
; Para si (por error) ocurriera una interrupción
;----------------------------------------------------------------------------------
;-----[ Tablas ]-----
;
; Sin tablas
;----------------------------------------------------------------------------------
;-----[ Programa Principal ]-----
;
Principal
call Inicio ; Inicia todo lo necesario
Lazo
goto Leds ; Recibe la informacion
;-----[ Inicio ]-----
;-----------------------------------------------------------------------------------
;Inicialización del puerto A:
Inicio
CLRF STATUS ;Selecciona Banco 0
CLRF PORTB ;Inicializa latches de datos de PORTB
MOVLW 0x41 ;Selecciona el Fosc/8,canal 0 del adc, enciende el conversor
MOVWF ADCON0
BSF STATUS, RP0 ; Se selecciona el banco 1
BCF STATUS, RP1
MOVLW 0x01 ;Selecciona todos los pines analogicos y el resultado se guerda en ADRESL
MOVWF ADCON1
MOVLW 0xFF ;configura todas patitas del puerto A como entradas
MOVWF TRISA
MOVLW 0x00 ;configura todas patitas de puerto B
MOVWF TRISB ;como salidas digitales
MOVWF TRISC ;como salidas digitales
return
;-----------------------------------------------------------------------------------
;Una vez inicializado el puerto
Leds
BCF STATUS,RP0 ;regresa al banco 0
call inicialcd ;CONFIGURA EL LCD(INICIALIZA EL LCD)
Ciclo
BSF ADCON0,2 ; empiesa la conversion
BTFSS PIR1,6 ;se espera a q termine la conversion
GOTO Ciclo
movf ADRESL,w ;se mueve el valor de la conversion a w
BCF PIR1,6 ;se limpia el bit ADIF
CALL Hex_Ascii ;llama a convertir a ascii
call limpia ;limpia el lcd
movf ASCII_H,w ;imprime el valor de centenas en el lcd
call envia
movf ASCII_M,w ;imprime el valor de decenas en el lcd
call envia
movf ASCII_L,w ;imprime el valor de unidades en el lcd
call envia
movlw 0xDF ;visualiza "°"
call envia
movlw "C"
call envia
GOTO Ciclo
;-----------------------------------------------------------------------------------
delay
movlw 0xF9
movwf retardo
cicloGG
movlw 0xFF
movwf contador
ciclo2
decfsz contador
goto ciclo2
decfsz retardo
goto cicloGG
return
;-----------------------------------------------------------------------------------
;subrutina para inicializar el lcd
inicialcd
movlw 0x01 ; El comando 0x01 limpia la pantalla en el LCD
call comando ; Se da de alta el comando
movlw 0x0C ; Se selecciona la primera linea
call comando ; Se da de alta el comando
movlw 0x3C ; Se configura el cursor
call comando ; Se da de alta el comando
bsf PORTB, 1 ; Rs se pone en 1 para deshabilitar el uso de comandos
return
;-----------------------------------------------------------------------------------
;subrutina para enviar comandos
comando
movwf PORTC
bsf PORTB, 0 ; Pone la señal E en 1, espera un tiempo y luego la regresa a
call delay
call delay
bcf PORTB, 0
call delay
return
;subrutina para enviar un dato
;-----------------------------------------------------------------------------------
envia
bsf PORTB, 1 ; rs en 1
call comando
return
;-----------------------------------------------------------------------------------
linea2
bcf PORTB, 1 ; rs en 0
movlw 0xc0 ; selecciona linea 2 pantalla en el LCD
call comando ; Se da de alta el comando
return
;-----------------------------------------------------------------------------------
limpia
bcf PORTB, 1 ; rs en 0
movlw 0x01 ; limpia lcd pantalla en el LCD
call comando ; Se da de alta el comando
return
;-----------------------------------------------------------------------------------
;convertimos el valor del adc a decimal(ascii)
Hex_Ascii ;cargar en W el dato hex.
MOVWF HEXADECIMAL
clrf ASCII_H ;Para BCD D'0'
clrf ASCII_M ;Para BCD D'0'
clrf ASCII_L ;Para BCD D'0'
Centenas
;-----------------------------------------------------------------------------------
movlw D'100' ;D'100' --> W
subwf HEXADECIMAL,W ;HEXADECIMAL - D'100' --> W
btfss STATUS,C ;¿ HEXADECIMAL es menor que D'100' ?
goto Decenas ;Si
movwf HEXADECIMAL ;Salva el resto
incf ASCII_H,F ;Incrementa el contador de centenas BCD
goto Centenas ;Vuelve por otros D'100'
;-----------------------------------------------------------------------------------
Decenas
movlw D'10' ;D'10' --> W
subwf HEXADECIMAL,W ;HEXADECIMAL - D'10' --> W
btfss STATUS,C ;¿ HEXADECIMAL es menor que D'10' ?
goto Unidades ;Si
movwf HEXADECIMAL ;Salva el resto
incf ASCII_M,F ;Incrementa el contador de decenas BCD
goto Decenas ;Vuelve por otros D'10'
;-----------------------------------------------------------------------------------
Unidades
movf HEXADECIMAL,W ;El resto pertenece
movwf ASCII_L ;a las unidades BCD
clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL
;-----------------------------------------------------------------------------------
Bcd_A_Ascii
movlw H'30' ;H'30' --> W
iorwf ASCII_L,F ;Convierte de BCD a ASCII
iorwf ASCII_M,F ;Convierte de BCD a ASCII
movf ASCII_H,F ;ASCII_H --> F
btfsc STATUS,Z ;? ASCII_H es D'00' ?
goto Espacio ;Si
movlw H'30' ;H'30' --> W
iorwf ASCII_H,F ;Convierte de BCD a ASCII
return ;Retorna
;-----------------------------------------------------------------------------------
Espacio
movlw '0' ;A' ' --> W
movwf ASCII_H ;A' ' --> ASCII_H
return ;Retorna
END