Autor Tema: Ejemplos en Asembler PIC16F84A  (Leído 231953 veces)

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

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Re: Ejemplos en Asembler
« Respuesta #15 en: 23 de Junio de 2006, 10:25:31 »
Bueno pues yo voy a ir empezando ,  vamos comentando el programita, he seguido la misma norma en los ejemplos ( con permiso de Vszener ).

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

venga un saludo.


P.D. NO HE TENIDO TIEMPO DE PROBARLO, SI LO PROBAIS NO UTILIZEIS OSCILADOR NI CONECTEIS EL MCLR OK.
« Última modificación: 23 de Junio de 2006, 10:28:08 por andyros »

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #16 en: 24 de Junio de 2006, 21:59:26 »
Hola Andyros:

Lamentablemente he tenido poco tiempo esta semana, me parece que seria mejor abrir un nuevo tema con los ejemplos para el 16F648A, creo que seria mas ordenado.

Voy a hacer la simulacion del ejemplo que pusiste y luego la pego.

Saludos.

P.D. acabo de abrir un nuevo tema para el 16F648A en este link.

http://www.todopic.com.ar/foros/index.php?topic=12659.0
« Última modificación: 25 de Junio de 2006, 13:58:04 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 en Asembler
« Respuesta #17 en: 24 de Junio de 2006, 22:08:21 »
Ejemplo 08:

Ponemos interruptores en RB0 a RB3, cuando son presionados, se enciende el led respectivo en RA0 a RA3.

Código: ASM
  1. ;       24-06-06
  2. ;       Ejemplo 08
  3. ;       Leer interruptores
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8. ; si los interruptores de RB0 a RB3 son presionados, se enciende el led respectivo en RA0 a RA3.
  9.  
  10.         LIST    P=16F84A,                               ; usar PIC 16F84A
  11.         #include <p16f84A.inc>
  12.  
  13.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off
  14.                                                         ; power up timer        on
  15.                                                         ; watchdog              off
  16.                                                         ; osc                   XT
  17.  
  18. VAR                                                     ; variable
  19.  
  20.         ORG     0
  21.         BSF     STATUS,5                                ; activa la pagina 1
  22.         MOVLW   B'00000'                                ; carga 00000 en W
  23.         MOVWF   TRISA                                   ; puerto A todos salidas
  24.         MOVLW   B'11111111'                             ; carga 11111111 en W
  25.         MOVWF   TRISB                                   ; puerto B todas entradas
  26.         BCF     OPTION_REG,7                            ; activa pull-up en puerto B
  27.         BCF     STATUS,5                                ; volvemos a la pagina 0
  28.  
  29.         CLRF    PORTA                                   ; ponemos a cero el puerto A
  30.  
  31. INICIO                                                  ; etiqueta
  32.         CLRF    VAR                                     ; ponemos a cero VAR
  33.         BTFSC   PORTB,0                                 ; si RB0 es 0 salta 1 linea
  34.         BSF     VAR,0                                   ; pone 1 el bit 0 de VAR, encendido
  35.         BTFSC   PORTB,1                                 ; si RB1 es 0 salta 1 linea
  36.         BSF     VAR,1                                   ; pone 1 el bit 1 de vAR, encendido
  37.         BTFSC   PORTB,2                                 ; si RB2 es 0 salta 1 linea
  38.         BSF     VAR,2                                   ; pone 1 el bit 2 de VAR, encendido
  39.         BTFSC   PORTB,3                                 ; si RB3 es 0 salta 1 linea
  40.         BSF     VAR,3                                   ; pone 1 el bit 3 de VAR, encendido
  41.  
  42.         COMF    VAR,0                                   ; complementa VAR y carga en W (*)
  43.         MOVWF   PORTA                                   ; carga W en PORTA
  44.  
  45.         GOTO    INICIO                                  ; salta a INICIO
  46.  
  47.         END                                             ; fin de programa
  48.  
  49. ; (*) Es necesario complementar el valor de var pues los leds estan conectados a masa,
  50. ; si estuvieran conectados a +5v no es necesario complementarlo.

http://www.mytempdir.com/1372797
« Última modificación: 16 de Julio de 2007, 23:39:03 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 en Asembler
« Respuesta #18 en: 24 de Junio de 2006, 22:11:41 »
Ejemplo 09:

Es igual al ejemplo anterior pero hacemos directamente la lectura del puerto B, este programa ocupa menos de la mitad de espacio que el ejemplo 08.

Código: ASM
  1. ;       24-06-06
  2. ;       Ejemplo 09
  3. ;       Leer interruptores
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8. ; si los interruptores de RB0 a RB3 son presionados, se enciende el led respectivo en RA0 a RA3.
  9.  
  10.         LIST    P=16F84A,                               ; usar PIC 16F84A
  11.         #include <p16f84A.inc>
  12.  
  13.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off
  14.                                                         ; power up timer        on
  15.                                                         ; watchdog              off
  16.                                                         ; osc                   XT
  17.  
  18.         ORG     0
  19.         BSF     STATUS,5                                ; activa la pagina 1
  20.         MOVLW   B'00000'                                ; carga 00000 en W
  21.         MOVWF   TRISA                                   ; puerto A todos salidas
  22.         MOVLW   B'11111111'                             ; carga 11111111 en W
  23.         MOVWF   TRISB                                   ; puerto B todas entradas
  24.         BCF     OPTION_REG,7                            ; activa pull-up en puerto B
  25.         BCF     STATUS,5                                ; volvemos a la pagina 0
  26.  
  27.         CLRF    PORTA                                   ; ponemos a cero el puerto A
  28.  
  29. INICIO                                                  ; etiqueta
  30.  
  31.         COMF    PORTB,0                                 ; leemos el puerto B, el valor lo
  32.                                                         ; complementamos y lo guardamos en W
  33.         MOVWF   PORTA                                   ; cargamos W en el puerto A
  34.  
  35.         GOTO    INICIO                                  ; salta a INICIO
  36.  
  37.         END                                             ; fin de programa
  38.  
  39. ; (*) Es necesario complementar el valor de var pues los leds estan conectados a masa,
  40. ; si estuvieran conectados a +5v no es necesario complementarlo.


http://www.mytempdir.com/1372798
« Última modificación: 16 de Julio de 2007, 23:36:25 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 LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ejemplos en Asembler PIC16F84A
« Respuesta #19 en: 24 de Junio de 2006, 23:07:35 »
Felicidades y gracias vequepic por esforzarte en ayudar a los demas en esto del ensamblador :mrgreen:, relamente tus ejemplos, aunque ya sabia lo enseñado en la universidad de ensamblador, me ayudan a depurarme mas en los que hago y seguire haciendo con este lenguaje para los micros.

Como se dice todos los dias aprendemos algo nuevo :mrgreen:.

Saludos LabPIC
« Última modificación: 24 de Junio de 2006, 23:11:40 por LabPIC »
¡¡¡Viva México cabrones!!!

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler PIC16F84A
« Respuesta #20 en: 26 de Junio de 2006, 01:49:06 »
Gracias por tu comentario LabPIC.

Lo poco que se, se lo debo al foro y tienes razon, todos los dias se aprende aqui.

Y amenazo con molestarte con mis preguntas de LABVIEW, recien lo he instalado!

Un Saludo.
« Última modificación: 26 de Junio de 2006, 01:50: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 LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: Ejemplos en Asembler PIC16F84A
« Respuesta #21 en: 26 de Junio de 2006, 14:56:42 »
Claro veguepic, por allá te esperamos :mrgreen:.

Saludos LabPIC
¡¡¡Viva México cabrones!!!

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler PIC16F84A
« Respuesta #22 en: 09 de Julio de 2006, 04:33:09 »
Ejemplo 10:

En este caso leeremos el valor binario de los interruptores conectados en el puerto A, RA0 a RA3, y mostraremos su valor equivalente en hexadecimal en un display de 7 segmentos de catodo comun.

A estas alturas ya debemos tener claros algunos conceptos como los fuses, manejo de algunas instrucciones, etc. por lo cual ya no sera necesario poner comentarios tan detallados que podria aburrir. Cuando sean conceptos nuevos si seran necesarios. Pero si no se entiende algo no esta demas preguntar.  :-)

