Buenas! Necesito ayuda con este conversor análogo digital, posee como periférico un lm35, la cual refleja la temperatura en un lcd de 16x2. El programa original era con un pic16f877, pero necesito migrar al 16f887 y la cuestión es que no me da, al mínimo me da 0º y al máximo 1º. Les agradezco su ayuda.
Les ajunto el .ASM y el .DNS
Este es el código
Les ajunto el .ASM y el .DNS
Este es el código
Código:
;;/////////////////////////////////////////////////////////////////////////
;/// conversor analogo digital ////
;/// ////
;/// lectura del adc con referencia a 2.55 v, canal 0 + lcd +lm35 ////
;////////////////////////////////////////////////////////////////////////
;/// programa en lenguaje ensamblador ////
;/// para el probar el pic16f877 ////
;/// octubre del 2008 ////
;/// [URL]http://monasezaelectronics.blogspot.com/[/URL] ////
;/// by: [EMAIL="ingnabor@gmail.com"]ingnabor@gmail.com[/EMAIL] ////
;////////////////////////////////////////////////////////////////////////
;-----[ Ajustes Iniciales ]----------
LIST P=PIC16F887
include "P16F887.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 ]-----
VectorReset:
org 0x000 ; Vector de todos los Re-inicios
goto Principal ; Primera línea del Programa Principal
VectorInt:
org 0x004
Paro:
goto Paro ; 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:
BSF STATUS,RP0 ;Pone a 1 el bit RP0 del STATUS , se selecciona el banco 1
MOVLW B'01100000'
;a 4MHz en el OSCCON el cual es para configurar la frecuencia del osc
;interno del Microcontrolador
MOVWF OSCCON ;Carga lo que hay en W a OSCCON osea que pasa el valor de W hacia OSCCON
BCF STATUS,RP0 ;Pone a 1 el bit RP0 del STATUS , se selecciona el banco 1
BSF STATUS,RP0
BSF STATUS,RP1 ;Pone a 1 el bit RP1 del STATUS para selecciona el Banco3, porque estaba
MOVLW B'00000001'
MOVWF ANSEL ;Con estas dos ultimas lineas de limpiar ANSEL configura una parte de Entradas
MOVLW B'00000000'
MOVWF ANSELH ;y salidas digitales
BCF STATUS,RP0
BCF STATUS,RP1 ;Pone a 0 el bit RP1 del STATUS para selecciona el Banco1 (B'01')
BSF STATUS,RP0 ;Pone a 1 el bit RP0 del STATUS , se selecciona el banco 1
MOVLW B'00000001' ;Con esta linea y la siguiente configura el PORTA como salidas
MOVWF TRISA
MOVLW B'00000000' ;Con esta linea y la siguiente configura el PORTB como salidas
MOVWF TRISB
MOVLW B'00000000' ;Con esta linea y la siguiente configura el PORTC como salidas
MOVWF TRISC
MOVLW B'00000000' ;Con esta linea y la siguiente configura el PORTD como salidas
MOVWF TRISD
MOVLW B'00000000' ;Con esta linea y la siguiente configura el PORTE como salidas
MOVWF TRISE
MOVLW B'10000000' ;Selecciona todos los pines analogicos y el resultado se guerda en ADRESL
MOVWF ADCON1
BCF STATUS,RP0
MOVLW B'11000001' ;Selecciona el Fosc/8,canal 0 del adc, enciende el conversor
MOVWF ADCON0
goto Leds
;-----------------------------------------------------------------------------------
;Una vez inicializado el puerto
Leds:
CLRF PORTA ;Limpia el puerto A
CLRF PORTB ;Limpia el puerto B
CLRF PORTC ;Limpia el puerto C
CLRF PORTD ;Limpia el puerto D
CLRF PORTE ;Limpia el puerto E
call inicialcd ;CONFIGURA EL LCD(INICIALIZA EL LCD)
Ciclo:
BSF ADCON0,1 ; empiesa la conversion
BTFSS PIR1,6 ;se espera a q termine la conversion
GOTO Ciclo
;BANKSEL ADRESL
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
ciclo:
movlw 0xFF
movwf contador
ciclo2:
decfsz contador
goto ciclo2
decfsz retardo
goto ciclo
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
Adjuntos
Última edición por un moderador: