TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Veguepic en 02 de Junio de 2006, 20:55:01

Título: Ejemplos en Asembler PIC16F84A
Publicado por: Veguepic en 02 de Junio de 2006, 20:55:01
Hola Amigos:

Gracias a que el amigo Vszener amablemente cedio sus Ejemplitos en C y simulaciones, abro este tema para pasar estos ejemplos a Asembler.

Inicialmente voy a utilizar el 16F84A, espero posteriormente migrar el codigo a los micros 16F628, 16F648 y 16F88 que estan por aqui mirandome sin hacer nada.  :shock:

Hoja tecnica 16F84A (http://ww1.microchip.com/downloads/en/DeviceDoc/35007b.pdf)

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

MPLAB (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002)

PROTEUS (http://www.labcenter.co.uk/index_uk.htm)



INDICE




Los Zip tienen los archivos asm, hex y dsn (proteus).

Espero sus criticas, correcciones, sugerencias, etc  :-)
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic en 02 de Junio de 2006, 23:01:12
Aqui va el ejemplo 01:

Prender un led con un 16F84A por RB0, de lo mas sencillo


Código: ASM
  1. ;       02-06-06
  2. ;       Ejemplo 01
  3. ;       Prender un led
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8.  
  9.         LIST    P=16F84A,                               ; usar PIC 16F84A
  10.         #include <p16f84A.inc>
  11.  
  12.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off
  13.                                                         ; power up timer        on
  14.                                                         ; watchdog              off
  15.                                                         ; osc                   XT
  16.  
  17.         ORG     0
  18.         BSF     STATUS,5                                ; activa la pagina 1
  19.         MOVLW   B'00000'                                ; carga 00000 en W
  20.         MOVWF   TRISA                                   ; puerto a todos salidas
  21.         MOVLW   B'00000000'                             ; carga 00000000 en W
  22.         MOVWF   TRISB                                   ; puerto b todos salidaS
  23.         BCF     STATUS,5                                ; volvemos a la pagina 0
  24.  
  25.         BCF     PORTB,0                                 ; ponemos a 0 RB0
  26.         BCF     PORTB,1                                 ; ponemos a 0 RB1
  27.         BCF     PORTB,2                                 ; ponemos a 0 RB2
  28.         BCF     PORTB,3                                 ; ponemos a 0 RB3
  29.         BCF     PORTB,4                                 ; ponemos a 0 RB4
  30.         BCF     PORTB,5                                 ; ponemos a 0 RB5
  31.         BCF     PORTB,6                                 ; ponemos a 0 RB6
  32.         BCF     PORTB,7                                 ; ponemos a 0 RB7
  33.  
  34.                                                         ; luego haremos todos juntos
  35.  
  36. INICIO                                                  ; etiqueta
  37.         BSF     PORTB,0                                 ; pone a 1 RB0
  38.         GOTO    INICIO                                  ; va a inicio
  39.  
  40.         END                                             ; fin de programa
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic en 02 de Junio de 2006, 23:42:06
Ejemplo 02:

Prender y apagar un led cada 0.5 segundos con un 16F84A por RB0


Código: ASM
  1. ;       02-06-06
  2. ;       Ejemplo 02
  3. ;       Prende y apagar un led cada 0.5 seg
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8.  
  9.         LIST    P=16F84A,                               ; usar PIC 16F84A
  10.         #include <p16f84A.inc>
  11.  
  12.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off
  13.                                                         ; power up timer        on
  14.                                                         ; watchdog              off
  15.                                                         ; osc                   XT
  16.  
  17. PDel0   equ     0C
  18. PDel1   equ     0D
  19.  
  20.  
  21.         ORG     0
  22.         BSF     STATUS,5                                ; activa la pagina 1
  23.         MOVLW   B'00000'                                ; carga 00000 en W
  24.         MOVWF   TRISA                                   ; puerto a todos salidas
  25.         MOVLW   B'00000000'                             ; carga 00000000 en W
  26.         MOVWF   TRISB                                   ; puerto b todos salidaS
  27.         BCF     STATUS,5                                ; volvemos a la pagina 0
  28.  
  29.         MOVLW   B'00000000'                             ; ponemos a cero el
  30.         MOVWF   PORTB                                   ; el puerto b
  31.                                                         ; usando esta opcion se ahorran
  32.                                                         ; 6 bytes en comparacion con el
  33.                                                         ; ejemplo 01
  34.  
  35. INICIO                                                  ; etiqueta
  36.         BSF     PORTB,0                                 ; pone a 1 RB0
  37.         CALL    DEMORA                                  ; llama a demora de 0,5 seg
  38.         BCF     PORTB,0                                 ; pone a 0 RB0
  39.         CALL    DEMORA                                  ; llama a demora de 0,5 seg
  40.         GOTO    INICIO                                  ; va a inicio
  41.  
  42. ;-------------------------------------------------------------
  43. ;       La demora a sido generada con el programa PDEL
  44. ;       Delay 250000 ciclos
  45. ;-------------------------------------------------------------
  46.  
  47. DEMORA  movlw     .197                                  ; 1 set numero de repeticion  (B)
  48.         movwf     PDel0                                 ; 1
  49. PLoop1  movlw     .253                                  ; 1 set numero de repeticion  (A)
  50.         movwf     PDel1                                 ; 1
  51. PLoop2  clrwdt                                          ; 1 clear watchdog
  52.         clrwdt                                          ; 1 ciclo delay
  53.         decfsz    PDel1,1                               ; 1 + (1) es el tiempo 0  ? (A)
  54.         goto      PLoop2                                ; 2 no, loop
  55.         decfsz    PDel0,1                               ; 1 + (1) es el tiempo 0  ? (B)
  56.         goto      PLoop1                                ; 2 no, loop
  57. PDelL1  goto PDelL2                                     ; 2 ciclos delay
  58. PDelL2  
  59.         return                                          ; 2+2 Fin.
  60. ;---------------------------------------
  61.  
  62.         END                                             ; fin de programa
  63.  



Bueno hasta aqui por el dia de hoy.

Saludos
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic en 03 de Junio de 2006, 23:20:21
Ejemplo 03:

Prender y apagar 4 leds cada segundo (RB0 a RB3). 0,5 segundos prendido y 0,5 segundos apagado con un 16F84A

Código: ASM
  1. ;       03-06-06
  2. ;       Ejemplo 03
  3. ;       Prender y apagar un 4 leds cada 1 seg
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8.  
  9.         LIST    P=16F84A,                               ; usar PIC 16F84A
  10.         #include <p16f84A.inc>
  11.  
  12.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off
  13.                                                         ; power up timer        on
  14.                                                         ; watchdog              off
  15.                                                         ; osc                   XT
  16.  
  17. PDel0   equ     0C
  18. PDel1   equ     0D
  19.  
  20.  
  21.         ORG     0
  22.         BSF     STATUS,5                                ; activa la pagina 1
  23.         MOVLW   B'00000'                                ; carga 00000 en W
  24.         MOVWF   TRISA                                   ; puerto a todos salidas
  25.         MOVLW   B'00000000'                             ; carga 00000000 en W
  26.         MOVWF   TRISB                                   ; puerto b todos salidaS
  27.         BCF     STATUS,5                                ; volvemos a la pagina 0
  28.  
  29.         MOVLW   B'00000000'                             ; ponemos a cero el
  30.         MOVWF   PORTB                                   ; el puerto b
  31.                                                         ; usando esta opcion se ahorran
  32.                                                         ; 6 bytes en comparacion con el
  33.                                                         ; ejemplo 01
  34.  
  35. INICIO                                                  ; etiqueta
  36.  
  37.         MOVLW   B'00001111'                             ; prendemos leds RB0 a RB3
  38.         MOVWF   PORTB                                   ; cargamos el puerto b
  39.  
  40.         CALL    DEMORA                                  ; llama a demora de 0,5 seg
  41.  
  42.         MOVLW   B'00000000'                             ; apagamos leds RB0 a RB3
  43.         MOVWF   PORTB                                   ; cargamos el puerto b
  44.  
  45.         CALL    DEMORA                                  ; llama a demora de 0,5 seg
  46.         GOTO    INICIO                                  ; va a inicio
  47.  
  48. ;-------------------------------------------------------------
  49. ;       La demora a sido generada con el programa PDEL
  50. ;       Delay 500000 ciclos
  51. ;-------------------------------------------------------------
  52.  
  53. DEMORA  movlw     .239      ; 1 set numero de repeticion  (B)
  54.         movwf     PDel0     ; 1 |
  55. PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
  56.         movwf     PDel1     ; 1 |
  57. PLoop2  clrwdt              ; 1 clear watchdog
  58. PDelL1  goto PDelL2         ; 2 ciclos delay
  59. PDelL2  goto PDelL3         ; 2 ciclos delay
  60. PDelL3  clrwdt              ; 1 ciclo delay
  61.         decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
  62.         goto      PLoop2    ; 2 no, loop
  63.         decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
  64.         goto      PLoop1    ; 2 no, loop
  65. PDelL4  goto PDelL5         ; 2 ciclos delay
  66. PDelL5  goto PDelL6         ; 2 ciclos delay
  67. PDelL6  goto PDelL7         ; 2 ciclos delay
  68. PDelL7  clrwdt              ; 1 ciclo delay
  69.         return              ; 2+2 Fin.
  70.  
  71. ;---------------------------------------
  72.  
  73.         END                                             ; fin de programa
  74.  

Título: Re: Ejemplos en Asembler
Publicado por: Veguepic en 05 de Junio de 2006, 01:01:11
Ejeplo 04:

Efecto de luces tipo Auto Fantastico con un 16F84A por el puerto b, RB0 a RB7
Código: ASM
  1. ;       04-06-06
  2. ;       Ejemplo 04
  3. ;       Luces del Auto fantastico
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8.  
  9.         LIST    P=16F84A,                               ; usar PIC 16F84A
  10.         #include <p16f84A.inc>
  11.  
  12.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off
  13.                                                         ; power up timer        on
  14.                                                         ; watchdog              off
  15.                                                         ; osc                   XT
  16.  
  17. PDel0   equ     0C
  18. PDel1   equ     0D
  19.  
  20.  
  21.         ORG     0
  22.         BSF     STATUS,5                                ; activa la pagina 1
  23.         MOVLW   B'00000'                                ; carga 00000 en W
  24.         MOVWF   TRISA                                   ; puerto a todos salidas
  25.         MOVLW   B'00000000'                             ; carga 00000000 en W
  26.         MOVWF   TRISB                                   ; puerto b todos salidaS
  27.         BCF     STATUS,5                                ; volvemos a la pagina 0
  28.  
  29.         MOVLW   B'00000000'                             ; ponemos a cero el
  30.         MOVWF   PORTB                                   ; el puerto b
  31.  
  32. INICIO                                                  ; etiqueta
  33.  
  34.         BSF     PORTB,0                                 ; prendemos y apagamos
  35.         CALL    DEMORA                                  ; led por led
  36.         BCF     PORTB,0                                 ; despues trataremos de
  37.                                                         ; usar otra funcion
  38.         BSF     PORTB,1
  39.         CALL    DEMORA
  40.         BCF     PORTB,1
  41.  
  42.         BSF     PORTB,2
  43.         CALL    DEMORA
  44.         BCF     PORTB,2
  45.  
  46.         BSF     PORTB,3
  47.         CALL    DEMORA
  48.         BCF     PORTB,3
  49.  
  50.         BSF     PORTB,4
  51.         CALL    DEMORA
  52.         BCF     PORTB,4
  53.  
  54.         BSF     PORTB,5
  55.         CALL    DEMORA
  56.         BCF     PORTB,5
  57.  
  58.         BSF     PORTB,6
  59.         CALL    DEMORA
  60.         BCF     PORTB,6
  61.  
  62.         BSF     PORTB,7
  63.         CALL    DEMORA
  64.         BCF     PORTB,7
  65.  
  66.         BSF     PORTB,6
  67.         CALL    DEMORA
  68.         BCF     PORTB,6
  69.  
  70.         BSF     PORTB,5
  71.         CALL    DEMORA
  72.         BCF     PORTB,5
  73.  
  74.         BSF     PORTB,4
  75.         CALL    DEMORA
  76.         BCF     PORTB,4
  77.  
  78.         BSF     PORTB,3
  79.         CALL    DEMORA
  80.         BCF     PORTB,3
  81.  
  82.         BSF     PORTB,2
  83.         CALL    DEMORA
  84.         BCF     PORTB,2
  85.  
  86.         BSF     PORTB,1
  87.         CALL    DEMORA
  88.         BCF     PORTB,1
  89.  
  90.  
  91.         GOTO    INICIO                                  ; va a inicio
  92.  
  93. ;-------------------------------------------------------------
  94. ;       La demora a sido generada con el programa PDEL
  95. ;       Descripcion: Delay 100000 ciclos - 100 ms
  96. ;-------------------------------------------------------------
  97. DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)
  98.         movwf     PDel0     ; 1 |
  99. PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
  100.         movwf     PDel1     ; 1 |
  101. PLoop2  clrwdt              ; 1 clear watchdog
  102.         clrwdt              ; 1 ciclo delay
  103.         decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
  104.         goto      PLoop2    ; 2 no, loop
  105.         decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
  106.         goto      PLoop1    ; 2 no, loop
  107. PDelL1  goto PDelL2         ; 2 ciclos delay
  108. PDelL2  goto PDelL3         ; 2 ciclos delay
  109. PDelL3  clrwdt              ; 1 ciclo delay
  110.         return              ; 2+2 Fin.
  111. ;-------------------------------------------------------------
  112.  
  113.         END                                             ; fin de programa
  114.  



