CAD migracion de 16f877 a 16f887

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
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

  • ADC- A 16F887.rar
    63.1 KB · Visitas: 4
Última edición por un moderador:
Atrás
Arriba