You are on page 1of 13

Guia Assembler PIC

BCF Registro, Bit


Bit Clear File
“Pone a Cero, el Bit correspondiente del Registro Especificado”

En particular, los bits de PortB tienen nombre y se pueden llamar como tal, en caso contrario, basta
con poner el número de bit o incluso la dirección del registro (ej: 0x06)

BSF Registro, Bit

Bit Set File


“Pone a Uno el Bit correspondiente del Registro especificado”

Hasta ahora, tenemos la instrucción básica que permite poner Ceros y Unos en los diferentes registros,
pero en algunos casos, puede ser necesario escribir todo un byte con una sola instrucción, como
veremos a continuación.

MOVLW Literal
“Pone el valor Literal en el Registro W”
Cuando se habla de Literal, se hace referencia a números, estos pueden
ser en los siguientes formatos:
Binario 0b’10000100′
Decimal 132
Hexadecimal 0x84
Independiente de la base numérica del literal, a nivel de bits, siempre
serán binarios.
Ejemplo:

MOLW No tiene un mayor efecto en la programación, pero es un paso provisorio cuando se quiere
poner un Byte completo en algún registro.

MOVWF Registro
“Deposita el contenido de W en el Registro especificado”
Se utiliza en conjunto con MOVLW para llenar registros con una sola
instrucción.
Ejemplo:

En este caso, el par de instrucciones, sirvió para configurar entradas y salidas, ya que se aplicó al
TRISB. (los pines RB0-RB1-RB2-RB3 quedaron como entradas, mientras que RB4-RB5-RB6-RB7
quedaron como salidas)

BTFSS Registro, Bit


Bit test file, skip if set
“Evalúa el Bit especificado del Registro correspondiente e ignora la siguiente línea de código si
esta a Uno“
Esta instrucción, puede ser usada para evaluar si se activa alguna
entrada.

Ejemplo:

Se evaluó el estado del tercer bit del registro PORTA, al ser este 1,
entonces se ignora la siguiente línea de código.
BTFSC Registro,Bit
Bit test file, skip if clear.

“Evalúa el Bit especificado del Registro correspondiente e ignora la siguiente línea de código si
esta a Cero“
Al contrario de lo que hace BTFSS, esta instrucción, evalúa los Ceros.
Ejemplo:

Sirva, para evaluar la desactivación de una entrada o salida.

GOTO label
Ir al Label
Una de las instrucciones poderosas del lenguaje assembler, pues permite que nuestro programa se
ejecute en diferentes partes del código o volver a repetir instrucciones hasta que se cumpla una
determinada condición.
Un Label, puede ser cualquier palabra escrita en el programa que no sea una instrucción en
Assembler, debe escribirse siempre con las misma Mayúsculas y Minúsculas.

Ejemplo:

En el código mostrado, mientras no se active el Bit RB1, el programa seguirá repitiendo la


instrucción BTFSS hasta que este se active y entonces encenderá el bit RB7.

Call y Return
Son instrucciones que permiten llamar Subrutinas; pequeñas porciones de código que una vez que
terminan de ejecutarse dejan la ejecución del programa justo en el lugar donde estaba antes de
llamarlas.
En la imagen, es posible ver como trabajan estas instrucciones, (Ese programa no necesariamente
funciona)

INICIO
BSF STATUS,RP0
CALL configuraIO
BSF STATUS,RP0

BSF PORTB,RB0
BSF PORTB,RB1

GOTO INICIO

configuraIO
MOVLW B’00000000’
MOVWF TRISB
RETURN

Se puede ver como el código va a la definición de la subrutina y luego vuelve al lugar en que estaba
para continuar con la ejecución de las demás instrucciones.

EQU
En general, sirve para declarar una equivalencia entre una palabra y una expresión. Habitualmente se
usa para poner nombre a algún registro de propósito general y no llamarlo por su dirección.

DECFSZ Registro,1
“Decrement file, skip if zero”
Resta 1 a un registro e ignora la siguiente línea de código si el resultado es cero.
Ejemplo:

numero EQU 0x27

Inicio
MOVLW 5
MOVWF numero

cuentaMenos
DECFSZ numero
GOTO cuentaMenos

BSF PORTA,0

GOTO Inicio

END

