Autor Tema: Ejemplos de Asembler PIC16F628A - PIC16F648A  (Leído 25191 veces)

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

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Ejemplos de Asembler PIC16F628A - PIC16F648A
« en: 25 de Junio de 2006, 10:33:10 »
Hola amigos:

Aqui pondremos los ejemplos para estos pics que son muy similares, incluso comparten la hoja tecnicaes.

Hoja tecnica 16F628A/648A

Se usara en los ejemplos el compilador MPLAB y para las simulaciones PROTEUS.

MPLAB

PROTEUS




INDICE


En los archivos zip adjuntos encontraran los archivos asm, hex y dsn (simulacion en proteus) de cada ejemplo
« Última modificación: 26 de Junio de 2006, 23:09:56 por veguepic »
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos de Asembler PIC16F628A - PIC16F648A
« Respuesta #1 en: 25 de Junio de 2006, 13:29:20 »
Empezamos con el ejemplo que puso Andyros:


Código: ASM
  1. ;       02-06-06
  2. ;       Ejemplo 01
  3. ;       Prender un led
  4. ;       PIC 16f648a
  5. ;       MPLAB 6.40
  6. ;       Proteus 6.9 SP3
  7. ;       Andyros  
  8.  
  9.         LIST    P=16F648A,                              ; usar PIC 16F648A
  10.         include <p16f648A.inc>
  11.  
  12. ;************ PALABRA DE CONFIGURACION ******************************************
  13.  
  14.         __CONFIG      h'3F50'                           ; OSC es Int 4MHz
  15.                                                         ; RA5,RA6,RA7,RB4 son I/O
  16.                                                         ; Power-up timer ON
  17.                                                         ; Code protection OFF
  18.                                                         ; Data code protection OFF
  19.                                                         ; Brown-out detection OFF
  20.                                                         ; Watchdog timer OFF
  21.                                                         ; Boren ON
  22.  
  23.         errorlevel      -302                            ; Eliminate bank warning
  24.  
  25. ;*********************************************************************************
  26.  
  27.         ORG             0
  28.         bsf             STATUS,5                                ; activa la pagina 1
  29.         clrf            TRISA
  30.         clrf            TRISB                                   ; puerto a y b todos salidaS
  31.         bcf             STATUS,5                                ; volvemos a la pagina 0
  32.         movlw           b'00000111'                             ; comparadores desactivados,
  33.         movwf           CMCON                                   ; I/O digitales.
  34.         Clrf            PORTB                                   ; ponemos a 0 portb
  35.  
  36. INICIO
  37.         bsf             PORTB,0                                 ; pone a 1 RB0
  38.         goto            INICIO                                  ; va a inicio
  39.         END                                                     ; fin de programa

He revisado la hoja tecnica en la configuracion (pag 98) y me surgen un par de dudas, el valor  3F50 en binario equivale a 11111101010000, en el config es:

CP      -      -      -      -      CPD      LVP      BOREN      MCLRE      FOSC2      PWRTE      WDTE      FOSC1      FOSC0

 1        1     1      1     1        1         0            1               0             1               0              0             0              0

Segun la pagina dice que los bits 9 a 12 se deben leer como ceros, supongo que se cargan tambien como ceros o no importa el valor?

Creo que Brown out detection es igual a Boren.

« Última modificación: 25 de Junio de 2006, 14:03:43 por veguepic »
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplos de Asembler PIC16F628A - PIC16F648A
« Respuesta #2 en: 25 de Junio de 2006, 13:55:04 »
Hola veguepic, bueno...siguiendo lo que dice el datasheet. los bits 9 a 12 no estan implementados, lo que deberia significar que mas alla del valor que les pongas, el PIC los leera siempre como cero asi que no deberia implicar mayor problema, aunque no soy partidario de declarar el valor de la configuracion en un solo valor hexadecimal. Ponerlo de esa manera puede resultar bastante tedioso de analizar. Sugiero que se declare la configuracion FUSE por FUSE como has hecho con los ejemplos para el 16F84A.
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 Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos de Asembler PIC16F628A - PIC16F648A
« Respuesta #3 en: 25 de Junio de 2006, 15:18:28 »
Hola BrunoF:

