TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
25 de Octubre de 2014, 17:37:15

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
350317 Mensajes en 39300 Temas por 41050 Usuarios
Último usuario: walterguri
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Almacén del Assembler (Moderadores: maunix, MGLSOFT, PAOLA09, Suky)
| | |-+  Ejemplos en Asembler PIC16F84A
0 Usuarios y 2 Visitantes están viendo este tema. « anterior próximo »
Páginas: [1] 2 3 4 Marcar como favorito Imprimir
Autor Tema: Ejemplos en Asembler PIC16F84A  (Leído 80135 veces)
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« : 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.  Shocked

Hoja tecnica 16F84A

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

MPLAB

PROTEUS



INDICE




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

Espero sus criticas, correcciones, sugerencias, etc  Smile
« Última modificación: 20 de Septiembre de 2006, 22:21:18 por veguepic » En línea

“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
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #1 : 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
GeSHi (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 » En línea

“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
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #2 : 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
GeSHi (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
« Última modificación: 06 de Junio de 2006, 00:19:49 por veguepic » En línea

“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
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #3 : 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
GeSHi (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.  

« Última modificación: 06 de Junio de 2006, 00:20:31 por veguepic » En línea

“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
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #4 : 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
GeSHi (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.  



« Última modificación: 06 de Junio de 2006, 00:21:27 por veguepic » En línea

“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
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #5 : 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
GeSHi (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. REPETIR
  34.  
  35. IZQ
  36. CALL DEMORA ; demora de 100ms
  37. RLF PORTB,1 ; rota el contenido de portb a la derecha
  38. BTFSS PORTB,7 ; hasta que prenda RB7, luego se salta
  39. GOTO IZQ ; una linea
  40.  
  41. DER
  42. CALL DEMORA ; demora de 100 ms
  43. RRF PORTB,1 ; rota el contenido de portb a la izquierda
  44. BTFSS PORTB,0 ; hasta que prenda RB0, luego salta
  45. GOTO DER ; una linea
  46.  
  47. GOTO REPETIR ; repite el ciclo
  48.  
  49. GOTO INICIO ; va a inicio
  50.  
  51. ;-------------------------------------------------------------
  52. ; La demora a sido generada con el programa PDEL
  53. ; Descripcion: Delay 100000 ciclos - 100 ms
  54. ;-------------------------------------------------------------
  55. DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)
  56.        movwf     PDel0     ; 1 |
  57. PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
  58.        movwf     PDel1     ; 1 |
  59. PLoop2  clrwdt              ; 1 clear watchdog
  60.        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. PDelL1  goto PDelL2         ; 2 ciclos delay
  66. PDelL2  goto PDelL3         ; 2 ciclos delay
  67. PDelL3  clrwdt              ; 1 ciclo delay
  68.        return              ; 2+2 Fin.
  69. ;-------------------------------------------------------------
  70.  
  71. END ; fin de programa
« Última modificación: 07 de Junio de 2006, 17:41:22 por veguepic » En línea

“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
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #6 : 07 de Junio de 2006, 00:09:16 »

Ejemplo 06:

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


Código
GeSHi (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. REPETIR
  46.  
  47. MOVLW SEC1 ; carga el valor de SEC1 en W
  48. MOVWF PORTB ; carga w en el puerto b
  49. CALL DEMORA ; demora de 100ms
  50.  
  51. MOVLW SEC2 ; carga el valor de SEC2 en W
  52. MOVWF PORTB ; carga w en el puerto b
  53. CALL DEMORA ; demora de 100ms
  54.  
  55. MOVLW SEC3 ; carga el valor de SEC3 en W
  56. MOVWF PORTB ; carga w en el puerto b
  57. CALL DEMORA ; demora de 100ms
  58.  
  59. MOVLW SEC4 ; carga el valor de SEC4 en W
  60. MOVWF PORTB ; carga w en el puerto b
  61. CALL DEMORA ; demora de 100ms
  62.  
  63. MOVLW SEC3 ; carga el valor de SEC3 en W
  64. MOVWF PORTB ; carga w en el puerto b
  65. CALL DEMORA ; demora de 100ms
  66.  
  67. MOVLW SEC2 ; carga el valor de SEC2 en W
  68. MOVWF PORTB ; carga w en el puerto b
  69. CALL DEMORA ; demora de 100ms
  70.  
  71. MOVLW SEC1 ; carga el valor de SEC1 en W
  72. MOVWF PORTB ; carga w en el puerto b
  73. CALL DEMORA ; demora de 100ms
  74.  
  75. GOTO INICIO ; va a inicio
  76.  
  77.  
  78. ;-------------------------------------------------------------
  79. ; La demora a sido generada con el programa PDEL
  80. ; Descripcion: Delay 100000 ciclos - 100 ms
  81. ;-------------------------------------------------------------
  82. DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)
  83.        movwf     PDel0     ; 1 |
  84. PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
  85.        movwf     PDel1     ; 1 |
  86. PLoop2  clrwdt              ; 1 clear watchdog
  87.        clrwdt              ; 1 ciclo delay
  88.        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
  89.        goto      PLoop2    ; 2 no, loop
  90.        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
  91.        goto      PLoop1    ; 2 no, loop
  92. PDelL1  goto PDelL2         ; 2 ciclos delay
  93. PDelL2  goto PDelL3         ; 2 ciclos delay
  94. PDelL3  clrwdt              ; 1 ciclo delay
  95.        return              ; 2+2 Fin.
  96. ;-------------------------------------------------------------
  97.  
  98. END ; fin de programa
En línea

“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
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #7 : 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
GeSHi (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

En línea

“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
BrunoF
Administrador
DsPIC30
*******
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 3798



« Respuesta #8 : 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
GeSHi (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.
En línea

"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.
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #9 : 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
En línea

“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
BrunoF
Administrador
DsPIC30
*******
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 3798



« Respuesta #10 : 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
GeSHi (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
GeSHi (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.
En línea

"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.
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #11 : 13 de Junio de 2006, 23:36:58 »

Hola BrunoF:

No hay problema, todo aporte, sugerencia, critica, correccion son bienvenidas.  Smile Smile

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 » En línea

“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
andyros
Colaborador
PIC12
*****
Desconectado Desconectado

Mensajes: 62



« Respuesta #12 : 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.   rebotando rebotando
En línea
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #13 : 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
En línea

“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
andyros
Colaborador
PIC12
*****
Desconectado Desconectado

Mensajes: 62



« Respuesta #14 : 17 de Junio de 2006, 19:20:07 »

OK.   Laughing Laughing
En línea
andyros
Colaborador
PIC12
*****
Desconectado Desconectado

Mensajes: 62



« Respuesta #15 : 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
GeSHi (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. INICIO                      
  45. bsf    PORTB,0                             ; pone a 1 RB0
  46. goto    INICIO                              ; va a inicio
  47.  
  48.  
  49.  
  50. END ; fin de programa
  51.  
  52.  
  53.  
  54.  
  55.  

venga un saludo.


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

Sexo: Masculino
Peru Peru

Mensajes: 2116



WWW
« Respuesta #16 : 24 de Junio de 2006, 21:59:26 »

Hola Andyros:

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

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

Saludos.

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

http://www.todopic.com.ar/foros/index.php?topic=12659.0
« Última modificación: 25 de Junio de 2006, 13:58:04 por veguepic » En línea

“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
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



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

http://www.mytempdir.com/1372797
« Última modificación: 16 de Julio de 2007, 23:39:03 por Veguepic » En línea

“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
Veguepic
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 2116



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


http://www.mytempdir.com/1372798
« Última modificación: 16 de Julio de 2007, 23:36:25 por Veguepic » En línea

“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
LabPIC
Colaborador
PIC16
*****
Desconectado Desconectado

Sexo: Masculino
Mexico Mexico

Mensajes: 143



« Respuesta #19 : 24 de Junio de 2006, 23:07:35 »

Felicidades y gracias vequepic por esforzarte en ayudar a los demas en esto del ensamblador Mr. Green, 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 Mr. Green.

Saludos LabPIC
« Última modificación: 24 de Junio de 2006, 23:11:40 por LabPIC » En línea

¡¡¡Viva México cabrones!!!
TODOPIC
   

 En línea
Páginas: [1] 2 3 4 Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.20 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.718 segundos con 23 consultas.