El programa no enciende el Bit 0 del Registro PORTA, si no hasta pasar 5 veces por el label
cuentaMenos, lo cual se debe a que se carga la cantidad 5 en el registro número.
11.- Estructura de un Código
Assembler y consejos varios.
Ahora que tenemos varias instrucciones para realizar operaciones a nivel de bit y registros, es
posible conseguir infinidad de funcionalidades, para comenzar un código no olvidar algunos de los
siguientes pasos y consejos, además de los mencionados en el tutorial de uso de MPLAB-X aqui
(h ps://pwmlabs.wordpress.com/2016/09/06/programacion-enassembler-con-mplab-x/).
1. Comenzar con ORG 0x00, esto hará que la ejecución del programa siempre comience en la
primera posición de memoria del PIC.
2. Declarar Entradas y Salidas; cambiar al banco 01, ir a los TRIS correspondientes a las
entradas o salidas que se quieran usar y poner los ceros y unos correspondientes, luego, regresar
al banco 00 para trabajar con los PORT.
3. Desactivar Interrupciones, para no tener problemas con el pin RB0.
4. Utilice siempre comentarios, permiten que tanto usted como cualquiera
que lea el código, pueda ponerse rápidamente en contexto y entender
su código. Los comentarios no afectan la ejecución del código.

Configuración de puertos

Los SFR o Registros de Funciones Especiales mas importantes para la configuración de los
puertos son :

Status
PORTX -siendo X = A, B, C o D
TRISX - Siendo X = A, B, C o D

Si se asigna un Cero (0) a un pin quedara como salida y si se asigna un Uno (1) entrada.

Ejemplo:
Movlw b`11110’
Movwf TRISA ; todos los pines serán entradas salvo RA0

Para trabajar con Tris debemos dirigirnos al banco donde este se encuentra, es decir poner
el valor correspondiente al bit RP0 del registro STATUS
Ejemplo:

Nota: todo lo que se escriba después de ; (punto y coma) será un comentario y sirve para
detallar o explicar el funcionamiento de cada línea de código

EJEMPLOS DE PROGRAMAS

Encender un led (lo que a ustedes les encanta )

1. LIST P=16F84A; usar PIC 16F84A


2. #include <p16f84A.inc>
3.
4. __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
5. ; power up timer on; watchdog off; osc XT
6.
7. ORG 00
8. BSF STATUS,5; activa Banco 1
9. MOVLW B'00000'; carga 00000 en W
10. MOVWF TRISA ; puerto a todos salidas
11. MOVLW B'00000000'; carga 00000000 en W
12. MOVWF TRISB ; puerto b todos salidaS
13. BCF STATUS,5 ; volvemos al Banco0
14.
15. BCF PORTB,0 ; ponemos a 0 RB0
16. BCF PORTB,1 ; ponemos a 0 RB1
17. BCF PORTB,2 ; ponemos a 0 RB2
18. BCF PORTB,3 ; ponemos a 0 RB3
19. BCF PORTB,4 ; ponemos a 0 RB4
20. BCF PORTB,5 ; ponemos a 0 RB5
21. BCF PORTB,6 ; ponemos a 0 RB6
22. BCF PORTB,7 ; ponemos a 0 RB7
23.
24. ; luego haremos todos juntos
25. INICIO ; etiqueta
26. BSF PORTB,0 ; pone a 1 RB0
27. GOTO INICIO ; va a inicio
28.
29. END ; fin de programa

Prender y apagar un led cada 1 seg. ( calculo de retardo y tiempo… OJO)


Cristal de 4 mhz

1. List P=16F84A
2. INCLUDE <P16F84A.INC>
3.
4. status equ 0x03
5. trisa equ 0x85
6. trisb equ 0x86
7. porta equ 0x05
8. portb equ 0x06
9. cont1 equ 0x0C
10. cont2 equ 0x0D
11. cont3 equ 0x0E
12.
13. reset org 0x00
14.
15. inicio org 0x05
16. bsf status,5
17. movlw 0x00
18. movwf trisb
19. bcf status,5
20. clrf portb
21.
22. led bsf portb,0
23. goto retardo
24.
25. retardo movlw d'4'
26. movwf cont3
27. movlw d'250'
28. movwf cont2
29. movlw d'250'
30. movwf cont1
31. nop
32. decfsz cont1
33. goto $-.2
34. decfsz cont2
35. goto $-.6
36. decfsz cont3
37. goto $-.10
38.
39. bcf portb,0
40. goto retardo2
41.
42. retardo2 movlw d'4'
43. movwf cont3
44. movlw d'250'
45. movwf cont2
46. movlw d'250'
47. movwf cont1
48. nop
49. decfsz cont1
50. goto $-.2
51. decfsz cont2
52. goto $-.6
53. decfsz cont3
54. goto $-.10
55. end
56.
Trabajando con entradas

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

1. LIST P=16F84A, ; usar PIC 16F84A


2. #include <p16f84A.inc>
3.
4. __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code
protec off
5. ; power up
timer on
6. ;
watchdog off
7. ;
osc XT
8.
9. VAR EQU 0x20 ; variable
10.
11. ORG 0
12. BSF STATUS,5 ; activa la pagina 1
13. MOVLW B'00000' ; carga 00000 en W
14. MOVWF TRISA ; puerto A todos salidas
15. MOVLW B'11111111' ; carga 11111111 en W
16. MOVWF TRISB ; puerto B todas entradas
17. BCF OPTION_REG,7 ; activa pull-up en puerto B
18. BCF STATUS,5 ; volvemos a la pagina 0
19.
20. CLRF PORTA ; ponemos a cero el puerto A
21.
22. INICIO ; etiqueta
23. CLRF VAR ; ponemos a cero VAR
24. BTFSC PORTB,0 ; si RB0 es 0 salta 1 línea
25. BSF VAR,0 ; pone 1 el bit 0 de VAR, encendido
26. BTFSC PORTB,1 ; si RB1 es 0 salta 1 línea
27. BSF VAR,1 ; pone 1 el bit 1 de vAR, encendido
28. BTFSC PORTB,2 ; si RB2 es 0 salta 1 línea
29. BSF VAR,2 ; pone 1 el bit 2 de VAR, encendido
30. BTFSC PORTB,3 ; si RB3 es 0 salta 1 línea
31. BSF VAR,3 ; pone 1 el bit 3 de VAR, encendido
32.
33. COMF VAR,0 ; complementa VAR y carga en W (*)
34. MOVWF PORTA ; carga W en PORTA
35.
36. GOTO INICIO ; salta a INICIO
37.
38. END ; fin de programa
39.
40. ; (*) Es necesario complementar el valor de var pues los leds están
conectados a tierra,
41. ; si estuvieran conectados a +5v no es necesario complementarlo.
EJERCICIOS

MODO DE RESOLUCION DE LOS EJERCICIOS


EJEMPLO

Ejercicio N°1: Dado el siguiente circuito:


Realice un programa que permita mostrar en el display la letra "C", si la entrada
está en nivel bajo ó la letra "U" si la entrada está en el nivel alto.

Solución:
Paso 1: Enunciado y delimitación del hardware: Tenemos el enunciado pero el
hardware no está del todo claro.
Como no se especifica que bit del microcontrolador controla a cuál segmento
del display, debemos especificarlo. Además no se especifica que display vamos a
utilizar, no sabemos si es ánodo común o cátodo común. Por lo tanto lo asignaremos
a nuestro criterio. Eligiendo un cátodo común tendremos:

La identificación de los segmentos de un display a nivel internacional es la


siguiente:

Paso 2: Diagrama de Flujo


Paso 3: Lenguaje Ensamblador:

Ejercicio N°2: Diseñe un contador de 8 bits, que se incrementa cada vez


que se pulsa "P" (RA3). Visualice el resultado por el puerto B. Activar
un led (RA0), cuando el contador llegue a D'125' y apagarlo cuando llegue
a D'221. y luego repetir el ciclo.

Ejercicio N°3: Dado el siguiente circuito:


Ejercicio N°4: Realice un programa que permita explorar el estado del bit RA3.
Si RA3 es uno, se debe mostrar en el display el número 5. Caso contrario se debe
mostrar el número 3.

Ejercicio N°5: Realizar un programa que permita hacer la función espejo en


el puerto B, el nibble menos significativo de puerto B será de entrada y
el nibble más significativo será de salida, permitiendo de esta manera
monitorear el estado del nibble de entrada en el de salida.

PUERTO B
NIBBLE menos
significativo
B3 B2 B1 B0

Ejercicio N°6: Realizar un programa que permita tener una señal


cuadrada simétrica de 50 hz en el bit 7 del puerto B

You might also like