Siendo estos los primeros ejemplos opino igual que tu, mas adelante creo que ya no seria necesario poner tanto detalle o comentario, pues se supone que deben tener mejores conocimientos de asembler.

Por lo cual le he hecho unas pequeñas modificaciones al ejemplo 01:

Código: ASM
  1. ;       02-06-06
  2. ;       Ejemplo 01
  3. ;       Prender un led
  4. ;       PIC 16f648a
  5. ;       MPLAB 6.40
  6. ;       Proteus 6.9 SP3
  7. ;       Andyros  
  8.  
  9.         LIST    P=16F648A,                              ; usar PIC 16F648A
  10.         include <p16f648A.inc>
  11.  
  12. ;************ PALABRA DE CONFIGURACION ******************************************
  13.  
  14.         __CONFIG        _CP_OFF&_DATA_CP_OFF&_LVP_OFF&_BOREN_ON&_MCLRE_OFF&_WDT_OFF&_PWRTE_ON&_INTOSC_OSC_NOCLKOUT
  15. ;       __CONFIG        h'3F50'
  16. ;       __CONFIG        b'11111101010000'
  17.                                                         ; las tres configuraciones son equivalentes
  18.                                                         ; Code protection                       OFF
  19.                                                         ; Data code protection                  OFF
  20.                                                         ; Low voltage programming, RB4 I/O      OFF
  21.                                                         ; Brown-out reset                       ON
  22.                                                         ; MCLR desctivado, RA5 I/O              OFF
  23.                                                         ; Watchdog timer                        OFF
  24.                                                         ; Power-up timer                        ON
  25.                                                         ; OSC es Int 4MHz,RA6 y RA7 son I/O
  26.  
  27.         errorlevel      -302                            ; Eliminate bank warning
  28.  
  29. ;*********************************************************************************
  30.  
  31.         ORG             0
  32.         bsf             STATUS,5                                ; activa la pagina 1
  33.         clrf            TRISA
  34.         clrf            TRISB                                   ; puerto a y b todos salidaS
  35.         bcf             STATUS,5                                ; volvemos a la pagina 0
  36.         movlw           b'00000111'                             ; comparadores desactivados,
  37.         movwf           CMCON                                   ; I/O digitales.
  38.         Clrf            PORTB                                   ; ponemos a 0 portb
  39.  
  40. INICIO
  41.         bsf             PORTB,0                                 ; pone a 1 RB0
  42.         goto            INICIO                                  ; va a inicio
  43.         END                                                     ; fin de programa

Se puede ver estan las 3 alternativas de programacion de los Fuses.

Adjunto la simulacion en proteus.

Saludos
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Re: Ejemplos de Asembler PIC16F628A - PIC16F648A
« Respuesta #4 en: 26 de Junio de 2006, 09:54:39 »
Bueno lo de la palabra de configuracion , hay que ver todas las posibilidades el que resulte a cada uno mas facil o dificil es cuestion de gustos, lo importante es aprender, y ver que nos podemos encontrar al leer un programa diseñado por otra persona.

Efevctivamente los bits 9 a 12 no estan implementados fisicamente asi que su valor daria igual cual fuere y lo que dice el data es que si lo leemos es 0, como muy bien ha comentado BrunoF .


UN SALUDO

P.D. alguien ha podido probarlo , tengo los bancos de pruebas ocupados y me gustaria saber si funciona sin el oscilador.

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos de Asembler PIC16F628A - PIC16F648A
« Respuesta #5 en: 26 de Junio de 2006, 23:05:01 »
Tienes razon Andyros, es bueno que esten todas las opciones.

