Autor Tema: Ayuda con letrero  (Leído 3236 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado noa2007

  • PIC10
  • *
  • Mensajes: 3
Ayuda con letrero
« en: 12 de Junio de 2009, 03:49:52 »
Bien pues antes que nada saludos a todos y me presento, mi nombre es Ricardo y soy estudiante de Ing. en Informática.

Bien pues mi duda es la siguiente, nos han comenzado a enseñar assembler, llevamos dos clases conociendo conceptos del pic16f628a y la estructura del lenguaje, sin embargo no ha sido suficiente y pues el propio profesor nos dijo que el tiempo para enseñarnos es muy muy poco, por lo que solo nos dió un programa y nos pidió que lo modificaramos. Mi problema consiste en que bueno del programa que nos dió ya generé el .hex e intenté simularlo en proteus pero nomas no pasa nada, el display de 7 segmentos queda estático y debería cambiar cuando muevo el dipswitch, lo que me lleva a la conclusión de que el programa .asm está mal, pero lo he revisado y pues por mi poco conocimiento no me es posible identificar los errores. De favor pido que si pudieran ayudarme lo hicieran, la verdad es que no entiendo aun muy bien esto a pesar de que he estado leyendo e informandome por mi cuenta, les dejo el codigo y adjunto mi circuito de proteus.

;*****************************************APLI2.asm********************************************
;
; En un display de 7 segmentos conectado al Puerto B se visualiza el letrero INFORMATICA como un deco,
; teniendo como entrada al Puerto A.
;
;ZONA DE DATOS------------------------------------------------------------------------

   ;   __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC   ;Configuración para el programador
      LIST   P=16F628A            ;Procesador
      #INCLUDE <P16F628A.INC>         ;Definición de los operandos usados.
      ERRORLEVEL 0,-302
      __config 2150

;ZONA DE CÓDIGOS---------------------------------------------------------------------

      ORG   0x00                     ;El programa comienza en la dirección 0.

Inicio   
      bsf           STATUS,RP0            ;Pone a 1 el bit 5 del ESTATUS. Acceso al Banco 1.
      clrf           TRISB                     ;Las líneas del Puerto B se configuran como salida.
      movlw      7fh                          ;Las 5 líneas del Puerto A se configuran como entrada.
      movwf      TRISA                     ;Las lineas del Puerto A se configuran como entradas.

Principal
      bcf           STATUS,RP0            ;Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
      movf        PORTA,W                 ;Lee la entrada o puerto A.
      andlw       7fh                          ;Máscara para quedarse con el valor de las
                                                    ;entradas correspondientes al noble bajo.
      call          Binario_a_7Segmentos          ;Convierte código binario a 7 segmentos del display.   
      movwf     PORTB                                  ;Resultado se visualiza por el puerto de salida.
      goto        Principal

;Subrutina "Binario_7Segmentos"--------------------------------------------------------
;
; comentario en este programa se configura 0 ABCDEFG

Binario_a_7Segmentos               ;Tabla para display de 7 segmentos.
      addwf         PCL,W
Tabla
      retlw           30h                  ;El código 7 segmentos para el "I".
      retlw           15h                  ;El código 7 segmentos para el "N".
      retlw           47h                  ;El código 7 segmentos para el "F".
      retlw           7Eh                  ;El código 7 segmentos para el "O".
      retlw           05h                  ;El código 7 segmentos para el "R".
      retlw           15h                  ;El código 7 segmentos para el "N" debido a que no se puede desplegar una M.
      retlw           77h                  ;El código 7 segmentos para el "A".
      retlw           0Fh                  ;El código 7 segmentos para el "T".
      retlw           30h                  ;El código 7 segmentos para el "I".
      retlw           4Eh                  ;El código 7 segmentos para el "C".
      retlw           77h                  ;El código 7 segmentos para el "A".
      END                                    ;Fin del programa.

Si alguien pudiera ayudarme se lo agradecería enormemente.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con letrero
« Respuesta #1 en: 12 de Junio de 2009, 11:11:59 »
El vector de reset esta bien ubicado (0x00), pero el inicio del código en el PIC16F628, debe comenzar a partir de la dirección 0x05, ósea:

;ZONA DE CÓDIGOS---------------------------------------------------------------------


      ORG   0x00  
Reset
      goto   Inicio

      org    0x05                  
Inicio
      bsf           STATUS,RP0            ;Pone a 1 el bit 5 del ESTATUS. Acceso al Banco 1.
      .
      .
No contesto mensajes privados, las consultas en el foro

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con letrero
« Respuesta #2 en: 12 de Junio de 2009, 13:32:38 »
Hola!

Suky: El vector está bien. Si bien resulta una buena costumbre de programación comenzar el programa desde un vector más allá del 0x04, no es estríctamente necesario. Especialmente en casos como este, en los cuales no se utiliza ninguna interrupción.

Hay varios detalles, y algunos errores:

Código: ASM
  1. ;*****************************************APLI2.asm********************************************
  2. ;
  3. ; En un display de 7 segmentos conectado al Puerto B se visualiza el letrero INFORMATICA como un deco,
  4. ; teniendo como entrada al Puerto A.
  5. ;
  6. ;Declaraciones:
  7. ;ZONA DE DATOS------------------------------------------------------------------------
  8.  
  9.       __CONFIG _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _BOREN_OFF & _DATA_CP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT    ;Configuración para el programador
  10.       LIST   P=16F628A            ;Procesador
  11.       #INCLUDE <P16F628A.INC>         ;Definición de los operandos usados.
  12.       ERRORLEVEL 0,-302
  13.  
  14. ;ZONA DE CÓDIGOS---------------------------------------------------------------------
  15.  
  16.       ORG                       0x00                     ;El programa comienza en la dirección 0.
  17.  
  18. Inicio  
  19.           bcf                           STATUS,RP0
  20.           movlw                         0x07
  21.           movwf                         CMCON
  22.  
  23.       bsf               STATUS,RP0            ;Pone a 1 el bit 5 del ESTATUS. Acceso al Banco 1.
  24.       movlw                     0x1F                          ;Las 5 líneas del Puerto A se configuran como entrada.
  25.       movwf                     TRISA                     ;Las lineas del Puerto A se configuran como entradas.
  26.       clrf              TRISB                     ;Las líneas del Puerto B se configuran como salida.
  27.       bcf               STATUS,RP0            ;Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
  28.  
  29. Principal
  30.       movf                      PORTA,W                 ;Lee la entrada o puerto A.
  31.       andlw                     0x1F                          ;Máscara para quedarse con el valor de las                                                    ;entradas correspondientes al noble bajo.   
  32.       call              Binario_a_7Segmentos          ;Convierte código binario a 7 segmentos del display.  
  33.       movwf                     PORTB                                  ;Resultado se visualiza por el puerto de salida.
  34.       goto                      Principal
  35.  
  36. ;Subrutina "Binario_7Segmentos"--------------------------------------------------------
  37. ;
  38. ; comentario en este programa se configura 0 ABCDEFG
  39.  
  40. Binario_a_7Segmentos               ;Tabla para display de 7 segmentos.
  41.       addwf         PCL,F
  42. Tabla
  43.       retlw           30h                  ;El código 7 segmentos para el "I".
  44.       retlw           15h                  ;El código 7 segmentos para el "N".
  45.       retlw           47h                  ;El código 7 segmentos para el "F".
  46.       retlw           7Eh                  ;El código 7 segmentos para el "O".
  47.       retlw           05h                  ;El código 7 segmentos para el "R".
  48.       retlw           15h                  ;El código 7 segmentos para el "N" debido a que no se puede desplegar una M.
  49.       retlw           77h                  ;El código 7 segmentos para el "A".
  50.       retlw           0Fh                  ;El código 7 segmentos para el "T".
  51.       retlw           30h                  ;El código 7 segmentos para el "I".
  52.       retlw           4Eh                  ;El código 7 segmentos para el "C".
  53.       retlw           77h                  ;El código 7 segmentos para el "A".
  54.  
  55.       org               Tabla+.32
  56.       retlw             0x00
  57.       END                                    ;Fin del programa.

El "      org       Tabla+.32" no es lo óptimo,pero funciona para lo que necesitás. Está porque vos podés ingresar por el puertoA de hasta .31 y tu tabla solo ocupa 11 posiciones, lo que significa que si no tenés en cuenta eso e ingresás un valor mayor a 11 por el PuertoA, el uC seguramente se reseteará constantemente.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Ayuda con letrero
« Respuesta #3 en: 12 de Junio de 2009, 15:02:50 »
La mejor manera de mostrar la "m", y creo que la unica es poniendo dos "n" seguidas.

tapi8

Desconectado noa2007

  • PIC10
  • *
  • Mensajes: 3
Re: Ayuda con letrero
« Respuesta #4 en: 13 de Junio de 2009, 19:10:32 »
Hola que tal, pues muchas gracias a todos por atender mi duda, en especial gracias BrunoF por corregir mis errores que a simple vista me parecian invisibles XD. He compilado el programa y el mplab me marcaba un error (Operand contains unresolvable labels or is too complex) por el "org       Tabla+.32", a decir verdad estoy muy seguro para que funcionaria, pero lo quité y el programa funcionó a la perfección.

Una vez mas gracias BrunoF, ahora ya entiendo todo el programa, bueno aun no entiendo bien como funcionan las tablas y el PCL pero apenas estoy comenzando con esto de los pic.

Saludos.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con letrero
« Respuesta #5 en: 13 de Junio de 2009, 22:29:45 »
Hola noa. A mi me compilo a la perfección. Tengo la ultima version del MPLAB...

Se ha hablado mucho en el foro sobre el PCL y las tablas. Realizando una búsqueda seguro que podes despejar tus dudas. Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado noa2007

  • PIC10
  • *
  • Mensajes: 3
Re: Ayuda con letrero
« Respuesta #6 en: 28 de Junio de 2009, 20:43:12 »
Que tal, una vez mas yo con una duda y la posteo en el mismo tema que he creado porque es una duda muy sencilla.

Bien, me he encontrado con algunos programas asm que usan mucho esta la instrucción goto y después de esto colocan este simbolo "$" seguido de un + o - y un numero, esto que significa? no encuentro nada al respecto y no entiendo que significa. De antemano gracias.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Ayuda con letrero
« Respuesta #7 en: 29 de Junio de 2009, 07:56:34 »
Pues goto  $-2 significa que retrocede dos instrucciones y goto  $+3 que avanza 3 instrucciones. Se suele usar para saltos cortos, y de paso ahorrar algunas etiquetas.

tapi8