desktop

Problema con un programa en lenguaje ensamblador

Mi problema es que estoy haciendo un programa con el microcontrolador PIC16F873A, en el cual tengo que conectar un display de siete segmentos, push bottons, etc.
Mi programa tiene que hacer que al presionar RB0, muestre en el display un conteo del 0 al 5, al presionar RB1, mostrar un nombre y al presionar RB2, mostrar las vocales.

Hice mi programa, pero al momento de conectarlo sólo me muestra el conteo del 0 al 5 y no me responde ninguno de los botones.
¿Alguien sabe cual podría ser el problema?

Aquí anexaré mi programa:
PHP:
LIST        P=16F873A
        INCLUDE  <P16F873A.INC>
        VALORA     EQU    0X20
        VALORB    EQU    0X21
        VALORC    EQU    0X22
            
        BSF        STATUS,5
        BSF        TRISB,0
        BSF        TRISB,1
        BSF        TRISB,2
        CLRF            TRISC
        BCF        STATUS,5
    
INICIO    BTFSS    PORTC,0
        GOTO    X
 X            GOTO            NUM
         BTFSS    PORTC,1
         GOTO    Y
 Y        GOTO            NOMBRE    
        BTFSS    PORTC,2
        GOTO            Y2
 Y2            GOTO            AEI
        GOTO      INICIO
    
        
NUM        MOVLW    0X3F
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW    0X06
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW    0X5B
        MOVWF    PORTC
        CALL           RETARDO
        MOVLW    0X4F
        MOVWF    PORTC
        CALL             RETARDO
        MOVLW    0X66
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW    0X6D
        MOVWF    PORTC    
        CALL           RETARDO
        GOTO           INICIO
        
AEI        MOVLW    0X77
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW    0X79
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW    0X19
        MOVWF    PORTC    
        CALL       RETARDO
        MOVLW    0X3F
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW     0X1C
        MOVWF    PORTC
        CALL            RETARDO
        GOTO      AEI
        
NOMBRE    MOVLW    0X5E
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW    0X77    
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW    0X54
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW    0X79
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW    0X38
        MOVWF    PORTC
        CALL            RETARDO
        MOVLW    0X77
        MOVWF    PORTC
        CALL            RETARDO
        GOTO     Y
        
RETARDO    MOVLW    .25
        MOVWF    VALORA
LAZO1    MOVLW    .255
        MOVWF    VALORB
LAZO2    MOVLW    .255
        MOVWF    VALORC
LAZO3    DECFSZ    VALORC, 1
        GOTO            LAZO3
        DECFSZ    VALORB, 1
        GOTO            LAZO2
        DECFSZ    VALORA, 1
        GOTO            LAZO1
        RETURN
        END
Gracias por su atención.

PD: Todos los números y letras los puse en código para 7 segmentos, por si tienen dudas.
 
Última edición por un moderador:
Hola, podrías por favor subir tu simulación, por que en tu explicación dices que tienes tres botones en el RB0, RB1,Rb2 sin embargo en tu codigo tu estas leyendo los botones conectados en el puerto C
 
El problema es que estas leyendo los pulsadores en el puerto C, en la cabecera declaraste correctamente que RB0, RB1 y RB2 eran entradas y el puerto C es salida, pero cuando lees los botones, leés el puerto C.
 
En dado caso que se estuvieran leyendo los bits correctos del puerto B, la estructura de comparación está mal.
Ya que en cualquier situación, las comparaciones siempre llegan a la subrutina que se quiere invocar.
Pero como el proceso está mal desde el principio, siempre se llegará a la subrutina "NUM" y regresará.
 
Ademas tus rutinas "AEI" y "Nombre" tienen un bucle infinito del cual solo saldría si reseteas la micro.
la extructura de tu código tendría que ser así:
1- leer los botones, si es pulsado tendría que ir a la rutina a la que tu le has asignado
2- ejecutar la rutina.
3- volver al inicio para leer nuevamente los botones
Suerte.
 
Muchas gracias a todos. Los comentarios me fueron realmente útiles.
Al parecer ese sí era mi error.

Aquí les dejo el programa corregido por si lo quieren usar:
PHP:
LIST      P=16F873A
        INCLUDE  <P16F873A.INC>
        VALORA     EQU    0X20
        VALORB    EQU    0X21
        VALORC    EQU    0X22
            
        BSF        STATUS,5
        BSF        TRISB,0
        BSF        TRISB,1
        BSF        TRISB,2
        CLRF    TRISC
        BCF        STATUS,5
    
INICIO    BTFSS    PORTB,0
        GOTO    X
         GOTO    NUM
X        BTFSS    PORTB, 1
        GOTO    Y
        GOTO    AEI
        BTFSS    PORTB, 2
        GOTO    INICIO
        GOTO    NUM
    
        
NUM        MOVLW    0X3F
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X06
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X5B
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X4F
        MOVWF    PORTC
        CALL     RETARDO
        MOVLW    0X66
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X6D
        MOVWF    PORTC    
        CALL    RETARDO
        GOTO    INICIO
        
AEI        MOVLW    0X77
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X79
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X19
        MOVWF    PORTC    
        CALL     RETARDO
        MOVLW    0X3F
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW     0X1C
        MOVWF    PORTC
        CALL    RETARDO
        GOTO    INICIO
        
Y        MOVLW    0X5E; d
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X77; a    
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X54; n
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X19; i
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X79; e
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X38; l
        MOVWF    PORTC
        CALL    RETARDO
        MOVLW    0X77; a
        MOVWF    PORTC
        CALL    RETARDO
        GOTO    INICIO
        
RETARDO    MOVLW    .25
        MOVWF    VALORA
LAZO1    MOVLW    .255
        MOVWF    VALORB
LAZO2    MOVLW    .255
        MOVWF    VALORC
LAZO3    DECFSZ    VALORC, 1
        GOTO    LAZO3
        DECFSZ    VALORB, 1
        GOTO    LAZO2
        DECFSZ    VALORA, 1
        GOTO    LAZO1
        RETURN
        END
 
Última edición por un moderador:
Hola, tu rutina de comparacion sigue estando mal
tendria que ser asi
PHP:
INICIO
   BSF STATUS,5
   CLRF PORTC
   BCF STATUS,5
   BTFSS	PORTB,0 ;comprobar si el boton es pulsado, si es asi saltar a goto num	
   GOTO	NUM
   BTFSS	PORTB,1 ;comprobar si el boton es pulsado, si es asi saltar a goto Y
   GOTO	Y	
   BTFSS	PORTB,2;comprobar si el boton es pulsado, si es asi saltar a goto AEI
   GOTO	AEI
   GOTO INICIO
PD:puedes añadir una rutina antirebote para los botones
 
Si está bien así, pero el compañero unashabashida, lo que requiere es que la subrutina se cumpla cuando el pulsador esté en 1
Y en el programa que expones, se irá a la subrutina cuando el pulsador esté en 0.

Lo básico es de ésta forma cuando cualquier pulsador se encuentre en 1:
PHP:
programa
    btfss    PORTB,0
    goto    pulsador_2
    call    rutina_1
pulsador_2
    btfss    PORTB,1
    goto    pulsador_3
    call    rutina_2
pulsador_3
    btfss    PORTB,2
    goto    pulsador_4
    call    rutina_3
pulsador_4
    btfss    PORTB,3
    goto    programa
    call    rutina_4
    
    goto    programa
La comprobación se puede realizar de varias maneras, desde la más sencilla, hasta la más complicada.

Adjunto una forma usando una máscara, operaciones lógicas y con simple función antirebote.

PD: Recordar que...
BTFSS = Bit Test F, Skip If Set
BTFSC = Bit Test F, Skip If Clear
 

Adjuntos

  • 16F84A Leer pulsadores.rar
    16.5 KB · Visitas: 4
Última edición:
UPs es cierto, tenes razon pase por alto eso, porque yo siempre lo hago cuando el pulsador esta en cero. perdonen.
tendria que ser asi:
PHP:
 BSF STATUS,5
    CLRF PORTC
    BCF STATUS,5
    BTFSS	PORTB,0
    goto X
    GOTO	NUM
X
    BTFSS	PORTB,1
    goto Y
    GOTO	NOMBRE	
Y   
    BTFSS	PORTB,2
    goto INICIO
    GOTO	AEI
    GOTO INICIO
 
Atrás
Arriba