Te cuento que cuando vi la configuracion de los fuses que habias puesto y no la entendi, me tuve que poner a buscar y no encontre informacion al respecto, lo unico que me quedo es suponer que era un equivalente al binario que si habia visto antes. Por si acaso yo no he estudiado electronica ni programacion.

Es por eso que al inicio es mejor poner todo masticadito para los que como yo no entienden.  :mrgreen:
La idea es que estos primeros ejemplos son para los que se inician, mas adelante ya obviaremos muchas cosas que ya deben estar aprendidas.

Bueno mucha chachara y nada de codigo!

Ya probe este ejemplo 01 y el 02 que voy a poner a continuacion en un Pic de carne y hueso; funcionan sin ningun problema, aunque pongo la salvedad que fue en un 16F628A pero al final son lo mismo, pues lo unico que cambie fue:

   LIST   P=16F628A
   include <p16f628A.inc>

Me he dado cuenta que no tengo un 16F648A, pero muy pronto estara por aqui.  :mrgreen:
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos de Asembler PIC16F628A - PIC16F648A
« Respuesta #6 en: 26 de Junio de 2006, 23:06:49 »
Ejemplo 02:

Prender y apagar un led cada 0.5 segundos (0.25 seg prendido y 0.25 seg apagado)


Código: ASM
  1. ;       26-06-06
  2. ;       Ejemplo 02
  3. ;       Prender y apagar un led cada 0.5 seg
  4. ;       PIC 16f648a
  5. ;       MPLAB 7.30
  6. ;       Proteus 6.9 SP3
  7. ;       Andyros  
  8.  
  9.         LIST    P=16F648A,                              ; usar PIC 16F648A
  10.         include <p16f648A.inc>
  11.  
  12. ;************ PALABRA DE CONFIGURACION ******************************************
  13.  
  14.         __CONFIG        _CP_OFF&_DATA_CP_OFF&_LVP_OFF&_BOREN_ON&_MCLRE_OFF&_WDT_OFF&_PWRTE_ON&_INTOSC_OSC_NOCLKOUT
  15. ;       __CONFIG        h'3F50'
  16. ;       __CONFIG        b'11111101010000'
  17.                                                         ; las tres configuraciones son equivalentes
  18.                                                         ; Code protection                       OFF
  19.                                                         ; Data code protection                  OFF
  20.                                                         ; Low voltage programming, RB4 I/O      OFF
  21.                                                         ; Brown-out reset                       ON
  22.                                                         ; MCLR desctivado, RA5 I/O              OFF
  23.                                                         ; Watchdog timer                        OFF
  24.                                                         ; Power-up timer                        ON
  25.                                                         ; OSC es Int 4MHz,RA6 y RA7 son I/O
  26.  
  27.         errorlevel      -302                            ; Eliminate bank warning
  28.  
  29. PDel0   equ     20
  30. PDel1   equ     21
  31.  
  32. ;*********************************************************************************
  33.  
  34.         ORG             0
  35.         BSF             STATUS,5                                ; activa la pagina 1
  36.         CLRF            TRISA
  37.         CLRF            TRISB                                   ; puerto a y b todos salidaS
  38.         BCF             STATUS,5                                ; volvemos a la pagina 0
  39.         MOVLW           b'00000111'                             ; comparadores desactivados,
  40.         MOVWF           CMCON                                   ; I/O digitales.
  41.         CLRF            PORTB                                   ; ponemos a 0 portb
  42.  
  43. INICIO
  44.         BSF             PORTB,0                                 ; pone a 1 RB0
  45.         CALL            DEMORA                                  ; llama a demora de 0,5 seg
  46.         BCF             PORTB,0                                 ; pone a 0 RB0
  47.         CALL            DEMORA                                  ; llama a demora de 0,5 seg
  48.  
  49.         GOTO            INICIO                                  ; va a inicio
  50.  
  51. ;-------------------------------------------------------------
  52. ;       La demora a sido generada con el programa PDEL
  53. ;       Delay 250000 ciclos
  54. ;-------------------------------------------------------------
  55.  
  56. DEMORA  movlw     .197                                          ; 1 set numero de repeticion  (B)
  57.         movwf     PDel0                                         ; 1
  58. PLoop1  movlw     .253                                          ; 1 set numero de repeticion  (A)
  59.         movwf     PDel1                                         ; 1
  60. PLoop2  clrwdt                                                  ; 1 clear watchdog
  61.         clrwdt                                                  ; 1 ciclo delay
  62.         decfsz    PDel1,1                                       ; 1 + (1) es el tiempo 0  ? (A)
  63.         goto      PLoop2                                        ; 2 no, loop
  64.         decfsz    PDel0,1                                       ; 1 + (1) es el tiempo 0  ? (B)
  65.         goto      PLoop1                                        ; 2 no, loop
  66. PDelL1  goto PDelL2                                             ; 2 ciclos delay
  67. PDelL2  
  68.         return                                                  ; 2+2 Fin.
  69. ;---------------------------------------
  70.  
  71.         END                                                     ; fin de programa

