Documente Academic
Documente Profesional
Documente Cultură
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)
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)
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:
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:
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:
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
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.
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:
PUERTO B
NIBBLE menos
significativo
B3 B2 B1 B0