Título: Re: Ejemplos en Asembler
Publicado por: Veguepic en 05 de Junio de 2006, 12:18:22
Ejemplo 05:

Gracias a la ayuda de BrunoF, he corregido este ejemplo, en la simulacion no daba problemas pero armando el circuito prendia dos leds en vez de uno, era debido a que no habia puesto a cero el bit de acarreo o carry del registro STATUS. Hecho esto el ejemplo funciona correctamente.

El codigo anterior ocupaba 65 espacios de memoria de 1024 dispònibles, optimizando el codigo anterior ahora ocupa solo 33 usando las funciones RLF y RRF.

Código: ASM
  1. ;       05-06-06
  2. ;       Ejemplo 05
  3. ;       Luces del Auto fantastico - optimizado
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8.  
  9.         LIST    P=16F84A,                               ; usar PIC 16F84A
  10.         #include <p16f84A.inc>
  11.  
  12.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off
  13.                                                         ; power up timer        on
  14.                                                         ; watchdog              off
  15.                                                         ; osc                   XT
  16.  
  17. PDel0   equ     0C
  18. PDel1   equ     0D
  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'00000000'                             ; carga 00000000 en W
  25.         MOVWF   TRISB                                   ; puerto b todos salidaS
  26.         BCF     STATUS,5                                ; volvemos a la pagina 0
  27.  
  28.         CLRF    PORTB                                   ; ponemos a cero el puerto b
  29.  
  30. INICIO                                                  ; etiqueta
  31.         BSF     PORTB,0                                 ; prende RB0
  32.         BCF     STATUS,0                                ; limpia el carry de STATUS,C
  33.        
  34. REPETIR
  35.  
  36. IZQ
  37.         CALL    DEMORA                                  ; demora de 100ms
  38.         RLF     PORTB,1                                 ; rota el contenido de portb a la derecha
  39.         BTFSS   PORTB,7                                 ; hasta que prenda RB7, luego se salta
  40.         GOTO    IZQ                                     ; una linea
  41.  
  42. DER
  43.         CALL    DEMORA                                  ; demora de 100 ms
  44.         RRF     PORTB,1                                 ; rota el contenido de portb a la izquierda
  45.         BTFSS   PORTB,0                                 ; hasta que prenda RB0, luego salta
  46.         GOTO    DER                                     ; una linea
  47.  
  48.         GOTO    REPETIR                                 ; repite el ciclo
  49.  
  50.         GOTO    INICIO                                  ; va a inicio
  51.  
  52. ;-------------------------------------------------------------
  53. ;       La demora a sido generada con el programa PDEL
  54. ;       Descripcion: Delay 100000 ciclos - 100 ms
  55. ;-------------------------------------------------------------
  56. DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)
  57.         movwf     PDel0     ; 1 |
  58. PLoop1  movlw     .181      ; 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  goto PDelL3         ; 2 ciclos delay
  68. PDelL3  clrwdt              ; 1 ciclo delay
  69.         return              ; 2+2 Fin.
  70. ;-------------------------------------------------------------
  71.  
  72.         END                                             ; fin de programa
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic en 07 de Junio de 2006, 00:09:16
Ejemplo 06:

Juego de luces, las luces se cruzan de lado a lado.


Código: ASM
  1. ;       06-06-06
  2. ;       Ejemplo 06
  3. ;       Juego de luces
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8.  
  9.         LIST    P=16F84A,                               ; usar PIC 16F84A
  10.         #include <p16f84A.inc>
  11.  
  12.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off
  13.                                                         ; power up timer        on
  14.                                                         ; watchdog              off
  15.                                                         ; osc                   XT
  16.  
  17. PDel0   equ     0C
  18. PDel1   equ     0D
  19.  
  20. ; el efecto que se busca es de dos luces que parten de los extremos expuestos y se muevan
  21. ; de lado a lado.
  22.  
  23. SEC1    equ     B'10000001'
  24. SEC2    equ     B'01000010'
  25. SEC3    equ     B'00100100'
  26. SEC4    equ     B'00011000'
  27.  
  28. ; se podri haber seguido con
  29. ; SEC5  equ     B'00100100' pero es igual a SEC3 y asi para los demas
  30. ; por lo que se invierte la secuencia SEC3, SEC2, SEC1
  31.  
  32.  
  33.  
  34.         ORG     0
  35.         BSF     STATUS,5                                ; activa la pagina 1
  36.         MOVLW   B'00000'                                ; carga 00000 en W
  37.         MOVWF   TRISA                                   ; puerto a todos salidas
  38.         MOVLW   B'00000000'                             ; carga 00000000 en W
  39.         MOVWF   TRISB                                   ; puerto b todos salidaS
  40.         BCF     STATUS,5                                ; volvemos a la pagina 0
  41.  
  42.         CLRF    PORTB                                   ; ponemos a cero el puerto b
  43.  
  44. INICIO                                                  ; etiqueta
  45.        
  46. REPETIR
  47.  
  48.         MOVLW   SEC1                                    ; carga el valor de SEC1 en W
  49.         MOVWF   PORTB                                   ; carga w en el puerto b
  50.         CALL    DEMORA                                  ; demora de 100ms
  51.  
  52.         MOVLW   SEC2                                    ; carga el valor de SEC2 en W
  53.         MOVWF   PORTB                                   ; carga w en el puerto b
  54.         CALL    DEMORA                                  ; demora de 100ms
  55.  
  56.         MOVLW   SEC3                                    ; carga el valor de SEC3 en W
  57.         MOVWF   PORTB                                   ; carga w en el puerto b
  58.         CALL    DEMORA                                  ; demora de 100ms
  59.  
  60.         MOVLW   SEC4                                    ; carga el valor de SEC4 en W
  61.         MOVWF   PORTB                                   ; carga w en el puerto b
  62.         CALL    DEMORA                                  ; demora de 100ms
  63.  
  64.         MOVLW   SEC3                                    ; carga el valor de SEC3 en W
  65.         MOVWF   PORTB                                   ; carga w en el puerto b
  66.         CALL    DEMORA                                  ; demora de 100ms
  67.  
  68.         MOVLW   SEC2                                    ; carga el valor de SEC2 en W
  69.         MOVWF   PORTB                                   ; carga w en el puerto b
  70.         CALL    DEMORA                                  ; demora de 100ms
  71.  
  72.         MOVLW   SEC1                                    ; carga el valor de SEC1 en W
  73.         MOVWF   PORTB                                   ; carga w en el puerto b
  74.         CALL    DEMORA                                  ; demora de 100ms
  75.  
  76.         GOTO    INICIO                                  ; va a inicio
  77.  
  78.  
  79. ;-------------------------------------------------------------
  80. ;       La demora a sido generada con el programa PDEL
  81. ;       Descripcion: Delay 100000 ciclos - 100 ms
  82. ;-------------------------------------------------------------
  83. DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)
  84.         movwf     PDel0     ; 1 |
  85. PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
  86.         movwf     PDel1     ; 1 |
  87. PLoop2  clrwdt              ; 1 clear watchdog
  88.         clrwdt              ; 1 ciclo delay
  89.         decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
  90.         goto      PLoop2    ; 2 no, loop
  91.         decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
  92.         goto      PLoop1    ; 2 no, loop
  93. PDelL1  goto PDelL2         ; 2 ciclos delay
  94. PDelL2  goto PDelL3         ; 2 ciclos delay
  95. PDelL3  clrwdt              ; 1 ciclo delay
  96.         return              ; 2+2 Fin.
  97. ;-------------------------------------------------------------
  98.  
  99.         END                                             ; fin de programa
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic en 11 de Junio de 2006, 22:58:44
Ejemplo 07:

Juego de luces, son dos luces que se mueven en 4 posiciones de lado a lado. Movemos una luz de lado a lado entre los cuatro bits bajos y con la funcion SWAPF copiamos para los bits altos.