“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Re: Ejemplos de Asembler PIC16F628A - PIC16F648A
« Respuesta #7 en: 28 de Junio de 2006, 14:25:03 »
Hola, vamos a añadir una directiva , CBLOCK y ENDC, este añade automaticamente las direcciones a las etiquetas,

Código: ASM
  1. ************ etiquetas ***********
  2.  
  3. PDel0   equ     20
  4. PDel1   equ     21
  5.  
  6. **********************************
  7.  
  8. ;lo unico que indicamos es la primera direccion libre,
  9. ;en este caso la direccion 20 ( en hex, recordad que
  10. ;todo lo que va precedido de 0x indica que el numero viene
  11. ;dado en el sistema hexadecimal).
  12. ;Con este directiva no hace falta ir poniendo las direcciones.
  13.  
  14.  
  15.  
  16. CBLOCK  0x20            
  17.                          
  18. PDel0                ;direccion 0x20    
  19. PDel1                ;direccion 0x21    
  20. xxxxx                ;direccion 0x22
  21. xxxxx                ;direccion 0x23
  22. xxxxx                ;direccion 0x24
  23. xxxxx                ;direccion 0x25  
  24. xxxxx                ;direccion 0x26
  25.                          
  26. ENDC

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ejemplos de Asembler PIC16F628A - PIC16F648A
« Respuesta #8 en: 12 de Julio de 2006, 15:01:49 »
Rutina de Lectura de una Tabla en Memoria de Programa, sin importar donde esté ubicada

Versión 0.1.  Manejo simple de la rutina.  Para comprender cómo funciona.

En donde están los "nop" uno puede hacer lo que desee con el dato recibido en WREG que será el dato leído de la tabla.


