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

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

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Ejemplos en Asembler PIC16F84A
« en: 02 de Junio de 2006, 20:55:01 »
« Última modificación: 20 de Septiembre de 2006, 22:21:18 por veguepic »
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #1 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
« Última modificación: 06 de Junio de 2006, 00:18:48 por veguepic »
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #2 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



Bueno hasta aqui por el dia de hoy.

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

Saludos desde Lima , Peru    -    Hugo

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #3 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

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

Saludos desde Lima , Peru    -    Hugo

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #4 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



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

Saludos desde Lima , Peru    -    Hugo

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #5 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
« Última modificación: 07 de Junio de 2006, 17:41:22 por veguepic »
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #6 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
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #7 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

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

Saludos desde Lima , Peru    -    Hugo

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplos en Asembler
« Respuesta #8 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

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

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #9 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
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplos en Asembler
« Respuesta #10 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

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

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

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #11 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.
« Última modificación: 15 de Junio de 2006, 21:55:10 por veguepic »
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Re: Ejemplos en Asembler
« Respuesta #12 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.   :-/ :-/

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Ejemplos en Asembler
« Respuesta #13 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
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado andyros

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 70
Re: Ejemplos en Asembler
« Respuesta #14 en: 17 de Junio de 2006, 19:20:07 »
OK.   :lol: :lol:


 

anything