Código: ASM
  1. ;       09-07-06
  2. ;       Ejemplo 10
  3. ;       Manejo de un Display de cathodo comun
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8. ; metiendo el codigo binario por RA0 a RA3 se vera el codigo hexadecimal en el display.
  9.  
  10.         LIST    P=16F84A,                               ; usar PIC 16F84A
  11.         #include <p16f84A.inc>
  12.  
  13.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC
  14. ; code protec   off; power up timer     on; watchdog    off; osc        XT
  15.  
  16.         ORG     0
  17.         BSF     STATUS,5                                ; activa la pagina 1
  18.         MOVLW   B'01111'                                ; carga 01111 en W
  19.         MOVWF   TRISA                                   ; puerto A, RA0 a RA3 entradas
  20.         MOVLW   B'00000000'                             ; carga 11111111 en W
  21.         MOVWF   TRISB                                   ; puerto B todas salidas
  22.         BCF     STATUS,5                                ; volvemos a la pagina 0
  23.  
  24.         CLRF    PORTA                                   ; ponemos a cero el puerto A
  25.         CLRF    PORTB                                   ; ponemos a cero el puerto B
  26.         GOTO    INICIO                                  ; va a inicio
  27.  
  28. TABLA
  29.         ADDWF   PCL,1                                   ; suma w (valor puerto A) con el valor de PCL
  30.                                                         ; (contador del programa) y lo guarda en PCL
  31.         RETLW   B'1111110'                              ; 0, carga B'1111110' en W y retorna
  32.         RETLW   B'0110000'                              ; 1, carga B'0110000' en W y retorna
  33.         RETLW   B'1101101'                              ; 2, carga B'1101101' en W y retorna
  34.         RETLW   B'1111001'                              ; 3, carga B'1111001' en W y retorna
  35.         RETLW   B'0110011'                              ; 4, carga B'0110011' en W y retorna
  36.         RETLW   B'1011011'                              ; 5, carga B'1011011' en W y retorna
  37.         RETLW   B'1011111'                              ; 6, carga B'1011111' en W y retorna
  38.         RETLW   B'1110000'                              ; 7, carga B'1110000' en W y retorna
  39.         RETLW   B'1111111'                              ; 8, carga B'1111111' en W y retorna
  40.         RETLW   B'1111011'                              ; 9, carga B'1111011' en W y retorna
  41.         RETLW   B'1110111'                              ; A, carga B'1110111' en W y retorna
  42.         RETLW   B'0011111'                              ; b, carga B'0011111' en W y retorna
  43.         RETLW   B'1001110'                              ; C, carga B'1001110' en W y retorna
  44.         RETLW   B'0111101'                              ; d, carga B'0111101' en W y retorna
  45.         RETLW   B'1001111'                              ; E, carga B'1001111' en W y retorna
  46.         RETLW   B'1000111'                              ; F, carga B'1000111' en W y retorna
  47.  
  48. INICIO                                                  ; etiqueta
  49.  
  50.         MOVF    PORTA,0                                 ; lee el puerto A, y lo guarda en W
  51.         CALL    TABLA                                   ; llamamos a TABLA
  52.         MOVWF   PORTB                                   ; cargamos W en el puerto B
  53.         GOTO    INICIO                                  ; va a INICIO
  54.  
  55.         END                                             ; fin de programa

Una breve explicacion del ejemplo:

Cuando se usa la instruccion CALL, se carga el valor de PCL (contador del programa) con el codigo de operacion de la instruccion, este valor corresponde al orden correlativo de las instrucciones en nuestro programa.

Sumamos el valor del puerto A al del PCL y lo guardamos en el PCL, este nuevo valor de PCL nos llevara a la ubicacion en la TABLA equivalente al valor introducido por el puerto A y cargara en el puerto B el correspondiente valor para ser visualizado en el display.

Si no se entiende la explicacion no duden en preguntar.

Saludos
« Última modificación: 09 de Julio de 2006, 04:35:40 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 maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ejemplos en Asembler PIC16F84A
« Respuesta #23 en: 12 de Julio de 2006, 15:10:14 »
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=16F84A
  13.         include <p16F84A.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

- 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 en Asembler PIC16F84A
« Respuesta #24 en: 12 de Julio de 2006, 15:11:56 »
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
- 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 en Asembler PIC16F84A
« Respuesta #25 en: 12 de Julio de 2006, 15:12:27 »
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=16F84A
  21.         include <p16F84A.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     0x03A0          ;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
- 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 Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler PIC16F84A
« Respuesta #26 en: 16 de Julio de 2006, 16:56:26 »
Muchas gracias Maunix por los aportes. :-)  :-)

Un poco de tiempo y me lanzo con las simulaciones.    :wink: :wink:

Un Saludo
« Última modificación: 16 de Julio de 2006, 17:17:12 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 maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ejemplos en Asembler PIC16F84A
« Respuesta #27 en: 20 de Julio de 2006, 14:53:59 »
Muchas gracias Maunix por los aportes. :-)  :-)

Un poco de tiempo y me lanzo con las simulaciones.    :wink: :wink:

Un Saludo

De nada veguepic, creo que es solo un pequeño aporte que espero le sea útil a varios de los picnautas que usan ensamblador  :) :)
- 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 Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler PIC16F84A
« Respuesta #28 en: 20 de Septiembre de 2006, 22:17:15 »
Uffff,  ya tenia muy olvidado este lugar, aqui el siguiente ejemplo:

Ejemplo 14:

Contador Hexadecimal de un digito con display catodo comun, cambia cada segundo.

Código: ASM
  1. ;       28-08-06
  2. ;       Ejemplo 14
  3. ;       Contador con un Display de cathodo comun
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8. ; sencillo contador continuo de 0 a 9 y demora un segundo cada cambio .
  9.  
  10.         LIST    P=16F84A,                               ; usar PIC 16F84A
  11.         #include <p16f84A.inc>
  12.  
  13.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC
  14. ; code protec   off; power up timer     on; watchdog    off; osc        XT
  15.  
  16.         errorlevel      -302                    ; Elimina el mensaje "bank warning"
  17.  
  18.  
  19. CBLOCK  0x20                                    ; Ubica los registros consecutivamente a partir de la ubicacion 0x20
  20.  
  21. PDel0                                           ; 0x20
  22. PDel1                                           ; 0x21
  23. PDel2                                           ; 0x22
  24. UNIDADES                                        ; 0x23
  25.  
  26. ENDC                                            ; Fin de las registros
  27.  
  28.         ORG     0
  29.         BSF     STATUS,5                        ; activa la pagina 1
  30.         MOVLW   B'00000'                        ; carga 01111 en W
  31.         MOVWF   TRISA                           ; puerto A todos salidas
  32.         MOVLW   B'00000000'                     ; carga 11111111 en W
  33.         MOVWF   TRISB                           ; puerto B todas salidas
  34.         BCF     STATUS,5                        ; volvemos a la pagina 0
  35.  
  36.         CLRF    PORTA                           ; ponemos a cero el puerto A
  37.         CLRF    PORTB                           ; ponemos a cero el puerto B
  38.         CLRF    UNIDADES                        ; ponemos a cero UNIDADES
  39.         MOVLW   0                               ; ponemos a cero W
  40.  
  41.         GOTO    INICIO                          ; va a inicio
  42.  
  43. TABLA
  44.         ADDWF   PCL,1                           ; suma w (valor puerto A) con el valor de PCL
  45.                                                 ; (contador del programa) y lo guarda en PCL
  46.                                                 ; dp-a-b-c-d-e-f-g      orden de los segmentos
  47.         RETLW   B'1111110'                      ; 0, carga B'1111110' en W y retorna
  48.         RETLW   B'0110000'                      ; 1, carga B'0110000' en W y retorna
  49.         RETLW   B'1101101'                      ; 2, carga B'1101101' en W y retorna
  50.         RETLW   B'1111001'                      ; 3, carga B'1111001' en W y retorna
  51.         RETLW   B'0110011'                      ; 4, carga B'0110011' en W y retorna
  52.         RETLW   B'1011011'                      ; 5, carga B'1011011' en W y retorna
  53.         RETLW   B'1011111'                      ; 6, carga B'1011111' en W y retorna
  54.         RETLW   B'1110000'                      ; 7, carga B'1110000' en W y retorna
  55.         RETLW   B'1111111'                      ; 8, carga B'1111111' en W y retorna
  56.         RETLW   B'1111011'                      ; 9, carga B'1111011' en W y retorna
  57.         RETLW   B'1110111'                      ; A, carga B'1110111' en W y retorna
  58.         RETLW   B'0011111'                      ; b, carga B'0011111' en W y retorna
  59.         RETLW   B'1001110'                      ; C, carga B'1001110' en W y retorna
  60.         RETLW   B'0111101'                      ; d, carga B'0111101' en W y retorna
  61.         RETLW   B'1001111'                      ; E, carga B'1001111' en W y retorna
  62.         RETLW   B'1000111'                      ; F, carga B'1000111' en W y retorna
  63.  
  64. INICIO                                          ; etiqueta
  65.         CALL    TABLA                           ; llamamos a TABLA
  66.         MOVWF   PORTB                           ; mueve el dato al puerto B
  67.         CALL    DEMORA
  68.  
  69.         MOVLW   1                               ; pones a 1 W
  70.         ADDWF   UNIDADES,1                      ; suma W a UNIDADES y lo guarda en UNIDADES
  71.         MOVF    UNIDADES,0                      ; mueve UNIDADES a W
  72.         BTFSS   UNIDADES,4                      ; comprueba si el bit 4 de CONTADOR es uno salta
  73.  
  74.         GOTO    INICIO                          ; va a INICIO
  75.  
  76.         CLRF    UNIDADES                        ; borra UNIDADES
  77.         MOVLW   0                               ; pone a 1 W
  78.  
  79.         GOTO    INICIO                          ; va a inicio
  80.  
  81. ;-------------------------------------------------------------
  82. ; Generado con PDEL ver SP  r 1.0  el 27/08/2006 Hs 09:39:14 p.m.
  83. ; Descripcion: Delay 1000000 ciclos = 1 segundo
  84. ;-------------------------------------------------------------
  85. DEMORA  movlw     .14       ; 1 set numero de repeticion  (C)
  86.         movwf     PDel0     ; 1 |
  87. PLoop0  movlw     .72       ; 1 set numero de repeticion  (B)
  88.         movwf     PDel1     ; 1 |
  89. PLoop1  movlw     .247      ; 1 set numero de repeticion  (A)
  90.         movwf     PDel2     ; 1 |
  91. PLoop2  clrwdt              ; 1 clear watchdog
  92.         decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
  93.         goto      PLoop2    ; 2 no, loop
  94.         decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
  95.         goto      PLoop1    ; 2 no, loop
  96.         decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
  97.         goto      PLoop0    ; 2 no, loop
  98. PDelL1  goto PDelL2         ; 2 ciclos delay
  99. PDelL2  clrwdt              ; 1 ciclo delay
  100.         return              ; 2+2 Fin.
  101. ;-------------------------------------------------------------
  102.  
  103.         END                                     ; fin de programa

Saludos
« Última modificación: 20 de Septiembre de 2006, 22:25:55 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 laura_bellver

  • PIC10
  • *
  • Mensajes: 3
Re: Ejemplos en Asembler PIC16F84A
« Respuesta #29 en: 08 de Junio de 2007, 09:40:01 »
Motor paso a paso