Código: ASM
  1. ;------------------------------------------------------------------------------------
  2. ;
  3. ;  Rutina para Leer valores de tabla ubicados en cualquier lugar para PIC16Fxxx
  4. ;
  5. ;
  6. ;  Versión  : 0.1
  7. ;  Última Revisión: 12-7-2006
  8. ;  Autor    : Maunix
  9. ;
  10. ;------------------------------------------------------------------------------------
  11.  
  12.         list    P=16F628A
  13.         include <p16F628A.inc>
  14.  
  15.  
  16. MENSAJEADDRESS equ 0x20 ;Dejar 2 bytes para la variable MENSAJEADDRESS
  17. OFFSET  equ 0x22
  18.  
  19. ;
  20. ;  Modo de USO
  21. ;
  22. ;  En MENSAJEADRESS<1> guardamos el valor high de la dirección donde está el código a leer
  23. ;  En MENSAJEADRESS<0> guardamos el valor low de la dirección donde está el código a leer
  24. ;  OFFSET es un índice dentro del mensaje, que irá de 0 a Largo de Mensaje - 1.
  25. ;  0 para el primer valor, N-1 para el último
  26. ;  Funciona con mensajes donde cada mensaje sea menor a 255 bytes.  Para mayores tablas se deberá incorporar un OFFSET de 16 bits.
  27. ;
  28. ;  La rutina está armada para que sea utilizada no solo con mensajes de texto, sino cualquier tipo de datos que uno quiera leer
  29. ;
  30.  
  31.  
  32.         movlw   LOW MENSAJE1
  33.         movwf   MENSAJEADDRESS+0
  34.         movlw   HIGH MENSAJE1
  35.         movwf   MENSAJEADDRESS+1
  36.         movlw   .0
  37.         movwf   OFFSET          ;Leera el primer caracter
  38.  
  39.         call    MENSAJES
  40.  
  41.         nop
  42.  
  43.         movlw   LOW MENSAJE2
  44.         movwf   MENSAJEADDRESS+0
  45.         movlw   HIGH MENSAJE2
  46.         movwf   MENSAJEADDRESS+1
  47.         movlw   .3
  48.         movwf   OFFSET          ;Leera el 4to caracter
  49.  
  50.         call    MENSAJES
  51.        
  52.         nop                     ;Tengo el 3er caracter del mensaje2
  53.  
  54.         movlw   LOW MENSAJE4
  55.         movwf   MENSAJEADDRESS+0
  56.         movlw   HIGH MENSAJE4
  57.         movwf   MENSAJEADDRESS+1
  58.         movlw   .2
  59.         movwf   OFFSET          ;Leera el 4to caracter
  60.  
  61.         call    MENSAJES
  62.        
  63.         nop
  64.        
  65.  
  66. MENSAJES:
  67.         movf    OFFSET,w
  68.         addwf   MENSAJEADDRESS+0,f
  69.         btfsc   STATUS,C
  70.         incf    MENSAJEADDRESS+1,f
  71.  
  72.         movf    MENSAJEADDRESS+1,w
  73.         movwf   PCLATH                          ;Guardo byte 0 del
  74.         movf    MENSAJEADDRESS+0,w
  75.         movwf   PCL
  76.  
  77. MENSAJE1:       dt      "HOLA"
  78. MENSAJE2:       dt      "MAUNIX TEST DE TABLAS"
  79. MENSAJE3:       dt      "PRIMERA PRUEBA"
  80.  
  81.  
  82. MENSAJE4:       dt      0xA0,0xA1,0xA2,0xA3,0xA4
  83.  
  84.         end

« Última modificación: 12 de Julio de 2006, 15:16:48 por maunix »
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ejemplos de Asembler PIC16F628A - PIC16F648A
« Respuesta #9 en: 12 de Julio de 2006, 15:03:36 »
Rutina de Lectura de una Tabla en Memoria de Programa, sin importar donde esté ubicada

Versión 0.2.  Procesa una cantidad de bytes en forma consecutiva.  Muy útil cuando se quiere sacar una serie de datos por un puerto , un módulo como el USART o bien datos hacia un display LCD.

Se observa que no solo se pueden cargar 'TEXTO' sino también datos.

