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

Temas similares

03/01/2013 #1


Mod 10 en ensamblador
Hola alguien me podría ayudar lo que pasa es que estoy usando un programa en mplab, el cual es un mod 10.
Lo que pasa es que no muestra el número 8
El código que use es este:
Código:
; **** Encabezado ****
                    list p=16F877A
                    #include P16F877A.inc
                    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 ;**** Definición de variables ****
Contador             equ     0x0C     
Contador1             equ     0x0D
Contador2             equ     0x0E
Pulsador             equ     7         

               Reset   org 0x00 
                  goto Inicio 
        ;**** Programa principal ****
        
Inicio
                       bsf         STATUS,RP0 
                      clrf         TRISB
                               bcf         STATUS,RP0 
                               call             Config_Tabla 
                       movfw        INDF
                               movwf     PORTB 

;**** Testeo de Pulsador ****

Bucle
                      call         Demora_190ms 
                      incf         FSR,1 
                             movlw         0x1A
                            subwf         FSR,0 

                            btfss         STATUS,Z 
                             goto         Muestro_Display 
                            movlw         0x10 
                             movwf     FSR ;
Muestro_Display
                      movfw         INDF ; Leo Registro que apunta FSR.-
                              movwf         PORTB ; Lo cargo en PORTB.-
                              goto         Bucle ; Continuo conteo.-

;**** Demora ****
Demora_190ms
                    movlw         0xFF ;
                    movwf         Contador1 ; Iniciamos contador1.-
Repeticion1
                    movlw         0xFF ;
                    movwf         Contador2 ; Iniciamos contador2
Repeticion2
                    decfsz         Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
                    goto         Repeticion2 ; Si no es 0 repetimos ciclo.-
                    decfsz         Contador1,1 ; Decrementa Contador1.-
                    goto         Repeticion1 ; Si no es cero repetimos ciclo.-
                    return ; Regresa de la subrutina.-

;**** Cargamos tabla en memoria ****
Config_Tabla
                    movlw         0x10 ;
                    movwf         FSR ; Direccionamos el registro 0x10 de la memoria RAM (GPR).-
                    movlw         0x3F ; Cargamos el codigo para mostrar el CERO.-
                    movwf         INDF ; Lo guardamos donde apunta FSR --> 0x10.-


                    incf         FSR,1 ; Incrementamos FSR, ahora apunta a 0x11.-
                    movlw         0x06 ; Cargamos codigo para UNO.-
                    movwf         INDF ; Lo guardamos donde apunta FSR.-

                    incf         FSR,1 ; Incrementamos FSR, ahora apunta a 0x12.-
                    movlw         0x5B ; Cargamos codigo para DOS.-
                    movwf         INDF ; Lo guardamos donde apunta FSR.-

                    incf         FSR,1 ; Incrementamos FSR, ahora apunta a 0x13.-
                    movlw         0x4F ; Cargamos codigo para TRES.-
                    movwf         INDF ; Lo guardamos donde apunta FSR.-
                    
                    incf         FSR,1 ; Incrementamos FSR, ahora apunta a 0x14.-
                    movlw         0x66 ; Cargamos codigo para CUATRO.-
                    movwf         INDF ; Lo guardamos donde apunta FSR.-
                    
                    incf         FSR,1 ; Incrementamos FSR, ahora apunta a 0x15.-
                    movlw         0x6D ; Cargamos codigo para CINCO.-
                    movwf         INDF ; Lo guardamos donde apunta FSR.-
                    
                    incf         FSR,1 ; Incrementamos FSR, ahora apunta a 0x16.-
                    movlw         0x7D ; Cargamos codigo para SEIS.-
                    movwf         INDF ; Lo guardamos donde apunta FSR.-
                    
                    incf         FSR,1 
                    movlw         0x07 
                    movwf         INDF 
                    
                    incf         FSR,1
                    movlw     0xff 
                    movwf         INDF 
                    
                    incf         FSR,1 
                    movlw         0x6F
                    movwf         INDF 
                    
                    movlw         0x10 ;    
                    movwf         FSR 
                    return 
                    End
No se visualiza solo el numero ocho... si lo programe de esta manera es porque así me lo pidieron
04/01/2013 #2


intenta cambiando ff
06/01/2013 #3
Moderador

Avatar de D@rkbytes

mabauti dijo: Ver Mensaje
intenta cambiando ff
Nop.
Ese no es el problema. Ni aunque cambie 0xFF por 0x7F que sería el número para mostrar el 8, funcionaría.
El problema es que se está accediendo a posiciones de la RAM que no son para propósito general.
Se esta direccionando desde la posición 0x10 que corresponde al registro T1CON
En este PIC los registros de la RAM para propósito general empiezan desde la posición 0x20
Por lo tanto lo que se tendría que modificar en ese programa, que de seguro fue creado para un PIC16F84/A
Sería esto...
Iniciar las variables desde la posición 0x20
Por ejemplo...
Contador equ 0x20
Contador1 equ 0x21 ; Etc.
La instrucción movlw 0x1A cambiarla por movlw 0x2D ¿Por qué?
Por que se usan tres variables, llegando hasta 0x22 y otras 10 posiciones para los números 0 a 9
Pero se iniciará el puntero en 0x23 para el direccionamiento del registro FSR
0x23 + 0x0A = 0x2D
Entonces se hace la comparación para saber si FSR llegó a 0x2D
Si es así, entonces se resetea el puntero otra vez a 0x23
Luego, las instrucciones movlw 0x10 que son las del principal problema, cambiarlas por movlw 0x23
Y listo, con esos cambios debe funcionar ese programa para el PIC16F877A sin problemas.

Suerte.
10/01/2013 #4


oye muchas gracias ps si era eso debi empezar en la direccion 0x20 ajap... cambie eso y mi programa funciona muy bien... muchisimas gracias
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.