Código: ASM
  1. list p=16f84                   
  2.  
  3. //definimos las direcciones necesarias
  4.  
  5. STATUS  equ     03h                    
  6. PORTB   equ     06h                    
  7. TRISB   equ     06h                    
  8. PORTA      equ  05h                    
  9. TRISA   equ     05h                    
  10. pc      equ     02h                    
  11. cont    equ     10h                    
  12. var_A   equ     0ch                    
  13. var_B   equ     0dh                    
  14. RP0     equ     5                      
  15. Z       equ     2                      
  16.  
  17. //ponemos org = 0 para que inicie el programa, rp0 con 1 bit y TRISB = 0 actuaran //como puerto de salida
  18.         org 0
  19.  
  20.                 bsf     STATUS,RP0             
  21.                 clrf    TRISB          
  22.  
  23. //movemos 11 al registro y el registro se mueve a TRISA y se pone el bit rp0 del //registro estatus a cero
  24.  
  25.                 movlw   b'11'                  
  26.                 movwf   TRISA                  
  27.                 bcf     STATUS,RP0             
  28.  
  29. //se crea una variable inici con BUCLE y ESCULL, se limpia y se pone a 0 el //contador se llama la función BUCLE
  30.  
  31. INICI   clrf    cont                   
  32.                
  33. BUCLE           movf    cont,0                 
  34.                 call    ESCULL
  35.                 movwf   PORTB          
  36.                 call    RETARD         
  37.                 incf    cont,1                 
  38.                 movlw   d'10'                  
  39.                 subwf   cont,0                 
  40.                 btfss   STATUS,Z               
  41.                 goto    BUCLE          
  42.                 goto    INICI                  
  43.  
  44. ESCULL          btfsc   PORTA,1         ;salta si el bit 1 = 0
  45.                 goto    BIT0                   
  46.                 btfss   PORTA,0         ;salta si el bit 0 = 1
  47.                 goto    ETAULA0        
  48.                 goto    ETAULA1        
  49. BIT0            btfss   PORTA,0         ;salta si el bit 0 = 1
  50.                 goto    ETAULA2        
  51. ETAULA3         call    TAULA3          ;llama a TAULA 3
  52.                 goto    FI                     
  53. ETAULA2         call    TAULA2          ;llama a TAULA 2
  54.                 goto    FI                     
  55.  ETAULA1                call    TAULA1          ;llama a TAULA 1
  56.                 goto    FI                     
  57. ETAULA0         call    TAULA0          ;llama a TAULA 0
  58. FI              RETURN                  ;vuelve al programa
  59.  
  60. //se crean las tablas para poder interactuar con el motor
  61.  
  62. TAULA0  addwf   pc,1                   
  63.                 retlw   b' 00001010'           
  64.                 retlw   b' 00001001'                   
  65.                 retlw   b' 00000101'
  66.                 retlw   b' 00000110'
  67.                 retlw   b' 00001010'
  68.                 retlw   b' 00001001'
  69.                 retlw   b' 00000101'
  70.                 retlw   b' 00000110'
  71.                
  72.  
  73. TAULA1  addwf   pc,1                   
  74.                 retlw   b' 00001010'           
  75.                 retlw   b' 00001000'                   
  76.                 retlw   b' 00001001'   
  77.                 retlw   b' 00000001'
  78.                 retlw   b' 00000101'
  79.                 retlw   b' 00000100'
  80.                 retlw   b' 00000110'
  81.                 retlw   b' 00000010'
  82.                
  83.  
  84. TAULA2  addwf   pc,1                   
  85.                 retlw   b' 00000110'           
  86.                 retlw   b' 00000101'                   
  87.                 retlw   b' 00001001'
  88.                 retlw   b' 00001010'
  89.                 retlw   b' 00000110'
  90.                 retlw   b' 00000101'
  91.                 retlw   b' 00001001'
  92.                 retlw   b' 00001010'
  93.        
  94.  
  95. TAULA3  addwf   pc,1                   
  96.                 retlw   b' 00000010'           
  97.                 retlw   b' 00000110'                   
  98.                 retlw   b' 00000100'
  99.                 retlw   b' 00000101'
  100.                 retlw   b' 00000001'
  101.                 retlw   b' 00001001'
  102.                 retlw   b' 00001000'
  103.                 retlw   b' 00001010'
  104.        
  105. //se ponemos retardos para facilitar la visualizacion en el montaje
  106.  
  107. RETARD  movlw   d'255'                         
  108.         movwf   var_A                  
  109. //doble bucle
  110.  
  111. LOOP    movlw   d'255'                 
  112.         movwf   var_B                  
  113.  
  114. LOOP1   decfsz  var_B,1        
  115.         goto    LOOP1          
  116.         decfsz  var_A,1        
  117.         goto    LOOP                   
  118.         return                         
  119.         end                             ;finaliza el programa


Si pudiese poner su correspondiente diagrama de flujo tambien lo haria pero no se como...Lo siento, espero que sirva de algo!

Saludos  :-/


 

anything