Código: ASM
  1. ;------------------------------------------------------------------------------------
  2. ;
  3. ;  Rutina para Leer valores de tabla ubicados en cualquier lugar para PIC16Fxxx
  4. ;
  5. ;
  6. ;  Versión  : 0.2
  7. ;           : Optimiza la forma de llamar a la rutina mediante el uso de un bucle
  8. ;
  9. ;  Última Revisión: 12-7-2006
  10. ;  Autor    : Maunix
  11. ;
  12. ;
  13. ;  Version  : 0.1
  14. ;             Primera versión.
  15. ;
  16. ;------------------------------------------------------------------------------------
  17.  
  18.         list    P=16F84A
  19.         include <p16F84A.inc>
  20.  
  21.  
  22. MENSAJEADDRESS equ 0x20 ;Dejar 2 bytes para la variable MENSAJEADDRESS
  23. OFFSET    equ 0x22
  24. OFFSETEND equ 0x23
  25.  
  26. ;
  27. ;  Modo de USO
  28. ;
  29. ;  En MENSAJEADRESS<1> guardamos el valor high de la dirección donde está el código a leer
  30. ;  En MENSAJEADRESS<0> guardamos el valor low de la dirección donde está el código a leer
  31. ;  OFFSET es un índice dentro del mensaje, que irá de 0 a Largo de Mensaje - 1.
  32. ;  0 para el primer valor, N-1 para el último
  33. ;  Funciona con mensajes donde cada mensaje sea menor a 255 bytes.  Para mayores tablas se deberá incorporar un OFFSET de 16 bits.
  34. ;
  35. ;  La rutina está armada para que sea utilizada no solo con mensajes de texto, sino cualquier tipo de datos que uno quiera leer
  36. ;
  37. ;  Se asume que las variables MENSAJEADDRESS, OFFSET Y OFFSETEND están todas en el banco 0 de memoria ram.  De no ser así deberán modificarse las rutinas
  38. ;  Se asume conocimiento del uso del PCLATH
  39. ;  El ejemplo es muy simple y no tiene en cuenta interrupciones ni otro tipo de cosas, su única finalidad es mostrar una forma
  40. ;  eficiente y fácil de ubicar una tabla en cualquier posición de la memoria de programa e irlo procesando en forma consecutiva
  41. ;
  42. ;
  43. ;
  44.  
  45.  
  46. _RUTINAS:
  47.         movlw   LOW MENSAJE1
  48.         movwf   MENSAJEADDRESS+0
  49.         movlw   HIGH MENSAJE1
  50.         movwf   MENSAJEADDRESS+1
  51.         movlw   .4
  52.         movwf   OFFSETEND               ;Leera 4 bytes (del 0 al 3)
  53.  
  54.         call    _MENSAJESTART
  55.  
  56.         ;pagesel        _RUTINAS                ;En caso de que se quiera hacer algun salto dentro de esta sección
  57.  
  58.         movlw   LOW MENSAJE2
  59.         movwf   MENSAJEADDRESS+0
  60.         movlw   HIGH MENSAJE2
  61.         movwf   MENSAJEADDRESS+1
  62.         movlw   .21
  63.         movwf   OFFSETEND               ;Leerá 21 bytes (del 0 al 20)
  64.  
  65.         call    _MENSAJESTART
  66.        
  67.         ;pagesel        _RUTINAS                ;En caso de que se quiera hacer algun salto dentro de esta sección
  68.  
  69.         movlw   LOW MENSAJE3
  70.         movwf   MENSAJEADDRESS+0
  71.         movlw   HIGH MENSAJE3
  72.         movwf   MENSAJEADDRESS+1
  73.         movlw   .2
  74.         movwf   OFFSETEND               ;Leerá 2 bytes (del 0 al 1)
  75.  
  76.         call    _MENSAJESTART
  77.        
  78.         ;pagesel        _RUTINAS                ;En caso de que se quiera hacer algun salto dentro de esta sección
  79.  
  80.         movlw   LOW MENSAJE4
  81.         movwf   MENSAJEADDRESS+0
  82.         movlw   HIGH MENSAJE4
  83.         movwf   MENSAJEADDRESS+1
  84.         movlw   .6
  85.         movwf   OFFSETEND               ;Leera el 6 bytes (del 0 al 5)
  86.  
  87.         call    _MENSAJESTART
  88.  
  89.         ;pagesel        _RUTINAS                ;En caso de que se quiera hacer algun salto dentro de esta sección
  90.  
  91.         ;A partir de aquí hacer lo que el usuario uno desee
  92.  
  93.         nop
  94.         goto    $-1
  95.  
  96.  
  97.  
  98. _MENSAJESTART:
  99.         clrf    OFFSET
  100.         movf    OFFSET,w
  101.         addwf   MENSAJEADDRESS+0,f
  102.         btfsc   STATUS,C
  103.         incf    MENSAJEADDRESS+1,f
  104.                
  105. _MENSAJEBUCLE
  106.         call    MENSAJES
  107.  
  108.         ; El dato leído está en WREG
  109.         ; Sacarlo por la USART, enviarlo a una rutina de display 7 seg, rutina de display LCD,  etc.
  110.         ; Ej. (usar una de estas lineas, no todas)
  111.         ; movwf TXREG
  112.         ; call  CARACTERLCD
  113.         ; movwf PORTB
  114.  
  115.         bcf     STATUS,Z
  116.         incf    MENSAJEADDRESS+0,f
  117.         btfsc   STATUS,Z
  118.         incf    MENSAJEADDRESS+1,f
  119.        
  120.         incf    OFFSET,f
  121.         movf    OFFSET,w
  122.         subwf   OFFSETEND,w
  123.         btfss   STATUS,Z
  124.         goto    _MENSAJEBUCLE
  125.         return
  126.        
  127.  
  128.  
  129.         org     0x03A0          ;Ubicado aquí a propósito para comprobar como funciona en los límites
  130. MENSAJES:
  131.         movf    MENSAJEADDRESS+1,w
  132.         movwf   PCLATH                          ;Guardo byte 0 del
  133.         movf    MENSAJEADDRESS+0,w
  134.         movwf   PCL
  135.  
  136. MENSAJE1:       dt      "HOLA"
  137. MENSAJE2:       dt      "MAUNIX TEST DE TABLAS"
  138. MENSAJE3:       dt      "VERSION 0.2"
  139.  
  140.  
  141. MENSAJE4:       dt      0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8
  142.  
  143.         end