Código: ASM
  1. ;       11-06-06
  2. ;       Ejemplo 07
  3. ;       Juego de luces
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8. ; el efecto que se busca es de dos luces que se mueven en 4 posiciones de lado a lado.
  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. PDel0   equ     0C
  19. PDel1   equ     0D
  20.  
  21. SEC1    equ     0E
  22. SEC2    equ     0f
  23.  
  24.         ORG     0
  25.         BSF     STATUS,5                                ; activa la pagina 1
  26.         MOVLW   B'00000'                                ; carga 00000 en W
  27.         MOVWF   TRISA                                   ; puerto a todos salidas
  28.         MOVLW   B'00000000'                             ; carga 00000000 en W
  29.         MOVWF   TRISB                                   ; puerto b todos salidaS
  30.         BCF     STATUS,5                                ; volvemos a la pagina 0
  31.  
  32.         CLRF    PORTA                                   ; ponemos a cero el puerto a
  33.         CLRF    PORTB                                   ; ponemos a cero el puerto b
  34.         BCF     STATUS,0                                ; limpia el carry de STATUS,C
  35.  
  36.         MOVLW   B'00000001'                             ; carga 00000001 en w
  37.         MOVWF   SEC1                                    ; guarda el valor en SEC1
  38.  
  39. INICIO                                                  ; etiqueta
  40.  
  41. DERECHA                                                 ; rutina para mover a derecha
  42.         CALL    CAMBIAR                                 ; llama a CAMBIAR
  43.         RLF     SEC1,1                                  ; mueve el contenido a la izquierda y lo guarda en SEC1
  44.         BTFSS   SEC1,3                                  ; si el bit 7 es igual a 1 salta una instruccion
  45.         GOTO    DERECHA                                 ; repite la rutina derecha
  46.  
  47. IZQUIERDA                                               ; rutina para mover a izquierda
  48.         CALL    CAMBIAR                                 ; llama a CAMBIAR
  49.         RRF     SEC1,1                                  ; mueve el contenido a la izquierda y lo guarda en SEC1
  50.         BTFSS   SEC1,0                                  ; si el bit 0 es igual a 1 salta una instruccion
  51.         GOTO    IZQUIERDA                               ; repite la rutina izquierda
  52.  
  53.         GOTO    INICIO                                  ; va a inicio
  54.  
  55. CAMBIAR                                                 ; rutina para repetir los 4 bits bajos en los 4 bits altos
  56.         SWAPF   SEC1,0                                  ; intercambia los 4 bits bajos por los 4 bits altos
  57.         MOVWF   SEC2                                    ; guarda el valor en SEC2
  58.         MOVF    SEC1,0                                  ; carga SEC1 en w
  59.         ADDWF   SEC2,1                                  ; suma w y SEC2 y lo guarda en SEC2
  60.         MOVF    SEC2,0                                  ; carga SE21 en w
  61.         MOVWF   PORTB                                   ; mueve el valor de w en el puerto b
  62.         CALL    DEMORA                                  ; demora de 200ms
  63.  
  64.         RETURN
  65.  
  66. ;-------------------------------------------------------------
  67. ;       La demora a sido generada con el programa PDEL
  68. ;       Descripcion: Delay 200000 ciclos - 200 ms
  69. ;-------------------------------------------------------------
  70.  
  71. DEMORA  movlw   .156            ; 1 set numero de repeticion  (B)
  72.         movwf   PDel0           ; 1 |
  73. PLoop1  movlw   .213            ; 1 set numero de repeticion  (A)
  74.         movwf   PDel1           ; 1 |
  75. PLoop2  clrwdt                  ; 1 clear watchdog
  76. PDelL1  goto    PDelL2          ; 2 ciclos delay
  77. PDelL2
  78.         decfsz  PDel1,1         ; 1 + (1) es el tiempo 0  ? (A)
  79.         goto    PLoop2          ; 2 no, loop
  80.         decfsz  PDel0,1         ; 1 + (1) es el tiempo 0  ? (B)
  81.         goto    PLoop1          ; 2 no, loop
  82. PDelL3  goto PDelL4             ; 2 ciclos delay
  83. PDelL4  clrwdt                  ; 1 ciclo delay
  84.         return                  ; 2+2 Fin.
  85. ;-------------------------------------------------------------
  86.  
  87.         END                                             ; fin de programa

Título: Re: Ejemplos en Asembler
Publicado por: BrunoF en 12 de Junio de 2006, 00:38:30
Hola veguepic, voy a aclararte el tema del Carry, porque probablemente te surjan problemas futuros si lo utilizas asi.
Si vos queres realizar una Rotacion hacia la Izquierda o la Derecha, y asegurarte que el bit que ingrese(es decir, el valor de STATUS,C) valga cero,es NECESARIO limpiar el carry inmediatamente antes de CADA UNA de las instrucciones RLF o RRF.
Si te fijas en tu ultimo programa, por ejemplo, tenes instrucciones como la ADDWF, o las mismísimas RLF y RRF, etc que afectan al Carry. Por lo tanto, la unica forma de asegurarte que ingrese un cero en la rotacion es limpiando el carry inmediatamente antes de cada instruccion de rotacion que pongas.Puede que el codigo funcione bien, pero cualquier modificacion del mismo probablemente contraiga errores.
Recorda que muchas instrucciones afectan el flag C(carry) del registro especial STATUS y te pueden hacer ingresar "unos" cuando realizas las rotaciones, por lo tanto, casi nunca es suficiente con limpiarlo solamente en el inicio del programa.

Un ej(trozo de codigo del ultimo programa ejemplo que publicaste):

Código: ASM
  1. INICIO                                                  ; etiqueta
  2.  
  3. DERECHA                                                 ; rutina para mover a derecha  
  4.         CALL    CAMBIAR                                 ; llama a CAMBIAR      
  5.         BCF     STATUS,0
  6.         RLF     SEC1,1                                  ; mueve el contenido a la izquierda y lo guarda en SEC1
  7.         BTFSS   SEC1,3                                  ; si el bit 7 es igual a 1 salta una instruccion       
  8.         GOTO    DERECHA                                 ; repite la rutina derecha
  9. IZQUIERDA                                               ; rutina para mover a izquierda
  10.         CALL    CAMBIAR                                 ; llama a CAMBIAR      
  11.         BCF     STATUS,0
  12.         RRF     SEC1,1                                  ; mueve el contenido a la izquierda y lo guarda en SEC1
  13.         BTFSS   SEC1,0                                  ; si el bit 0 es igual a 1 salta una instruccion       
  14.         GOTO    IZQUIERDA                               ; repite la rutina izquierda    
  15.         GOTO    INICIO

Saludos.
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic en 12 de Junio de 2006, 02:29:58
Hola BrunoF:

Si me queda en claro que debo tener cuidado con el carry por el problema del ejemplo 5 que me ayudaste, por lo cual verifique los registro y memoria con el debugger de MPLab para ver su comportamiento.

Si bien en este ejemplo sencillo no tuve problemas, estoy consiente que ha futuro debia verificar el carry, con lo que me propones me evito este trabajo pues me aseguro de esto.

Te agradesco la aclaracion pues es una buena practica en programacion lo que me indicas, por lo cual la pondre en practica y me evitare futuros problemas.

Espero que cada vez que puedas te des una vuelta por aca para indicarme cualquier error, que no seran pocos, o alguna sugerencia.

Saludos
Título: Re: Ejemplos en Asembler
Publicado por: BrunoF en 12 de Junio de 2006, 04:42:33
Hola veguepic. Con placer pasare por aqui y revisare los programas, que son muy utiles para quienes se incian en este lenguaje.
He notado que has puesto algunas lineas de mas, seguramente para facilitar la comprension de los que se inician.
Ejemplo:

los movlw  b'00000000'
     movwf  TRISX   ;donde X es el puerto(A o B)

podrian ser reemplazados por:

    clrf   TRISX

Y un caso mas que veo a simple vista:

Código: ASM
  1. CAMBIAR                                                 ; rutina para repetir los 4 bits bajos en los 4 bits altos      
  2.         SWAPF   SEC1,0                                  ; intercambia los 4 bits bajos por los 4 bits altos    
  3.         MOVWF   SEC2                                    ; guarda el valor en SEC2      
  4.         MOVF    SEC1,0                                  ; carga SEC1 en w      
  5.         ADDWF   SEC2,1                                  ; suma w y SEC2 y lo guarda en SEC2    
  6.         MOVF    SEC2,0                                  ; carga SE21 en w      
  7.         MOVWF   PORTB                                   ; mueve el valor de w en el puerto b   
  8.         CALL    DEMORA                                  ;demora de 200ms
  9.  
  10.         RETURN
  11.  

Podria ser, directamente:

Código: ASM
  1. CAMBIAR                                                 ; rutina para repetir los 4 bits bajos en los 4 bits altos      
  2.         SWAPF   SEC1,0                                  ; intercambia los 4 bits bajos por los 4 bits altos    
  3.         ADDWF   SEC1,0                                  ; suma w a SEC1 y lo guarda en W
  4.         MOVWF   PORTB                                   ; mueve el valor de w en el puerto b
  5.         CALL    DEMORA                                  ; demora de 200ms
  6.  
  7.         RETURN

No lo digo a manera de critica ni mucho menos, es simplemente para mostrar diversas posibilidades, e ir "abriendo" la forma de pensar de las personas que se inician en este apasionante lenguaje.
Saludos.
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic en 13 de Junio de 2006, 23:36:58
Hola BrunoF:

No hay problema, todo aporte, sugerencia, critica, correccion son bienvenidas.  :-) :-)

En algunos casos puse lineas de mas para facilitar la comprension, pues a mi me ayudo bastante.

Espero seguir añadiendo mas estos dias y te tomo la palabra Bruno a la vez que te agradesco el que pases por aqui de vez en cuando.

Un abrazo.
Título: Re: Ejemplos en Asembler
Publicado por: andyros en 16 de Junio de 2006, 14:20:20
Hola veguepic , he leido en otro post que te quieres animar a crear programas en asm para el pic 16f648a, yo tambien me quiero unir ( si es posible ) , ya que quiero meterle mano a este micro.

un saludo

P.D CUANDO QUIERAS EMPEZAMOS.   :-/ :-/
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic en 16 de Junio de 2006, 20:48:11
Hola Andyros:

Pues con mucho gusto, todavia no he tocado el 16F648A, te parece un par de dias para darle una buena leida al Datasheet y empezamos.

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

venga un saludo.


P.D. NO HE TENIDO TIEMPO DE PROBARLO, SI LO PROBAIS NO UTILIZEIS OSCILADOR NI CONECTEIS EL MCLR OK.
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic 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
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic 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
Título: Re: Ejemplos en Asembler
Publicado por: Veguepic 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
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: LabPIC 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
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Veguepic 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.
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: LabPIC en 26 de Junio de 2006, 14:56:42
Claro veguepic, por allá te esperamos :mrgreen:.

Saludos LabPIC
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Veguepic 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
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: maunix 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
  85.  
  86.  

Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: maunix 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
  144.  
  145.  
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: maunix 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
  121.  
  122.  
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Veguepic 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
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: maunix 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  :) :)
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Veguepic 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
  104.  
  105.  

Saludos
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: laura_bellver 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
  120.  


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

