Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

08/05/2016 #1

Avatar de unashabashida

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:
Código 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.
08/05/2016 #2

Avatar de roberttorres

lenguaje esamblador
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
08/05/2016 #3

Avatar de juanma2468

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.
08/05/2016 #4
Moderador

Avatar de D@rkbytes

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á.
09/05/2016 #5

Avatar de roberttorres

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.
09/05/2016 #6

Avatar de unashabashida

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:
Código 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 
09/05/2016 #7

Avatar de roberttorres

Hola, tu rutina de comparacion sigue estando mal
tendria que ser asi
Código PHP:
INICIO
   BSF STATUS
,5
   CLRF PORTC
   BCF STATUS
,5
   BTFSS    PORTB
,;comprobar si el boton es pulsadosi es asi saltar a goto num    
   
GOTO    NUM
   BTFSS    PORTB
,;comprobar si el boton es pulsadosi es asi saltar a goto Y
   
GOTO    Y    
   BTFSS    PORTB
,2;comprobar si el boton es pulsadosi es asi saltar a goto AEI
   
GOTO    AEI
   
GOTO INICIO 
PD:puedes añadir una rutina antirebote para los botones
09/05/2016 #8
Moderador

Avatar de D@rkbytes

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:
Código 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
Archivos Adjuntos
Tipo de Archivo: rar 16F84A Leer pulsadores.rar (16,5 KB (Kilobytes), 4 visitas)
10/05/2016 #9

Avatar de roberttorres

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:
Código 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 
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.