« Última modificación: 12 de Julio de 2006, 15:17:39 por maunix »
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ejemplos de Asembler PIC16F628A - PIC16F648A
« Respuesta #10 en: 12 de Julio de 2006, 15:04:37 »
Rutina de Lectura de una Tabla en Memoria de Programa, sin importar donde esté ubicada

Versión 0.3.  Procesa una cantidad de bytes en forma consecutiva.  Muy útil cuando se quiere sacar una serie de datos por un puerto , un módulo como el USART o bien datos hacia un display LCD.

Idem a versión 0.2 pero incoropora un macro para hacer el código más legible.

Se observa que no solo se pueden cargar 'TEXTO' sino también datos.

Código: ASM
  1. ;------------------------------------------------------------------------------------
  2. ;
  3. ;  Rutina para Leer valores de tabla ubicados en cualquier lugar para PIC16Fxxx
  4. ;
  5. ;  Versión  : 0.3
  6. ;             Utilización de un macro para comprimir el código
  7. ;             Código idéntico al de la version 0.2 pero con uso de macro
  8. ;
  9. ;  Última Revisión: 12-7-2006
  10. ;  Autor    : Maunix
  11. ;
  12. ;
  13. ;  Versión  : 0.2
  14. ;           : Optimiza la forma de llamar a la rutina mediante el uso de un bucle
  15. ;  Version  : 0.1
  16. ;             Primera versión.
  17. ;
  18. ;------------------------------------------------------------------------------------
  19.  
  20.         list    P=16F628A
  21.         include <p16F628A.inc>
  22.  
  23.  
  24. MENSAJEADDRESS equ 0x20 ;Dejar 2 bytes para la variable MENSAJEADDRESS
  25. OFFSET    equ 0x22
  26. OFFSETEND equ 0x23
  27.  
  28. ;
  29. ;  Modo de USO
  30. ;
  31. ;  En MENSAJEADRESS<1> guardamos el valor high de la dirección donde está el código a leer
  32. ;  En MENSAJEADRESS<0> guardamos el valor low de la dirección donde está el código a leer
  33. ;  OFFSET es un índice dentro del mensaje, que irá de 0 a Largo de Mensaje - 1.
  34. ;  0 para el primer valor, N-1 para el último
  35. ;  Funciona con mensajes donde cada mensaje sea menor a 255 bytes.  Para mayores tablas se deberá incorporar un OFFSET de 16 bits.
  36. ;
  37. ;  La rutina está armada para que sea utilizada no solo con mensajes de texto, sino cualquier tipo de datos que uno quiera leer
  38. ;
  39. ;  Se asume que las variables MENSAJEADDRESS, OFFSET Y OFFSETEND están todas en el banco 0 de memoria ram.  De no ser así deberán modificarse las rutinas
  40. ;  Se asume conocimiento del uso del PCLATH
  41. ;  El ejemplo es muy simple y no tiene en cuenta interrupciones ni otro tipo de cosas, su única finalidad es mostrar una forma
  42. ;  eficiente y fácil de ubicar una tabla en cualquier posición de la memoria de programa e irlo procesando en forma consecutiva
  43. ;
  44. ;
  45. ;
  46. _mensaje        macro   NombreMensaje,LargoMensaje
  47.         movlw   LOW NombreMensaje
  48.         movwf   MENSAJEADDRESS+0
  49.         movlw   HIGH NombreMensaje
  50.         movwf   MENSAJEADDRESS+1
  51.         movlw   LargoMensaje
  52.         movwf   OFFSETEND               ;Leera 3 bytes (del 0 al 2)
  53.  
  54.         call    _MENSAJESTART
  55.  
  56.         endm
  57.  
  58.  
  59. _RUTINAS:
  60.         _mensaje        MENSAJE1,.4             ;Leera 4 bytes (del 0 al 3)
  61.  
  62.         _mensaje        MENSAJE2,.21            ;Leera el 21 bytes (del 0 al 20)
  63.  
  64.         _mensaje        MENSAJE3,.2             ;Leera el 2 bytes (del 0 al 1)
  65.  
  66.         _mensaje        MENSAJE4,.6             ;Leera el 6 bytes (del 0 al 5)
  67.  
  68.         ;A partir de aquí hacer lo que el usuario uno desee
  69.  
  70.         nop
  71.         goto    $-1
  72.  
  73.  
  74.  
  75. _MENSAJESTART:
  76.         clrf    OFFSET
  77.         movf    OFFSET,w
  78.         addwf   MENSAJEADDRESS+0,f
  79.         btfsc   STATUS,C
  80.         incf    MENSAJEADDRESS+1,f
  81.                
  82. _MENSAJEBUCLE
  83.         call    MENSAJES
  84.  
  85.         ; El dato leído está en WREG
  86.         ; Sacarlo por la USART, enviarlo a una rutina de display 7 seg, rutina de display LCD,  etc.
  87.         ; Ej. (usar una de estas lineas, no todas)
  88.         ; movwf TXREG
  89.         ; call  CARACTERLCD
  90.         ; movwf PORTB
  91.  
  92.         bcf     STATUS,Z
  93.         incf    MENSAJEADDRESS+0,f
  94.         btfsc   STATUS,Z
  95.         incf    MENSAJEADDRESS+1,f
  96.        
  97.         incf    OFFSET,f
  98.         movf    OFFSET,w
  99.         subwf   OFFSETEND,w
  100.         btfss   STATUS,Z
  101.         goto    _MENSAJEBUCLE
  102.         return
  103.        
  104.  
  105.  
  106.         org     0x03F0          ;Ubicado aquí a propósito para comprobar como funciona en los límites
  107. MENSAJES:
  108.         movf    MENSAJEADDRESS+1,w
  109.         movwf   PCLATH                          ;Guardo byte 0 del
  110.         movf    MENSAJEADDRESS+0,w
  111.         movwf   PCL
  112.  
  113. MENSAJE1:       dt      "HOLA"
  114. MENSAJE2:       dt      "MAUNIX TEST DE TABLAS"
  115. MENSAJE3:       dt      "VERSION 0.2"
  116.  
  117.  
  118. MENSAJE4:       dt      0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8
  119.  
  120.         end
« Última modificación: 12 de Julio de 2006, 15:18:11 por maunix »
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything