Unir dos segmentos de código

Hola buenos días. Soy nuevo en su comunidad y también trabajando con los PIC
Estoy haciendo un proyecto para la universidad con un PIC16F877A en código ensamblador.
La idea es crear un dispensador que marque la temperatura, el sensor de temperatura LM35 se encuentra en la entrada RA0, las salidas de este se encuentran en el Puerto C y en el Puerto D

Por medio de un botón pulsador en el Puerto B en la entrada RB4, se prenderá un led en la salida RB0 simulando una bomba de dispensador.

Tengo los dos códigos funcionales, pero cuando quiero unirlos en un mismo código ensamblador, no funciona en proteus.


*** CODIGO SENSOR TEMPERATURA Y DISPLAY:
Código:
; ============== CARGAR LIBRERIAS DEL MICRONCONTROLADOR ============

LIST P=16F877A ; DE LA LISTA, SELECCIONA EL MICROCONTROLADOR A UTILIZAR.

#INCLUDE <P16F877A.INC> ; SE AGREGA LA LIBRERIA DEL MICROCONTROLADOR.

; ============== DIRECCIÓN DE ORIGEN O RESET ========================

ORG 0x00

;Variable para el DELAY del ADC

val equ h'20'

;Variables para el DELAY del ENABLE LCD

val2 equ 0x30

val1 equ 0x31

;Variables para separar el resultado de ADC en valor BCD

Unidades equ 0x32

Decenas equ 0x33

Centenas equ 0x34

Resto equ 0x35

org 0h

goto INICIO

org 05h

INICIO:

clrf PORTA ;Limpia el puerto A

clrf PORTC ;Limpia el puerto C

clrf PORTD ;Limpia el puerto D

bsf STATUS,RP0

bcf STATUS,RP1 ;Cambio la banco 1

;Configuración de puertos C-D para el LCD

clrf TRISC ;Configura PORTC como salida.

clrf TRISD ;Configura PORTD como salida.

;Configuración del puerto A para ADC

movlw 00h

movwf ADCON1 ;Configura puerto A y E como analógicos

movlw 3fh

movwf TRISA ;Configura el puerto A como entrada

movlw h'0'

bcf STATUS,RP0 ;Regresa al banco 0

;======================================================

; * ====== = = = INICIO DE PROGRAMA = = = ========= *

;======================================================

START

call START_LCD ; Inicializa LCD

goto START_ADC ; Comienza la lectura del Conv. A/D

; INICIA LCD

START_LCD:

bcf PORTC,0 ; RS=0 MODO INSTRUCCION

movlw 0x01 ; El comando 0x01 limpia la pantalla en el LCD

movwf PORTD

call COMANDO ; Se da de alta el comando

movlw 0x0C ; Selecciona la primera línea

movwf PORTD

call COMANDO ; Se da de alta el comando

movlw 0x3C ; Se configura el cursor

movwf PORTD

call COMANDO ; Se da de alta el comando

bsf PORTC, 0 ; Rs=1 MODO DATO

return

; RUTINA PARA ENVIAR UN DATO

ENVIA:

bsf PORTC, 0 ; RS=1 MODO DATO

call COMANDO ; Se da de alta el comando

return

; RUTINA PARA ENVIAR COMANDOS

COMANDO:

bsf PORTC, 1 ; Pone la señal ENABLE en 1

call DELAY2 ; Tiempo de espera

call DELAY2

bcf PORTC, 1 ; ENABLE=0

call DELAY2

return

; RUTINA PARA LIMPIAR PANTALLA LCD

ERASE_LCD

bcf PORTC,0 ; RS=0 MODO INSTRUCCION

movlw 0x01 ; El comando 0x01 limpia la pantalla en el LCD

movwf PORTD

call COMANDO ; Se da de alta el comando

bsf PORTC, 0 ; Rs=1 MODO DATO

return

; CONFIGURACION CONVERTIDOR A/D

START_ADC

movlw b'11000001' ;Configuración ADCON0.

movwf ADCON0 ;ADCS1=1 ADCS0=1 CHS2=0 CHS1=0 CHS0= GO/DONE=0 - ADON=1.

CICLO:

bsf ADCON0,2 ;Conversión en progreso GO=1.

call DELAY1 ;Espera que termine la conversión.

ESPERA btfsc ADCON0,2 ;Pregunta por DONE=0? (Terminó conversión).

goto ESPERA ;No, vuelve a preguntar.

movf ADRESH,0 ;Si

;===============================================================

; RUTINA QUE MUESTRA TEMPERATURA

; ============================================================

PRINT_TEMP

call ERASE_LCD ;Limpia LCD.

movlw 'T'

movwf PORTD

call ENVIA

movlw 'E'

movwf PORTD

call ENVIA

movlw 'M'

movwf PORTD

call ENVIA

movlw 'P'

movwf PORTD

call ENVIA

movlw '='

movwf PORTD

call ENVIA

movlw ' '

movwf PORTD

call ENVIA

call READ_TEMP ;Llamada a rutina que obtine el valor de la temperatura.

; a partir del resultado del Conv a/D.

movf Centenas,W ;Imprime el dígito de las centenas.

movwf PORTD

call ENVIA

movf Decenas,W ;Imprime el dígito de las decenas.

movwf PORTD

call ENVIA

movf Unidades,W ;Imprime el dígito de las unidades.

movwf PORTD

call ENVIA

movlw ' '

movwf PORTD

call ENVIA

movlw h'DF' ;Imprime el simbolo "°".

movwf PORTD

call ENVIA

movlw 'C'

movwf PORTD

call ENVIA

goto CICLO ; Repite el ciclo de lectura ADC Rutina que obtine.

; el valor de la temperatura a partir del resultado del Conv a/D.

;===================================================================

READ_TEMP:

clrf Centenas

clrf Decenas

clrf Unidades

movf ADRESH,W

addwf ADRESH,W ;Dupilca el valor de ADRESH para obtener un valor de

;temperatura real aprox.

movwf Resto ;Guarda el valor de ADRESH en Resto.

;================================================================

; COMIENZA EL PROCESO DE OTENCION DE VALORES BCD

; PARA CENTENAS, DECENAS Y UNIDADES ATRAVES DE RESTAS SUCESIVAS.

CENTENAS1

movlw d'100' ;W=d'100'

subwf Resto,W ;Resto - d'100' (W)

btfss STATUS,C ;Resto menor que d'100'?

goto DECENAS1 ;SI

movwf Resto ;NO, Salva el resto

incf Centenas,1 ;Incrementa el contador de centenas BCD

goto CENTENAS1 ;Realiza otra resta

DECENAS1

movlw d'10' ;W=d'10'

subwf Resto,W ;Resto - d'10' (W)

btfss STATUS,C ;Resto menor que d'10'?

goto UNIDADES1 ;Si

movwf Resto ;No, Salva el resto

incf Decenas,1 ;Incrementa el contador de centenas BCD

goto DECENAS1 ;Realiza otra resta

UNIDADES1

movf Resto,W ;El resto son la Unidades BCD

movwf Unidades

;=============================================================

;clrf Resto

;Rutina que obtiene el equivalente en ASCII

OBTEN_ASCII

movlw h'30'

iorwf Unidades,f

iorwf Decenas,f

iorwf Centenas,f

return

; ============================================================

;Rutina que genera un Delay de 20 microSeg aprox.

;para el Conv. A/D

DELAY1:

movlw h'30'

movwf val

Loop

decfsz val,1

goto Loop

return

;=====================================================================

;Subrutina de retardo para ENABLE_LCD

DELAY2:

movlw 0xFF

movwf val1

Loop1:

movlw 0xFF

movwf val2

Loop2:

decfsz val2,1

goto Loop2

decfsz val1,1

goto Loop1

return

end

1636601547569.png



*** CÓDIGO BOMBA ( SIMULADO UN LED DE SALIDA Y ACCIONADO POR UN BOTÓN DE ENTRADA)
Código:
; ============== CARGAR LIBRERIAS DEL MICRONCONTROLADOR ============

LIST P=16F877A ; DE LA LISTA, SELECCIONA EL MICROCONTROLADOR A UTILIZAR.

#INCLUDE "P16F877A.INC" ; SE AGREGA LA LIBRERIA DEL MICROCONTROLADOR.

__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF

#DEFINE LED PORTB, RB0

#DEFINE PULSADOR PORTB, RB4


; ============== DIRECCIÓN DE ORIGEN O RESET ========================

ORG 0X0000

BANKSEL TRISB ; Es para seleccionar un banco de memoria del PIC si el registro

; que le acompaña a continuacion es del banco 1, por ejemplo

; "banksel trisb", se situara en este banco de la misma forma

; que si lo hicieramos modificando el registro status.

BCF TRISB,RB0 ; Pone a Cero, el Bit correspondiente del Registro Especificado.

BSF TRISB,RB4 ; Pone a Uno el Bit correspondiente del Registro especificado.


BANKSEL PORTB


BCF LED

X1

BTFSS PULSADOR ; ?Evalúa el Bit especificado del Registro correspondiente e ignora la siguiente línea de código si esta a Uno?

GOTO X1

BSF LED ; ?Pone a Uno el Bit correspondiente del Registro especificado?

X2

BTFSC PULSADOR ; ?Evalúa el Bit especificado del Registro correspondiente e ignora la siguiente línea de código si esta a Cero?

GOTO X2

X3

BTFSS PULSADOR ; ?Evalúa el Bit especificado del Registro correspondiente e ignora la siguiente línea de código si esta a Uno?

GOTO X3

BCF LED ; ?Pone a Cero, el Bit correspondiente del Registro Especificado?

X4

BTFSC PULSADOR ; ?Evalúa el Bit especificado del Registro correspondiente e ignora la siguiente línea de código si esta a Cero?

GOTO X4

; ========================================================================================================

END
1636601698527.png



¿Me podrÍan ayudar con este problema, por favor? Se los agradecería mucho de verdad.
 
Esto no me gusta:
Código:
X1
BTFSS PULSADOR ; ?Evalúa el Bit especificado del Registro correspondiente e ignora la siguiente línea de código si esta a Uno?
GOTO X1
Eso crea un bucle que detendría la ejecución continua del programa.
Es mejor avanzar y salir si la condición no se cumple, que quedarse estancado hasta que se cumpla.
 
Buenas tardes. Heh intentado corregir el problema modificando el programa y aún sigo teniendo problemas con la última sección, que no los lee.
N
o sé qué podría estar fallándome. Una disculpa, estoy aprendiendo a usar el foro y la programación en ensamblador.


Código:
; =========================================================================
; ==============CARGAR LIBRERIAS DEL MICRONCONTROLADOR ====================
; =========================================================================
LIST P=16F877A          ; DE LA LISTA, SELECCIONA EL MICROCONTROLADOR A UTILIZAR.
INCLUDE "P16F877A.INC"  ; SE AGREGA LA LIBRERIA DEL MICROCONTROLADOR .
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
; ========================== DECLARACION DE VARIABLES =====================
                ; Distribución de la memoria RAM del microcontrolador,
                ; observando que para utilizar las variables
                ; ubicadas en las direcciones 0x20 y 0x21 (como las hemos definido),
                ; debemos de estar en el banco 0.
     M EQU 0x20 ; Direccion de memoria de la variable
     N EQU 0x21 ; Direccion de memoria de la variable
     O EQU 0x22 ; Direccion de memoria de la variable
     ORG  0X00  ; Reset
;---------------------------------------------------------------------------
; =========================================================================
; ========== * == SALIDAS DEL MOTOR, COMPRESOR Y AVANICO == * =============
; =========================================================================
;---------------------------------------------------------------------------
; PUERTO E COMO SALIDA
     banksel TRISE
     clrf    TRISE   ; Poner a 0, y como salida
     banksel PORTE   ; Nos vamos al PUERTO E y prendemos los 3 leds
; --------------------------------------------------------------------------
     movlw   b'111'  ; 111 al registro,
     movwf   PORTE   ; Tres bits encendidos
;---------------------------------------------------------------------------
; =========================================================================
; ======== * == (TERMOMETRO)`CONVERTIDOR ANALOGICO DIGITAL == * ===========
; =========================================================================
;---------------------------------------------------------------------------
; CONVERSION ANALOGICA
     bsf   STATUS,RP0     ; Pone  1 a RP0
     bcf   STATUS,RP1     ; Pone  0 a RP1  ( Banco 1 )
; --------------------------------------------------------------------------
     bsf   TRISA, RA0     ; Entrada Analogica
     clrf  TRISC          ; Salida digital
; --------------------------------------------------------------------------
     bcf   STATUS,RP0     ; Pone  0 a RP0
     bcf   STATUS,RP1     ; Pone  0 a RP1  ( Banco 0 )
; --------------------------------------------------------------------------
     movlw  b'110000101'  ; Configuracion ADCON0
     movwf  ADCON0        ; Bit 7-6 = Reloj // 11 Reloj interno
                          ;
; --------------------------------------------------------------------------
     bsf   STATUS,RP0     ; Pone  1 a RP0
     bcf   STATUS,RP1     ; Pone  0 a RP1  ( Banco 1 )
; --------------------------------------------------------------------------
     movlw  b'00001110'   ; Configuracion ADCON1
     movwf  ADCON1        ; CONFIGURACION RA0 (ANALOGICA)
; --------------------------------------------------------------------------
     bcf   STATUS,RP0     ; Pone  0 a RP0
     bcf   STATUS,RP1     ; Pone  0 a RP1  ( Banco 0 )
; --------------------------------------------------------------------------
PRINCIPIO
     movf   ADRESH, 0      ; Registro alto del resultado de la conversion a/d.
     movwf  PORTC
     call  DELAY
     bsf   ADCON0, GO_DONE ; Inicia nueva CONVERSION (2BIT)
     goto  PRINCIPIO
; --------------------------------------------------------------------------
DELAY
     movlw  D'5'
     movwf  O
TRES
     movlw  D'80'
     movwf  M
DOS
     movlw  D'250'
     movwf  N
UNO
     nop
     nop
     decfsz N,1
     goto   UNO
     decfsz M,1
     goto   DOS
     decfsz C,1
     goto   TRES
return
; =========================================================================
; ================ SALIDA Y ENTRADA DE BOMBAS =============================
; =========================================================================
; PUERTO B SALIDA Y ENTRADA DIGITAL
     bsf  STATUS,RP0  ; pone 1 a RP0
     bcf  STATUS,RP1  ; pone 1 a RP1 ( BANCO 3 )
; -------------------------------------------------------------------------
     bcf   TRISB,RB0  ; salida
     bsf   TRISD,RD0  ; entrada
; -------------------------------------------------------------------------
     bcf  STATUS,RP0  ; pone a 0 RP0
     bcf  STATUS,RP1  ; pone a 0 RP1
; -------------------------------------------------------------------------
     bcf   PORTB,RB0
; -------------------------------------------------------------------------
CICLO
     movf  PORTD, W ; MUEVE PUERTO A -> W.
     movwf PORTB ; LO QUE ESTA EN W SE MUEVE AL PUERTO B.
     goto CICLO; SALTA A LA DIRECCIÓN DE LA ETIQUETA ?CICLO2.
; -------------------------------------------------------------------------

END
 
Última edición por un moderador:
Es lógico, no existe ninguna llamada a esas secciones del programa porque se queda dentro del bucle "PRINCIPIO" que solo incluye la subrutina "DELAY" y regresa.
Todo el resto del programa está ignorado.
Para que funcione correctamente el llamado a esa seccion donde tiene que estar colocado? ya lo acomode y puse el puerto de salida y entrada digital con la entrada analogica y salida, pero que creo que me estoy quedando dentro del bucle aun. Ahora si prende el led al tocar el push boton pero al convertidor no convierte solo se queda prendidos los mismos led, una disculpa por las molestias pero de verdad esto es nuevo para mi, esto fue lo que modifique:

Código:
; =========================================================================
; ============ * ============ ENCABEZADO ============ * ===================
; =========================================================================
; DESCRIPCION: FUENTE DE SODAS, PROYECTO 
; ELABORÓ: 
; FECHA: 10 DE NOVIEMBRE DE 2021.
; LUGAR: 
; VERSIÓN: 1.0
; =========================================================================
; ==============CARGAR LIBRERIAS DEL MICRONCONTROLADOR ====================
; =========================================================================
LIST P=16F877A          ; DE LA LISTA, SELECCIONA EL MICROCONTROLADOR A UTILIZAR.
INCLUDE "P16F877A.INC"  ; SE AGREGA LA LIBRERIA DEL MICROCONTROLADOR .
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
; ========================== DECLARACION DE VARIABLES =====================
                ; Distribución de la memoria RAM del microcontrolador,
                ; observando que para utilizar las variables
                ; ubicadas en las direcciones 0x20 y 0x21 (como las hemos definido),
                ; debemos de estar en el banco 0.
     M EQU 0x20 ; Direccion de memoria de la variable
     N EQU 0x21 ; Direccion de memoria de la variable
     O EQU 0x22 ; Direccion de memoria de la variable
     ORG  0X00  ; Reset

;---------------------------------------------------------------------------
; =========================================================================
; ======== * == (TERMOMETRO)`CONVERTIDOR ANALOGICO DIGITAL == * ===========
; =========================================================================
;---------------------------------------------------------------------------
; CONVERSION ANALOGICA
     bsf   STATUS,RP0     ; Pone  1 a RP0
     bcf   STATUS,RP1     ; Pone  0 a RP1  ( Banco 1 )
; --------------------------------------------------------------------------

     bsf   TRISA, RA0    ; Entrada Analogica
     clrf  TRISC         ; Salida digital

     bcf   TRISB,RB0  ; salida              / modificado ***
     bsf   TRISD,RD0  ; entrada           / modificado ***

; --------------------------------------------------------------------------
     bcf   STATUS,RP0     ; Pone  0 a RP0
     bcf   STATUS,RP1     ; Pone  0 a RP1  ( Banco 0 )
; --------------------------------------------------------------------------
     movlw  b'110000101'  ; Configuracion ADCON0
     movwf  ADCON0        ; Bit 7-6 = Reloj // 11 Reloj interno
                          ;
; --------------------------------------------------------------------------
     bsf   STATUS,RP0     ; Pone  1 a RP0
     bcf   STATUS,RP1     ; Pone  0 a RP1  ( Banco 1 )
; --------------------------------------------------------------------------
     movlw  b'00001110'   ; Configuracion ADCON1
     movwf  ADCON1        ; CONFIGURACION RA0 (ANALOGICA)
; --------------------------------------------------------------------------
     bcf   STATUS,RP0     ; Pone  0 a RP0
     bcf   STATUS,RP1     ; Pone  0 a RP1  ( Banco 0 )
; --------------------------------------------------------------------------

; SECCION MODIFICADA

     CICLO                                      ; modificado
     movf  PORTD, W ; MUEVE PUERTO A -> W.         // modificado           
     movwf PORTB ; LO QUE ESTA EN W SE MUEVE AL PUERTO B.  // modificado
     GOTO  CICLO                         ; // modificado
     GOTO  PRINCIPIO                     ; // modificado

; SECCION MODIFICADA

PRINCIPIO
     movf   ADRESH, 0      ; Registro alto del resultado de la conversion a/d.
     movwf  PORTC
     call  DELAY
     bsf   ADCON0, GO_DONE ; Inicia nueva CONVERSION (2BIT)
     goto   PRINCIPIO
; --------------------------------------------------------------------------
DELAY
     movlw  D'5'
     movwf  O
TRES
     movlw  D'80'
     movwf  M
DOS
     movlw  D'250'
     movwf  N
UNO
     nop
     nop
     decfsz N,1
     goto   UNO
     decfsz M,1
     goto   DOS
     decfsz C,1
     goto   TRES
return
; -------------------------------------------------------------------------

END

1637796564563.png
 
Atrás
Arriba