Saludos  :-/
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: ftp5763 en 14 de Julio de 2007, 17:05:46
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
hola!! estube viendo los ejemplos porque tenia dudas de como hacer un timer lo que hice fue simular al ejercicio del led que se prende cada 0,5 seg atravez del mplab 5.7 con unas opcion llamada "trace points " y visualizando los resultados con su ventana (windows>>trace memory),al hacer esto solo registra el primer destello del led a los 9microsegundos y despues nada............ ¿que pasa?estoy haciendo algo mal? no es la forma de verlo? me estoy volviendo loco!!!!!!!!!! este es el mejor programa para simular programas en assembler??? hay otros mejores,mas amigables al uso???
les agradeceria sin me dan una mano. desde ya gracias por sus respuestas
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: PolloX en 16 de Julio de 2007, 18:08:23
pues a mi me gustaria tener las simulaciones en proteus del ejemplo 8 y 9 pero los enlaces están malos, o mas bien los archivos están corruptos o algo por el estilo, ya que los descargo pero no se abren con winrar ni winzip.

saludos.
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Meta en 14 de Agosto de 2007, 21:53:33
Hola, está muy bueno los ejemplos.

Sólo faltan apra los novatos como yo, que hagan unos pequeños tutoriales de cómo compilar en .asm a .hex paso por paso y con fotos. Y ver el funcionamiento.


Después otro con proteus, después otro tutorial como cargar el .hex al PIC con ic-prog y la placa programadora, etc...

Creo que puedo hacer algunos si me dan datos, para yo hacerlo con todo detalle y pasarlo a PDF.

Así los super novatos que quieran probar PIC nada más empezar, no estaría nada mal probar aunque no sepan anda lo que hace, seguir un tutorial hasta con una protoboard (eso si se hacerlo) y que funcione el circuito. Más adelante se explicará todo.







Ejemplo con un posible futuro MPLAB (ya van por la 7.60)

TUTORIAL DE MPLAB
Contenido.-
1. Introducción
2. Instalación del MPLAB
3. Creando un nuevo proyecto
4. Escribiendo un programa
5. Usando el MPASM
6. Introducción al MPSIM
7. Usando el MPLINK
8. Usando el MPLIB
9. Generando estímulos usando el lenguaje SCL
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Nocturno en 25 de Agosto de 2007, 04:47:23
Pues inténtalo, empieza y ve publicándolo por aquí. Verás como lo sacas adelante.
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: ING_APOLINAR en 20 de Enero de 2009, 00:09:02
 hola mira soy nuevo en esto de los pic soy maestro y pues en realidad en una clase que doy pues me toca dar pics en una unidad y la vdd el maestro que em dio esa materia no me enseno nada y pues encontre estos codigos  pero me gustaria saber los diagramas para ponerselos a mis alumnos

gracias

 :-/
Hola Amigos:

Gracias a que el amigo Vszener amablemente cedio sus Ejemplitos en C y simulaciones, abro este tema para pasar estos ejemplos a Asembler.

Inicialmente voy a utilizar el 16F84A, espero posteriormente migrar el codigo a los micros 16F628, 16F648 y 16F88 que estan por aqui mirandome sin hacer nada.  :shock:

Hoja tecnica 16F84A (http://ww1.microchip.com/downloads/en/DeviceDoc/35007b.pdf)

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

MPLAB (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002)

PROTEUS (http://www.labcenter.co.uk/index_uk.htm)



INDICE

  • 01.- Prender un led (http://www.todopic.com.ar/foros/index.php?topic=12345.msg69623#msg69623)
  • 02.- Prender y apagar un led cada 0.5 segundos (http://www.todopic.com.ar/foros/index.php?topic=12345.msg69625#msg69625)
  • 03.- Prender y apagar 4 leds cada segundo (http://www.todopic.com.ar/foros/index.php?topic=12345.msg69680#msg69680)
  • 04.- Auto Fantastico (http://www.todopic.com.ar/foros/index.php?topic=12345.msg69780#msg69780)
  • 05.- Auto Fantastico - codigo optimizado (http://www.todopic.com.ar/foros/index.php?topic=12345.msg69817#msg69817)
  • 06.- Juego de luces - dos luces que se cruzan (http://www.todopic.com.ar/foros/index.php?topic=12345.msg70000#msg70000)
  • 07.- Juego de luces - dos luces que se mueven de lado a lado (http://www.todopic.com.ar/foros/index.php?topic=12345.msg70512#msg70512)
  • 08.- Encender 4 luces - al presionar un interruptor se prende el led correspondiente (http://www.todopic.com.ar/foros/index.php?topic=12345.msg72255#msg72255)
  • 09.- Encender 4 luces - igual que el anterior pero de otra forma (http://www.todopic.com.ar/foros/index.php?topic=12345.msg72256#msg72256)
  • 10.- Manejo de un Display de catodo comun (http://www.todopic.com.ar/foros/index.php?topic=12345.msg73948#msg73948)
  • 11.- Rutina de Lectura de una Tabla en Memoria de Programa, sin importar donde esté ubicada - Versión 0.1 (por Maunix) (http://www.todopic.com.ar/foros/index.php?topic=12345.msg74300#msg74300)
  • 12.- Rutina de Lectura de una Tabla en Memoria de Programa, sin importar donde esté ubicada - Versión 0.2 (por Maunix) (http://www.todopic.com.ar/foros/index.php?topic=12345.msg74301#msg74301)
  • 13.- Rutina de Lectura de una Tabla en Memoria de Programa, sin importar donde esté ubicada - Versión 0.3 (por Maunix) (http://www.todopic.com.ar/foros/index.php?topic=12345.msg74302#msg74302)
  • 14.- Contador Hexadecimal de un digito con display catodo comun, cambia cada segundo. (http://www.todopic.com.ar/foros/index.php?topic=12345.msg82948#msg82948)



Los Zip tienen los archivos asm, hex y dsn (proteus).

Espero sus criticas, correcciones, sugerencias, etc  :-)

Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: ING_APOLINAR en 20 de Enero de 2009, 00:11:53
que hay miren soy maestro cuando estudie el ing que me dio clases no me enseno nada y pues en una clase que doy pues en una unidad doy pic y encontre estas practicas pero como puedo obtener los diagramas????? 


gracias
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: todopic en 20 de Enero de 2009, 18:58:10
Hola Apolinar, bienvenido al foro!

Cuando dices los diagramas, te refieres a diagramas de flujo del programa o circuito electrico?

Norberto
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: electrodopaje en 29 de Noviembre de 2009, 20:07:47
saludos

quisiera saber donde puedo conseguir un compilador en assembler y  cual seria el nombre del compilador mas recomendable , gracias
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: jhozate en 29 de Noviembre de 2009, 20:15:49
diria yo que para los PIC el mejor y mas utilizado es MPLAB aqui (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002) podes mirar info y descargarlo
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: KALLITOS en 29 de Noviembre de 2009, 21:34:17
diria yo que para los PIC el mejor y mas utilizado es MPLAB aqui (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002) podes mirar info y descargarlo

Hola jhozate, disculpa mi ignorancia, pero existen otros compiladores asm para pics???

Saludos
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: jhozate en 29 de Noviembre de 2009, 21:45:23
diria yo que para los PIC el mejor y mas utilizado es MPLAB aqui (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002) podes mirar info y descargarlo

Hola jhozate, disculpa mi ignorancia, pero existen otros compiladores asm para pics???

Saludos

 :D :D :oops:...no verdad..no hay mas
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Suky en 29 de Noviembre de 2009, 22:19:09
Y el GPutils (http://gputils.sourceforge.net/)? Es equivalente al MPasm  ;-)


Saludos!
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: jhozate en 29 de Noviembre de 2009, 22:46:59
anda.. :shock:..ni idea q habia mas
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Suky en 29 de Noviembre de 2009, 23:28:23
anda.. :shock:..ni idea q habia mas

jejeje! Yo tampoco, en una oportunidad lo vi de pasada en un foro dedicado a PIC y Linux  :mrgreen:
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: matius1458 en 03 de Febrero de 2010, 18:46:40
una pregunta

los pines que  sobran los dejo al aire o los conecto a 5v por medio de una resistencia de 10k

si me pudieran explicar eso o en que casos se conecta se los agradeceria un monton ya que soy un poco nuevo en esto
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Suky en 04 de Febrero de 2010, 00:50:27
Yo en una ambiente libre de ruido los dejo al aire y no he tenido inconvenientes. En cambio si va a estar en un ambiente ruidoso (electromagnético  :mrgreen: ) se les puede colocar una resistencia pull-up o pull-down  :tongue:


Saludos!
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Nocturno en 04 de Febrero de 2010, 02:49:02
También puedes configurarlos como salidas...
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: agauss en 18 de Marzo de 2011, 21:35:40
Pues me di un paseo por este todo el post y no vi un ejemlo de manejo de la LCD con el PIC16F84A asi que esta es mi contribucion al tema. Se trata de un contador de 0-9. Es algo muy basico y es que la verdad la idea es mas bien enfocarse en el proceso de inicializacion y manejo y envio de comandos y datos. Esta hecho para manejarse con un BUS de 8 lineas.

Código: [Seleccionar]
;**************************************************************
;*                                                            *
;*         Ensamblador para microcontroladores MPASM          *
;*                                                            *
;* NOMBRE  : pic8lcd.asm                                      *
;* OBJETIVO: Contador 0-9 con salida a LCD configurada  a  un *
;*           bus de 8 lineas, controladas por el puerto B del *
;*           PIC16F84A. Las lineas  EN y RS  estan  sobre  el *
;*      puerto A en los bits 0 y 1 respectivamente.           *
;*                                                            *
;* AUTOR   :                 antonio gauss                    *
;* EMAIL   :            agauss@todopic.zzn.com                *
;*                                                            *
;**************************************************************


         title "PIC16F84A, pic8lcd.asm"
         list p=16f84a, f=inhx8m
         #include <p16f84a.inc>
         __config _XT_OSC & _WDT_OFF & _CP_OFF & _PWRTE_ON


STATUS   equ    0x03
PORTA    equ    0x05
PORTB    equ    0x06

PDel0    equ    0x10
PDel1    equ    0x11
COUNT    equ    0x12


         org    0x00
         goto   inicio

         org    0x04
         goto   rsi

         org    0x05

inicio:  bsf    STATUS,RP0
         movlw  0xFC
         movwf  PORTA
         movlw  0x00
         movwf  PORTB
         bcf    STATUS,RP0

         clrf   PORTA
         clrf   PORTB

         call   init

main:    clrf   COUNT

         movlw  0x01
         movwf  PORTB
         call   en_com

mLoop:   movf   COUNT,0
         addlw  0x30
         movwf  PORTB
         call   en_dat

         movlw  .250
         call   delay

         incf   COUNT,1
         movlw  0x0A
         xorwf  COUNT,0
         btfss  STATUS,2
         goto   mLoop

         goto   main



init:    movlw  .20
         call   delay

         movlw  0x38
         movwf  PORTB
         call   en_com

         movlw  0x0C
         movwf  PORTB
         call   en_com

         movlw  0x06
         movwf  PORTB
         call   en_com

         return


en_com:  bcf    PORTA,1

         bsf    PORTA,0
         nop
         bcf    PORTA,0

         movlw  .2
         call   delay

         return


en_dat:  bsf    PORTA,1

         bsf    PORTA,0
         nop
         bcf    PORTA,0

         call   T050us

         return


T050us:  movlw  .15
         movwf  PDel0

DLoop3:  decfsz PDel0,1
         goto   DLoop3

         return


T200us:  movlw  .65
         movwf  PDel0

DLoop2:  decfsz PDel0,1
         goto   DLoop2

         return


delay:   movwf  PDel1
         nop
DLoop0:  movlw  .249
         movwf  PDel0

DLoop1:  nop
         decfsz PDel0,1
         goto   DLoop1

         decfsz PDel1,1
         goto   DLoop0

         return


rsi:     retfie


         end

saludos...
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: agauss en 18 de Marzo de 2011, 21:54:01
Y ahora esta es la version para un BUS de 4 bits:

Código: [Seleccionar]
;**************************************************************
;*                                                            *
;*         Ensamblador para microcontroladores MPASM          *
;*                                                            *
;* NOMBRE  : pic4lcd.asm                                      *
;* OBJETIVO: Contador 0-9 con salida a LCD configurada  a  un *
;*           bus de 8 lineas, controladas por la  parte  alta *
;*           del puerto B. Las lineas  EN y RS estan sobre el *
;*           puerto A en los bits 0 y 1 respectivamente.      *
;*                                                            *
;* AUTOR   :                 antonio gauss                    *
;* EMAIL   :            agauss@todopic.zzn.com                *
;*                                                            *
;**************************************************************


         title "PIC16F84A, pic4lcd.asm"
         list p=16f84a, f=inhx8m
         #include <p16f84a.inc>
         __config _XT_OSC & _WDT_OFF & _CP_OFF & _PWRTE_ON


STATUS   equ    0x03
PORTA    equ    0x05
PORTB    equ    0x06

PDel0    equ    0x10
PDel1    equ    0x11
COUNT    equ    0x12


         org    0x00
         goto   inicio

         org    0x04
         goto   rsi

         org    0x05

inicio:  bsf    STATUS,RP0
         movlw  0xFC
         movwf  PORTA
         movlw  0x0F
         movwf  PORTB
         bcf    STATUS,RP0

         clrf   PORTA
         clrf   PORTB

         call   init
         call   conf

main:    clrf   COUNT

         movlw  0x00
         movwf  PORTB
         call   en_com

         movlw  0x10
         movwf  PORTB
         call   en_com

mLoop:   movf   COUNT,0
         addlw  0x30
         movwf  DATO

         movwf  PORTB
         call   en_dat

         bcf    STATUS,0
         rlf    DATO,1
         rlf    DATO,1
         rlf    DATO,1
         rlf    DATO,1

         movf   DATO,0
         movwf  PORTB
         call   en_dat

         movlw  .250
         call   delay
 
         incf   COUNT,1
         movlw  0x0A
         xorwf  COUNT,0
         btfss  STATUS,2
         goto   mLoop

         goto   main



init:    movlw  .20
         call   delay

         movlw  0x30
         movwf  PORTB
         call   en_com

         movlw  .5
         call   delay

         movlw  0x30
         movwf  PORTB
         call   en_com

         call   T200us

         movlw  0x30
         movwf  PORTB
         call   en_com

         movlw  0x20
         movwf  PORTB
         call   en_com

         return


conf:    movlw  0x20
         movwf  PORTB
         call   en_com

         movlw  0x00
         movwf  PORTB
         call   en_com

         movlw  0x00
         movwf  PORTB
         call   en_com

         movlw  0xC0
         movwf  PORTB
         call   en_com

         movlw  0x00
         movwf  PORTB
         call   en_com

         movlw  0x60
         movwf  PORTB
         call   en_com

         return


en_com:  bcf    PORTA,1

         bsf    PORTA,0
         nop
         bcf    PORTA,0

         movlw  .2
         call   delay

         return


en_dat:  bsf    PORTA,1

         bsf    PORTA,0
         nop
         bcf    PORTA,0

         call   T050us

         return


T050us:  movlw  .15
         movwf  PDel0

DLoop3:  decfsz PDel0,1
         goto   DLoop3

         return


T200us:  movlw  .65
         movwf  PDel0

DLoop2:  decfsz PDel0,1
         goto   DLoop2

         return


delay:   movwf  PDel1
         nop
DLoop0:  movlw  .249
         movwf  PDel0

DLoop1:  nop
         decfsz PDel0,1
         goto   DLoop1

         decfsz PDel1,1
         goto   DLoop0

         return


rsi:     retfie


         end

Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: agauss en 18 de Marzo de 2011, 21:56:54
Como aun no domino muy bien esto de la imagenes, entonces mejor les pongo en un afjunto el codigo y los archivos en PROTEUS. Uso la version 7.4 de PROTEUS ISIS. Espero le sea de utilidad a alguien.

saludos...
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: agauss en 19 de Marzo de 2011, 01:39:11
Por cierto me llama la atencion el comentario de nocturno acerca de la configuracion de los pines que no se usan. Tenia entendido que una manera segura de mantener los pines que no se habran de utilizar era configurandolos como entradas, si estoy en un error me gustaria saber la razon???
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Nocturno en 19 de Marzo de 2011, 02:30:29
Si los configuras como entradas correrás el riesgo de que actúen como antenas y reciban señales electromagnéticas que puedan afectar al funcionamiento del PIC.
Si los configuras como salidas, esto no ocurrirá.
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: agauss en 19 de Marzo de 2011, 03:05:45
Ok, enterado maestro, definitivamente todos los dias se aprende algo nuevo, gracias...
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: agauss en 19 de Marzo de 2011, 16:41:14
Les traigo un ejemplito de un PWM usando interrupciones (INT0) para incrementar/decrementar el ancho del pulso.

Código: [Seleccionar]
;**************************************************************
;*                                                            *
;*          Ensamblador para microcontroladores MPASM         *
;*                                                            *
;* NOMBRE  : PICpwm.asm                                       *
;* OBJETIVO: Modulador de ancho de pulso  PWM  utilizando  la *
;*           interrupcion externa del PIC16F84A. El modulador *
;*           cuenta con un par de entradas que se encargan de *
;*           el incremento y decremento del pulso.            *
;*                                                            *
;* AUTOR   : antonio gauss                                    *
;* EMAIL   : agauss@todopic.zzn.com                           *
;*                                                            *
;**************************************************************


         title "PIC16F84A, PICpwm.asm"
         list p=16f84a, f=inhx8m
         #include <p16f84a.inc>
         __config _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF


TMR0    equ    0x01
STATUS  equ    0x03
PORTB   equ    0x06
INTCON  equ    0x0B

STEMP   equ    0x10
WTEMP   equ    0x11
ACCA    equ    0x12
ACCC    equ    0x13
PDelT   equ    0x14


        org    0x00
        goto   inicio

        org    0x04
        goto   rsi

        org    0x05

inicio: bsf    STATUS,RP0
        movlw  0xF7
        movwf  PORTB
        bcf    TMR0,6
        bcf    STATUS,RP0

        movlw  0x90
        movwf  INTCON

        movlw  0x7F
        movwf  ACCA

main:   movf   ACCA,0
        movwf  ACCC

        bsf    PORTB,3
        call   delay

        movf   ACCA,0
        sublw  0xFF
        movwf  ACCC

        bcf    PORTB,3
        call   delay

        goto   main




delay:  movf   ACCC,0
        movwf  PDelT

DLoop:  nop

        decfsz PDelT,1
        goto   DLoop

        return


IncDut: incf   ACCA,1
        movlw  0xFF
        xorwf  ACCA,0
        btfss  STATUS,Z
        return

        movlw  0xFE
        movwf  ACCA

        return


DecDut: decf   ACCA,1
        btfss  STATUS,Z
        return

        movlw  0x01
        movwf  ACCA

        return


rsi:    btfss  INTCON,1
        retfie

        movwf  WTEMP
        swapf  STATUS,0
        movwf  STEMP

start:  btfss  PORTB,1
        call   IncDut

        btfss  PORTB,2
fin:    call   DecDut

        swapf  STEMP,0
        movwf  STATUS
        swapf  WTEMP,1
        swapf  WTEMP,0

        bsf    INTCON,4
        bcf    INTCON,1

        retfie


        end



Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: agauss en 19 de Marzo de 2011, 16:43:35
Como sigo batallando con las imagenes no pegue nada arriba, pero aqui les dejo el codigo fuente, el compilado y la simulacion en PROTEUS.

saludos...
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: hersheysdark en 23 de Julio de 2011, 17:36:01
pic16f84a y lcd 16x2
Buenas tardes, un favor; quisiera ver quien me puede ayudar con un proyecto.
Tengo que utilizar un pic 16f84a para desplegar un mensaje en movimiento, con un boton al MCLR del pic el mensaje se reinicia, "con un boton al RB0 del pic el mensaje debera moverse mas rapido" ya tengo casi todo lo unico que no puedo aun hacer es lo que esta entre comillas....
Anexo codigo en ensamblador.
Gracias
------------------------------------------------------------------------------------------
;
; El módulo LCD visualiza un mensaje largo (más de 16 caracteres) que se desplaza a lo largo
; de la pantalla. Se utiliza la subrutina LCD_MensajeMovimiento de la librería LCD_MENS.INC.
;
; ZONA DE DATOS ************************************************** ********************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>

CBLOCK 0x0C
R_ContAA
R_ContAB
STORW
STRST
ENDC



; ZONA DE CÓDIGOS ************************************************** ******************

ORG 0
goto Inicio
ORG 4
goto INT_EXT




Inicio

call LCD_Inicializa ; Prepara la pantalla.
bsf STATUS,RP0
BSF PORTB,0
BCF OPTION_REG,NOT_RBPU
BCF OPTION_REG,INTEDG
bcf STATUS,RP0
clrf R_ContAB
Principal
movlw Mensaje0 ; Apunta al mensaje.
call LCD_MensajeMovimiento
goto Principal ; Repite la visualización.
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
addwf PCL,F
Mensaje0 ; Posición inicial del mensaje.
DT " " ; Espacios en blanco al principio para mejor
DT "Proyecto Final" ; visualización.
DT " Diseño Logico",
DT " ", 0x0 ; Espacios en blanco al final.
;
INCLUDE <LCD_MENS.INC> ; Subrutina LCD_MensajeMovimiento.
INCLUDE <LCD_4BIT.INC> ; Subrutinas de control del LCD.
INCLUDE <RETARDOS.INC> ; Subrutinas de retardos.




;================================================= ==================

; Rutina de interrupcion

; Se procede a dar servicio a la interrupcion.

; Esta corresponde a una interrupcion periferica. No se usa.

;================================================= ==================
INT_EXT

MOVWF STORW ; Respaldar el acumulador, W, en la localidad de memoria STORW.
MOVF STATUS, W ; El contenido de STATUS register se almacena en el acumulador.
MOVWF STRST ; Respaldar el STATUS register en la localidad de memoria STRST.
; Se incluye el banco en uso antes de la interrupcion.
incf R_ContAB, F ; paso 1 1 ciclo

banco0 ; Direcciona el Banco 0.
MOVF STRST, W ; Se almacena en el acumulador el registro STRST.
MOVWF STATUS ; Se restaura el STATUS register.
SWAPF STORW, F ; Se almacena en el acumulador el registro STRST.
SWAPF STORW, W ; Se almacena en el acumulador el registro STRST.
RETFIE ; Terminal la rutina de interrupcion, regresa al programa principal.

END ; Fin del programa.
------------------------------------------------------------------------------------------

; ================================================== =================
;
; Librería de subrutinas para el manejo de mensajes a visualizar en un visualizador LCD.

CBLOCK
LCD_ApuntaCaracter ; Indica la posición del carácter a visualizar
; respecto del comienzo de todos los mensajes,
; (posición de la etiqueta "Mensajes").
LCD_ValorCaracter ; Código ASCII del carácter a
ENDC ; visualizar.

; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones de la
; memoria de programa, es decir, no pueden superar la dirección 0FFh.

; Subrutina "LCD_Mensaje" ---------------------------------------------------------------
;
; Visualiza por pantalla el mensaje apuntado por el registro W.
;
; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta "Mensajes" y que
; tenga la siguiente estructura:
;
; Mensajes ; ¡Etiqueta obligatoria!
; addwf PCL,F
; Mensaje0 ; Posición inicial del mensaje.
; DT ".. ..", 0x00 ; Mensaje terminado en 0x00.
; Mensaje1
; ...
; ...
; FinMensajes
;
; La llamada a esta subrutina se realizará siguiendo este ejemplo:
;
; movlw Mensaje0 ; Carga la posición del mensaje.
; call LCD_Mensaje ; Visualiza el mensaje.
;
LCD_Mensaje
movwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje.
movlw Mensajes ; Halla la posición relativa del primer carácter
subwf LCD_ApuntaCaracter,F ; del mensaje respecto de etiqueta "Mensajes".
decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F".
LCD_VisualizaOtroCaracter
movf LCD_ApuntaCaracter,W
call Mensajes ; Obtiene el código ASCII del carácter apuntado.
movwf LCD_ValorCaracter ; Guarda el valor de carácter.
movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
btfsc STATUS,Z ; que sea "0x00", que es código indicador final
goto LCD_FinMensaje ; de mensaje, sale fuera.
LCD_NoUltimoCaracter
call LCD_Caracter ; Visualiza el carácter ASCII leído.
incf LCD_ApuntaCaracter,F ; Apunta a la posición del siguiente carácter
goto LCD_VisualizaOtroCaracter ; dentro del mensaje.
LCD_FinMensaje
return ; Vuelve al programa principal.

; Subrutina "LCD_MensajeMovimiento" -----------------------------------------------------
;
; Visualiza*un mensaje de mayor longitud que los 16 caracteres que pueden representarse
; en una línea, por tanto se desplaza a través de la pantalla.
;
; En el mensaje debe dejarse 16 espacios en blanco, al principio y al final para
; conseguir que el desplazamiento del mensaje sea lo más legible posible.
;
CBLOCK
LCD_CursorPosicion ; Contabiliza la posición del cursor dentro de la
ENDC ; pantalla LCD
LCD_MensajeMovimiento
movwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje.
movlw Mensajes ; Halla la posición relativa del primer carácter
subwf LCD_ApuntaCaracter,F ; del mensaje respecto de la etiqueta "Mensajes".
decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F".
LCD_PrimeraPosicion
clrf LCD_CursorPosicion ; El cursor en la posición 0 de la línea.
call LCD_Borra ; Se sitúa en la primera posición de la línea 1 y
LCD_VisualizaCaracter ; borra la pantalla.
movlw LCD_CaracteresPorLinea ; ¿Ha llegado a final de línea?
subwf LCD_CursorPosicion,W
btfss STATUS,Z
goto LCD_NoEsFinalLinea
LCD_EsFinalLinea
call Retardo_200ms ; Lo mantiene visualizado durante este tiempo.
call Retardo_200ms
call retardo_externo
movlw LCD_CaracteresPorLinea-1; Apunta a la posición del segundo carácter visualizado
subwf LCD_ApuntaCaracter,F ; en pantalla, que será el primero en la siguiente
goto LCD_PrimeraPosicion ; visualización de línea, para producir el efecto
LCD_NoEsFinalLinea ; de desplazamiento hacia la izquierda.
movf LCD_ApuntaCaracter,W
call Mensajes ; Obtiene el ASCII del carácter apuntado.
movwf LCD_ValorCaracter ; Guarda el valor de carácter.
movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
btfsc STATUS,Z ; que sea "0x00", que es código indicador final
goto LCD_FinMovimiento ; de mensaje, sale fuera.
LCD_NoUltimoCaracter2
call LCD_Caracter ; Visualiza el carácter ASCII leído.
incf LCD_CursorPosicion,F ; Contabiliza el incremento de posición del
; cursor en la pantalla.
incf LCD_ApuntaCaracter,F ; Apunta a la siguiente posición por visualizar.
goto LCD_VisualizaCaracter ; Vuelve a visualizar el siguiente carácter
LCD_FinMovimiento ; de la línea.
return ; Vuelve al programa principal.

retardo_externo
MOVf R_ContAB,W
MOVWF R_ContAA ; +2 1 ciclo
loop
nop
DECFSZ R_ContAA, F ; paso 1 1 ciclo
GOTO loop ; paso 2 2 ciclos
return

; ================================================== =================
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: falflores en 31 de Octubre de 2011, 22:26:03
Hola hersheysdark, lamentablemente yo no te puedo ayudar, ya que apenas estoy aprendiendo ensamblador, pero si te puedo aconsejar que abras un nuevo tema para que expongas tu problema, así lo pueden revisar más personas, y de paso este hilo queda solamente para las clases de ensamblador.

Estimados agauss y Vegepic:

Les agradezco mucho el tiempo que han invertido en subir sus códigos y compartirlos con nosotros, he realizado casi todos los ejercicios que puso el amigo Veguepic y gracias a estos ya comprendo mejor el funcionamiento del PC y de otras cosas que desconocia. Tambien muy agracecido con el amigo agauss por compartir sus simulaciones en proteus, que funcionan de 10!

Estaré esperando aprender más con ustedes en el futuro, un abrazo desde México.
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: samulinkinpark en 13 de Diciembre de 2013, 14:50:39
Buenas tengo este ejercicio que me han mandado en clase y no se sinceramente como hacerlo. Estamos usando instrucciones basicas de pic, asi que me gustaria saber si alguien me lo podria resolver o ayudarme al menos y dejarmelo en plan basico.

Les dejo aqui el enunciado del problema:

Con los conmutadores de entrada RA2, RA1 y RA0 introduciremos un número binario.Se activarán un número de LEDs igual al número introducido en estas entradas. Por ejemplo, si el número en las entradas es ‘111’ (siete en binario), activaremos 7 LEDs, si el número en las entradas es ‘010’ (dos), activaremos dos LEDs. Comenzaremos siempre por el LED RB0. Para hacer el ejercicio, usaremos la instrucción ‘RLF’. :(  :(  :(

Yo lo he empezado asi pero no se continuar:

;===========================================================================================

   LIST P=16F84A
    INCLUDE <P16F84A.INC>                                      ; En este fichero se definen las etiquetas del PIC.
   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC       ; Configuración para el grabador.      

;----------------------------------------------------------------------------------------------------------------
; Preparar el hadrware

InicHw
                                                              ; preparar hardware
    bsf STATUS,RP0                                            ; Me paso al banco 1 para limpiar el registro TRIS B
    movlw b'00000000'                                 ; Ponemos en working inicialmente el estado 0;
   clrf  TRISB                                        ; Limpiamos el registro TRISB poniendolo a cero y asi configurando todas sus patas como salidas

    bcf STATUS,RP0                                              ; Volver al banco 0
   
   



;---------------------------------------------------------------------------------------------------------------
; Ahora procedemos con lo que nos pide el ejercicio
 empezamos
   
   bsf STATUS,C
   movlw b'00000111'                                          
     andwf PORTA,W
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: elreypic2 en 13 de Diciembre de 2013, 15:16:28
Que tal samulinkinpark,

Aqui en el foro no se resuelve la tarea de la clase (al menos no gratis, yo puedo hacer tu codigo en assembler pero te costaría $150 USD pagables via paypal). Aqui en el foro ayudamos con algo que ya tengas hecho, pero no  a resolver tu tarea. Si te interesa que lo haga puedes realizar tu pago via paypal, enviandome primero un e-mail de confirmación que te interesa.

Saludos,

Elreypic.
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: tapi8 en 13 de Diciembre de 2013, 15:26:16
samulinkinpark bienvenido al foro.

Abre un hilo nuevo con tu pregunta.

Busca un poco por el foro y encontraras lo que quieres hacer, que ademas es muy simple.

Pon un poco de interes en hacer el codigo, aunque sea mal y te echaremos una mano, pero como dice elreypic2 aqui no hacemos los trabajos de clase, aqui se vienen a aprender, no es el rincon del vago, ademas posiblemente tu profesor ande por aqui y te este controlando.

Espero que no te lo tomes a mal, pero la filosofia de este foro es "no le des un pez, enseñale a pescar"
Título: Ejemplos en Asembler PIC16F84A
Publicado por: gnivre en 16 de Diciembre de 2013, 01:32:03
buenas noches a todos, soy prácticamente nuevo y estoy aqui para solicitar les su ayuda con un trabajo de la escuela...... tengo un problema con un codigo de una matris de 7x45 pasa mensajes que consegui googleando, el detalle es que al emularlo con proteus anda de maravilla pero ahora quiero cambiarle el mensaje pero cuando quiero editar el codigo y trato de compilar el mplab me dice BUILD FAILED y de ahi no puedo pasar......este el el codigo....ocupo que el mensaje sea BIENVENIDOS A LA BIBLIOTECA  DEL INSTITUTO TECNOLOGUICO.

Start     ORG 0x00             ;This sets up the ports 
          BSF    03,5
          MOVLW 00h
          MOVWF 05h
          MOVWF 06h
          BCF    03,5
          ;org   04h         
          GOTO    Run1

              ;Table1  holds the hex values for each column of LEDs


Table1       ADDWF    02h,1            ;Add W to Program Counter

      RETLW    .00  ;                     
                RETLW    7fh  ;
                RETLW    49h ;
                RETLW    49h  ;          ;B
                retlw   49h
                retlw   36h

      RETLW    .00  ;
                RETLW    .65  ;
                RETLW    .127  ;   
                RETLW    .65  ;            ;I
                ;RETLW   .64  ;
                ;RETLW    .63  ;

      retlw   .00
      retlw   7fh
      retlw   49h            ;E
      retlw   49h
      retlw   41h

      retlw   .00
      retlw   7fh
      retlw   04h
      retlw   08h            ;N
      retlw   10h
      retlw   7fh

      

      retlw   .00
      retlw   .31
      retlw   .32          ;V
      retlw   .64
      retlw   .32
      retlw   .31

      retlw   .00
      retlw   7fh
      retlw   49h            ;E
      retlw   49h
      retlw   41h

      retlw   .00
      retlw   7fh
      retlw   04h
      retlw   08h            ;N
      retlw   10h
      retlw   7fh

      RETLW    .00   
                RETLW    .65 
                RETLW    .127     
                RETLW    .65              ;I

      retlw   .00
      retlw   .127
      retlw   .65
      retlw   .65              ;D
      retlw   .65
      retlw   .62

      retlw   .00
      retlw   3eh
      retlw   41h
      retlw   41h                ;O
      retlw   41h
      retlw   3eh

                RETLW    .00 
                RETLW    26h
                RETLW    49h   
               RETLW    49h               ;S
                RETLW    49h   
                RETLW    32h
      
      retlw   .00
      retlw   .00

      retlw   .00
      retlw   7eh
      retlw   09h
      retlw   09h             ;A
      retlw   09h
      retlw   7eh

      retlw   .00
      retlw   .00

                retlw   .00
      retlw   .127
      retlw   .64            ;L
      retlw   .64
      retlw   .64
      retlw   .64
               
                retlw   .00
      retlw   7eh
      retlw   09h
      retlw   09h             ;A
      retlw   09h
      retlw   7eh

                retlw   .00
      retlw   .00
               
      RETLW    .00  ;                     
                RETLW    7fh  ;
                RETLW    49h ;
                RETLW    49h  ;          ;B
                retlw   49h
                retlw   36h

      RETLW    .00  ;
                RETLW    .65  ;
                RETLW    .127  ;   
                RETLW    .65  ;            ;I
                ;RETLW   .64  ;
                ;RETLW    .63  ;

                RETLW    .00  ;                     
                RETLW    7fh  ;
                RETLW    49h ;
                RETLW    49h  ;          ;B
                retlw   49h
                retlw   36h


                retlw   .00
      retlw   .127
      retlw   .64            ;L
      retlw   .64
      retlw   .64
      retlw   .64


      RETLW    .00  ;
                RETLW    .65  ;
                RETLW    .127  ;   
                RETLW    .65  ;            ;I
                ;RETLW   .64  ;
                ;RETLW    .63  ;

                retlw   .00
      retlw   3eh
      retlw   41h
      retlw   41h                ;O
      retlw   41h
      retlw   3eh


                retlw .00
                retlw 49h
                retlw 43h
                retlw 43h            ;T
                retlw 43h
                retlw 43h

                 
                retlw   .00
      retlw   7fh
      retlw   49h            ;E
      retlw   49h
      retlw   41h   

                retlw   .00
                retlw   3eh
      retlw   41h
      retlw   41h           ;C
      retlw   41h
      retlw   22h

                retlw   .00
      retlw   7eh
      retlw   09h
      retlw   09h             ;A
      retlw   09h
      retlw   7eh



                retlw   .00
      retlw   .00
                retlw   .00
      retlw   .00
                retlw   .00
      retlw   .00
                retlw   .00
      retlw   .00
                retlw   .00
      retlw   .00
                retlw   .00
      retlw   .00
                retlw   .00
      retlw   .00
                retlw   .00
      retlw   .00


                retlw   .00
                retlw   3eh
      retlw   41h
      retlw   41h           ;C
      retlw   41h
      retlw   22h

                retlw   .00
      retlw   3eh
      retlw   41h
      retlw   41h                ;O
      retlw   41h
      retlw   3eh

                retlw   .00
      retlw   7fh
      retlw   04h
      retlw   08h            ;N
      retlw   10h
      retlw   7fh

                RETLW    .00 
                RETLW    26h
                RETLW    49h   
               RETLW    49h               ;S
                RETLW    49h   
                RETLW    32h

                RETLW    .00  ;  "E"
                RETLW    3fh ;0000000
                RETLW    40h  ;0  0  0
                RETLW    40h  ;0  0  0         ;U
                RETLW    40h
                retlw   3fh  ;0     0

                retlw   .00
      retlw   .127
      retlw   .64            ;L
      retlw   .64
      retlw   .64
      retlw   .64

               
                retlw .00
                retlw 49h
                retlw 43h
                retlw 43h            ;T
                retlw 43h
                retlw 43h

               
                retlw   .00
      retlw   7eh
      retlw   09h
      retlw   09h             ;A
      retlw   09h
      retlw   7eh

               
      retlw   .00
      retlw   .00

                retlw   .00
      retlw   .127
      retlw   .65
      retlw   .65              ;D
      retlw   .65
      retlw   .62

                retlw   .00
      retlw   7fh
      retlw   49h            ;E
      retlw   49h
      retlw   41h

                retlw   .00
      retlw   .00 

                retlw   .00
      retlw   .127
      retlw   .64            ;L
      retlw   .64
      retlw   .64

                RETLW    .00  ;
                RETLW    .65  ;
                RETLW    .127  ;   
                RETLW    .65  ;            ;I
                ;RETLW   .64  ;
                ;RETLW    .63  ;

                RETLW    .00  ;                     
                RETLW    7fh  ;
                RETLW    49h ;
                RETLW    49h  ;          ;B
                retlw   49h
                retlw   36h

                retlw   .00
      retlw   .127
      retlw   .17          ;R
      retlw   .17
      retlw   .17
      retlw   .110

                retlw   .00
      retlw   3eh
      retlw   41h
      retlw   41h                ;O
      retlw   41h
      retlw   3eh

                RETLW    .00 
                RETLW    26h
                RETLW    49h   
               RETLW    49h               ;S
                RETLW    49h   
                RETLW    32h








         
               

      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h
      retlw      00h






   
      retlw   .255




Run1            CLRF 11h           ;Clear the Ghost locations ready for starting
                CLRF 12h
                CLRF 13h
                CLRF 14h
                CLRF 15h
      clrf 26h
      clrf 27h
      clrf 28h
      clrf 29h

      clrf 2Ah
      CLRF 2Bh           ;Clear the Ghost locations ready for starting
                CLRF 2Ch
                CLRF 2Dh
                CLRF 2Eh
                CLRF 2Fh
      clrf 30h
      clrf 31h
      clrf 32h

      clrf 33h
      clrf 34h
                CLRF 35h           ;Clear the Ghost locations ready for starting
                CLRF 36h
                CLRF 37h
                CLRF 38h
                CLRF 39h
      clrf 3Ah
      clrf 3Bh

      clrf 3Ch
      clrf 3Dh
      clrf 3Eh        ;Clear the Ghost locations ready for starting
       
      MOVLW 00
                MOVWF 19h      ;File 19h is the jump value for table
run2            MOVLW 02h
                MOVWF 18h      ;File 18h counts the number of scans
                  CALL Shift         ; and controls the "run speed"
                  INCF 19h,1
                  MOVF 19h,0      ;Put jump value into W
             CALL Table1
             MOVWF 3Eh      ;W contains table data - put it in 15h
                  XORLW 0FFh     ;If table value is FF,
                  BTFSC 03,2        ; bit 2 of file 3 will be SET (=1)
                  GOTO Run1       ;Start Table1 again
Run3        DECFSZ 18h,1    ;Scan the display 40h times
                 GOTO Run4
                 GOTO Run2
Run4        CALL Scan
                 GOTO Run3

Scan           
      BSF 05,1               ;Reset 4017
                NOP
                BCF 05,1

      call DelD       ;
               MOVF 11h,0           ;Output the data at the 5 Ghost
               MOVWF 06h        ;1   ; locations to the display
               CALL DelD   ;
               MOVF 12h,0
               MOVWF 06h   ;2
               CALL DelD   ;
               MOVF 13h,0
               MOVWF 06h        ;3
               CALL DelD   ;
               MOVF 14h,0
               MOVWF 06h       ;4
               CALL DelD   ;
               MOVF 15h,0
               MOVWF 06h       ;5
               CALL DelD   ;
      MOVF 26h,0           ;Output the data at the 5 Ghost
               MOVWF 06h       ;6    ; locations to the display
               CALL DelD   ;
               MOVF 27h,0
               MOVWF 06h        ;7   
               CALL DelD   ;
               MOVF 28h,0
               MOVWF 06h       ;8
               CALL DelD   ;
                MOVF 29h,0
               MOVWF 06h       ;9
               CALL DelD-0
               
               ;
      
               
      BSF 05,1               ;Reset 4017
                NOP
                BCF 05,1

                call DelD_2
                MOVF 2Ah,0
               MOVWF 06h
               CALL DelD_2   ; 1
                movf 2Bh,0
      movwf 06h
      call DelD_2     ; 2
      movf 2Ch,0
      movwf 06h
      call DelD_2     ; 3
                movf 2Dh,0
      movwf 06h
      call DelD_2     ; 4
      movf 2Eh,0
      movwf 06h
      call DelD_2     ; 5
                movf 2Fh,0
      movwf 06h
      call DelD_2     ; 6
      movf 30h,0
      movwf 06h
      call DelD_2     ; 7
                movf 31h,0
      movwf 06h
      call DelD_2     ; 8
                movf 32h,0
      movwf 06h
      call DelD_2     ; 9

                     
                BSF 05,1               ;Reset 4017
                NOP
                BCF 05,1

                call DelD_3      ;
                movf 33h,0
                movwf 06h
      call DelD_3    ; 1
      movf 34h,0
      movwf 06h
      call DelD_3     ; 2
                movf 35h,0
      movwf 06h
      call DelD_3    ; 3
      movf 36h,0
      movwf 06h
      call DelD_3     ; 4
                movf 37h,0
      movwf 06h
      call DelD_3    ; 5
      movf 38h,0
      movwf 06h
      call DelD_3     ; 6
                movf 39h,0
      movwf 06h
      call DelD_3    ; 7
      movf 3Ah,0
      movwf 06h
      call DelD_3     ; 8
                movf 3Bh,0
      movwf 06h
      call DelD_3     ; 9

                BSF 05,1               ;Reset 4017
                NOP
                BCF 05,1

                call DelD_4      ;
                movf 3Ch,0
                movwf 06h
      call DelD_4    ; 1
      movf 3Dh,0
      movwf 06h
      call DelD_4     ; 2
                movf 3Eh,0
      movwf 06h
      call DelD_4    ; 3



                RETURN
 
       ;SHIFT moves the data one place to the left to give the "movement"
       ;  effect on the screen

Shift          MOVF 12h,0         ;Move file 12h to W
               MOVWF 11h         ;Move W to file 11h
               MOVF 13h,0         ;Move file 13h to W
               MOVWF 12h         ;Move W to file 12h
               MOVF 14h,0         ;Move file 14h to W
               MOVWF 13h         ;Move W to file 13h
               MOVF 15h,0         ;Move file 15h to W
               MOVWF 14h         ;Move W to file 14h
      movf 26h,0
      movwf 15h
      movf 27h,0
      movwf 26h
      movf 28h,0
      movwf 27h
      movf 29h,0
      movwf 28h
      movf 2Ah,0
                movwf 29h

      movf 2Bh,0
      movwf 2Ah
                MOVF 2Ch,0         ;Move file 12h to W
               MOVWF 2Bh         ;Move W to file 11h
               MOVF 2Dh,0         ;Move file 13h to W
               MOVWF 2Ch         ;Move W to file 12h
               MOVF 2Eh,0         ;Move file 14h to W
               MOVWF 2Dh         ;Move W to file 13h
               MOVF 2Fh,0         ;Move file 15h to W
               MOVWF 2Eh         ;Move W to file 14h
      movf 30h,0
      movwf 2Fh
      movf 31h,0
      movwf 30h
      movf 32h,0
      movwf 31h
           movf 33h,0
      movwf 32h

      movf 34h,0
      movwf 33h
                MOVF 35h,0         ;Move file 12h to W
               MOVWF 34h         ;Move W to file 11h
               MOVF 36h,0         ;Move file 13h to W
               MOVWF 35h         ;Move W to file 12h
               MOVF 37h,0         ;Move file 14h to W
               MOVWF 36h         ;Move W to file 13h
               MOVF 38h,0         ;Move file 15h to W
               MOVWF 37h         ;Move W to file 14h
      movf 39h,0
      movwf 38h
      movf 3Ah,0
      movwf 39h
      movf 3Bh,0
      movwf 3Ah
      movf 3Ch,0
      movwf 3Bh

      movf 3Dh,0
      movwf 3Ch
                movf 3Eh,0
      movwf 3Dh
                RETURN

   
   
DelD       movlw .128
           movwf 1Bh
DelD1      DECFSZ 1Bh,1      ;Delay for viewing the
           GOTO DelD1            ; column of LEDs
           
           clrf 06h
clk        bsf 05,0
           nop                       ; the next output
           BCF 05,0
      return

      
DelD_2     movlw .128
           movwf 1Bh
DelD2      DECFSZ 1Bh,1      ;Delay for viewing the
           GOTO DelD2            ; column of LEDs
           
           clrf 06h
clk2       bsf 05,2
           nop                       ; the next output
           BCF 05,2
           return


DelD_3     movlw .128
           movwf 1Bh     
DelD3      DECFSZ 1Bh,1      ;Delay for viewing the
           GOTO DelD3            ; column of LEDs
           
           clrf 06h
clk3       bsf 05,3
           nop                       ; the next output
           BCF 05,3
           RETURN

DelD_4     movlw .128
           movwf 1Bh
DelD4      DECFSZ 1Bh,1      ;Delay for viewing the
           GOTO DelD4            ; column of LEDs
           
           clrf 06h
clk4       bsf 06,7
           nop                       ; the next output
           BCF 06,7
           RETURN


           
           END
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: BrunoF en 16 de Diciembre de 2013, 10:03:42
Hola.

Bienvenido al foro. Deberías decirnos al menos qué error te da, aunque si ese es todo el código, de entrada te falta la declaración del micro y los fuses, mínimamente.

Por otro lado, Tabla1 es demasiada larga y excede el tamaño de paginación de la ROM de ese uC. Te recomiendo que primero logres compilar el código original sin modificar el mensaje. Una vez que logres compilar eso, podés intentar hacerle cambios personalizados.

Saludos.
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: gnivre en 16 de Diciembre de 2013, 11:16:23
pues ese es el codigo original  :( y en el proteus usa el 16f84a  :( ....... el error es el sig.
pende en utilizar un 16f887 pero necesito que diga otro mensaje ayuda porfavor :) :mrgreen:

Código: [Seleccionar]

----------------------------------------------------------------------
Debug build of project `C:\Nueva carpeta\listo.mcp' started.
Language tool versions: MPASMWIN.exe v5.37, mplink.exe v4.37, mplib.exe v4.37
Preprocessor symbol `__DEBUG' is defined.
Sun Dec 15 22:27:31 2013
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p18F452 "listo.asm" /l"listo.lst" /e"listo.err" /o"listo.o" /d__DEBUG=1
Message[301] C:\PROGRAM FILES\MICROCHIP\MPASM SUITE\P16F887.INC 33 : MESSAGE: (Processor-header file mismatch.  Verify selected processor.)
Error[113]   C:\NUEVA CARPETA\LISTO.ASM 435 : Symbol not previously defined (Run2)
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `C:\Nueva carpeta\listo.mcp' failed.
Language tool versions: MPASMWIN.exe v5.37, mplink.exe v4.37, mplib.exe v4.37
Preprocessor symbol `__DEBUG' is defined.
Sun Dec 15 22:27:32 2013
----------------------------------------------------------------------
BUILD FAILED

Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: gnivre en 16 de Diciembre de 2013, 11:52:29
estos son los archivos originales que conseguí...... por favor si no es tanta la molestia y tienes un momento libre puedes darles un vistazo y ayudarme con mi trabajo final de la uni  :-/

https://mega.co.nz/#!eJdiGITS!NABTuGR5Aae8uWPFrJGn_FhFvX10nIk7p7gRPey8Pkg

   
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: tapi8 en 18 de Diciembre de 2013, 07:41:01
El unico error que te da es este:

Error[113]   C:\NUEVA CARPETA\LISTO.ASM 435 : Symbol not previously defined (Run2)

Si haces doble cilck sobre ese error te llevara a la linea de codigo donde esta, te dice que no has definido esa variable "Run2"

Aparte de esa tabla que como te dice BrunoF es muy larga, si lo estas migrando de un 16f84 a un 16f887, debes poner los puertos A y B como digitales:

BANKSEL  ANSEL
clrf   ANSEL      ; PORTA I/O digitales
clrf   ANSELH      ; PORTB I/O digitales
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: BrunoF en 18 de Diciembre de 2013, 13:50:02
El unico error que te da es este:

Error[113]   C:\NUEVA CARPETA\LISTO.ASM 435 : Symbol not previously defined (Run2)

Si haces doble cilck sobre ese error te llevara a la linea de codigo donde esta, te dice que no has definido esa variable "Run2"

Aparte de esa tabla que como te dice BrunoF es muy larga, si lo estas migrando de un 16f84 a un 16f887, debes poner los puertos A y B como digitales:

BANKSEL  ANSEL
clrf   ANSEL      ; PORTA I/O digitales
clrf   ANSELH      ; PORTB I/O digitales

No solo eso. Ese programa tiene un diseño fatal. Utiliza directamente las  posiciones de memoria, no utilizando  labels para referirse a ellas.
Está lleno de cosas como:

MOVF 12h,0         ;Move file 12h to W
               MOVWF 11h         ;Move W to file 11h
               MOVF 13h,0         ;Move file 13h to W
               MOVWF 12h         ;Move W to file 12h
               MOVF 14h,0         ;Move file 14h to W
               MOVWF 13h         ;Move W to file 13h
               MOVF 15h,0         ;Move file 15h to W
               MOVWF 14h         ;Move W to file 14h

Que apunta a direcciones no validas como GPR(general purpose RAM) en el 16F877 y hay que modificar todas a mano. Bastante tedioso y propenso a cometer errores.
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: tapi8 en 18 de Diciembre de 2013, 15:52:41
Si Bruno en eso ya me fije asi por encima, yo decia que era el unico error al compilar.

De hecho el programa ya ni me meti a analizarlo porque tiene que ser muy tedioso.

Le dije lo de definir los puertos como digitales para migrarlo de 16f84 al 16f887 porque es imprescindible.

Citar
MOVF 12h,0         ;Move file 12h to W
               MOVWF 11h         ;Move W to file 11h
               MOVF 13h,0         ;Move file 13h to W
               MOVWF 12h         ;Move W to file 12h
               MOVF 14h,0         ;Move file 14h to W
               MOVWF 13h         ;Move W to file 13h
               MOVF 15h,0         ;Move file 15h to W
               MOVWF 14h         ;Move W to file 14h

Que apunta a direcciones no validas como GPR(general purpose RAM) en el 16F877 y hay que modificar todas a mano. Bastante tedioso y propenso a cometer errores.

 En esto de las direcciones ni me habia fijado, pero tambien tambien tienes razon, estan hechas para el f84 y hay que cambiarlas todas.

Amigo gnivre te vale mas ponerte con paciencia y hacerte uno desde 0.
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: Aztaroth en 19 de Mayo de 2015, 04:31:55
pues a mi me gustaria tener las simulaciones en proteus del ejemplo 8 y 9 pero los enlaces están malos, o mas bien los archivos están corruptos o algo por el estilo, ya que los descargo pero no se abren con winrar ni winzip.

saludos.
es verdad estoy viendo la instruccion COMF y este ejemplo me sirvio, pero no pude ver su simulacion, como voy empezando es algo dificil quisiera saber si pudiste conseguir la simulacion en proteus, ojala puedan ayudarme Gracias.  :(
Título: Re: Ejemplos en Asembler PIC16F84A
Publicado por: KILLERJC en 19 de Mayo de 2015, 11:28:43
Ninguna instruccion tiene mucho secreto, la instruccion COMF simplemente nega el valor de un registro y luego lo almacena en W o en el mismo registro

Si supones que el registro se llama REG1

MOVLW 0x87 ; 1000 0111
MOVWF REG1 ; REG1 = 0x87
Podria hacer:
COMF  REG1,W   ;  W = 0x78 = 0111 1000
o
COMF  REG1,F    ; REG1 = 0x78 = 0111 1000
Título: Re: Ejemplos en Asembler
Publicado por: kenya Solorzano en 03 de Julio de 2015, 18:29:39
Aqui va el ejemplo 01:

Prender un led con un 16F84A por RB0, de lo mas sencillo


Código: ASM
  1. ;       02-06-06
  2. ;       Ejemplo 01
  3. ;       Prender un led
  4. ;       PIC 16f84a
  5. ;       MPLAB 7.30
  6. ;       PROTEUS 6.9 SP3
  7. ;       Veguepic
  8.  
  9.         LIST    P=16F84A,                               ; usar PIC 16F84A
  10.         #include <p16f84A.inc>
  11.  
  12.         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off
  13.                                                         ; power up timer        on
  14.                                                         ; watchdog              off
  15.                                                         ; osc                   XT
  16.  
  17.         ORG     0
  18.         BSF     STATUS,5                                ; activa la pagina 1
  19.         MOVLW   B'00000'                                ; carga 00000 en W
  20.         MOVWF   TRISA                                   ; puerto a todos salidas
  21.         MOVLW   B'00000000'                             ; carga 00000000 en W
  22.         MOVWF   TRISB                                   ; puerto b todos salidaS
  23.         BCF     STATUS,5                                ; volvemos a la pagina 0
  24.  
  25.         BCF     PORTB,0                                 ; ponemos a 0 RB0
  26.         BCF     PORTB,1                                 ; ponemos a 0 RB1
  27.         BCF     PORTB,2                                 ; ponemos a 0 RB2
  28.         BCF     PORTB,3                                 ; ponemos a 0 RB3
  29.         BCF     PORTB,4                                 ; ponemos a 0 RB4
  30.         BCF     PORTB,5                                 ; ponemos a 0 RB5
  31.         BCF     PORTB,6                                 ; ponemos a 0 RB6
  32.         BCF     PORTB,7                                 ; ponemos a 0 RB7
  33.  
  34.                                                         ; luego haremos todos juntos
  35.  
  36. INICIO                                                  ; etiqueta
  37.         BSF     PORTB,0                                 ; pone a 1 RB0
  38.         GOTO    INICIO                                  ; va a inicio
  39.  
  40.         END                                             ; fin de programa