Post on 02-Mar-2018
transcript
7/26/2019 02 Assembler de PIC16F877A
1/55
MicroelectrnicaAutor: Mauricio Galvez Legua
(mgalvez@uni.edu.pe)
1Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
2/55
Programacin Assembler
El conjunto de instrucciones que tiene unmicroprocesador da origen al denominado lenguajeassembler o lenguaje ensamblador.
Es un lenguaje de programacin de bajo nivel para
los computadores, uP, uC y otros circuitosintegrados programables.
2Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
3/55
Programacin Assembler
El lenguaje ensamblador fue usado principalmenteen los inicios del desarrollo de software, cuandoan no se contaba con potentes lenguajes de altonivel y los recursos eran limitados.
Actualmente se utiliza con frecuencia en ambientesacadmicos y de investigacin, especialmentecuando se requiere la manipulacin directa dehardware, altos rendimientos, o un uso de recursos
controlado y reducido.
3Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
4/55
Programacin Assembler
Elaborar programas mediante cdigo de operaciones(byte code) resulta complicado y tedioso. Ejemplo:
Calcular las direcciones de salto para instruccionescondicionales.
Es por ello que se crearon los programasensambladores, que trabajan directamente con losnombres de las instrucciones (nemnicos) y utilizanetiquetas para indicar las direcciones de los saltos.
Es el propio programa ensamblador quien se encarga
de: Traducir los nemnicos en cdigos de operacin (byte code).
Convertir las etiquetas en direcciones.
Autor: Mauricio Galvez Legua 4
7/26/2019 02 Assembler de PIC16F877A
5/55
Programacin Assembler: Directivas
Las directivas son indicaciones que se le dan alprograma ensamblador para controlar algunosaspectos del ensamblado del cdigo. Ejemplo:
Decirle al programa ensamblador donde inicia unprograma.
Definir constantes.
Indicar que posiciones de memoria estn reservadaspara almacenar datos en forma temporal (variable).
Llenar una porcin de memoria con un dato
especificado.
5Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
6/55
Programacin Assembler: Directivas
Las directivas del ensamblador, tambin llamadaslos pseudo opcodes, pseudo-operaciones o pseudo-ops, son instrucciones que son ejecutadas por unensamblador en el tiempo de ensamblado, no porel procesador en el tiempo de ejecucin.
Las Directivas no son instrucciones del procesador.
6Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
7/55
Programacin Assembler: Directivas
Los tipos de directivas son: Directivas de control permiten un ensamblado
condicional.
Directivas de datos permiten la manipulacin simblicay el posicionamiento en memoria.
Directivas de listado permiten todo el control sobre elformato, paginacin y listado del programa.
Directivas de macros permiten todas las gestiones de lasmacros.
Directivas de ficheros objeto solo se utilizan para lacreacin de ficheros objeto.
7Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
8/55
Programacin Assembler: Directivas
Las directivas bsicas que todo programa ensamblador debetener y que nos facilitan la programacin son:
ORG: Indica la direccin de memoria a partir de la cual debe serubicado el programa, subrutina o datos.
EQU: Define una constante. Cada vez que el ensambladorencuentre ese nombre lo debe sustituir por el valor
correspondiente. DB o DEFB (Define Byte): Esta directiva sirve para definir variables.
Con una sola directiva DB se pueden definir varias variables enformato decimal, hexadecimal o ASCII, para ello se deben separarcon comas. En el caso de ASCII estos deben estar definidos entrecomillas. DW o DEFW (Define Word): Permite definir variables deltipo word (16 bits). Tener cuidado de la forma como se almacenan
estas variables (Llittle-endian o Big-endian). DS: Reserva un espacio de memoria para ser usado por el
programa.
END: Sirve para indicar el fin del programa. Cualquier cdigoubicado despus de esta directiva ya no ser tomado en cuenta.
8Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
9/55
Herramientas de Programacin
Para desarrollar programas en assembler de PIC, laempresa Microchip proporciona un conjunto deherramientas de programacin.
MPLABX: Es un editor IDE gratuito, destinado amicrocontroladores de la marca Microchip. Este editor
es modular, permite seleccionar los distintosmicrocontroladores soportados, adems de permitir lagrabacin de estos circuitos integrados directamente alprogramador.
MPLABX es ejecutable en Windows, MacOS y Linux. MPLABX trae incorporado un compilador para asembler
de PIC denominado MPASM.
9Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
10/55
Herramientas de Programacin
10Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
11/55
Herramientas de Programacin: MPASM
Nos permite escribir cdigo assembler yensamblarlo para producir como salida un fichero.HEX que luego grabaremos en el PIC o que nosservir para utilizarlo con un simulador que trae elMPLABX o utilizar otro simulador como PROTEUS.
11Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
12/55
Elaborando Programas ASM
Para realizar programas en assembler debemostener presente lo siguiente:
Campos de un programa: En un programa en assembler,cada lnea del archivo fuente puede contener cuatrotipos de informacin:
Etiquetas
Operacin, nemnicos (instrucciones), Directivas y Macros
Operandos
Comentarios
12Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
13/55
Elaborando Programas ASM
Convencin de notacin:
13Autor: Mauricio Galvez Legua
7/26/2019 02 Assembler de PIC16F877A
14/55
Elaborando Programas ASM: Requisitos
Para elaborar programas en lenguaje ensambladorrequerimos tener instalado:
MPLABX
Proteus
Autor: Mauricio Galvez Legua 14
7/26/2019 02 Assembler de PIC16F877A
15/55
PIC16F877A: Primer programa
Para desarrollar nuestro primer programa enPIC16F877A primero debemos hacer unasconfiguraciones iniciales.
Todo programa debe empezar con esta
configuracin:LIST P=16f877A ;Indica el tipo de procesador a programar
INCLUDE "P16F877A.INC" ;Incluye en el programa el fichero dedefiniciones del uC seleccionado
__CONFIG _CP_OFF& _DEBUG_OFF& _WRT_OFF& _CPD_OFF&
_LVP_OFF& _BODEN_OFF& _PWRTE_ON& _WDT_OFF& _XT_OSC;Selecciona el estado de los bits de configuracin
Autor: Mauricio Galvez Legua 15
7/26/2019 02 Assembler de PIC16F877A
16/55
PIC16F877A: Primer programa
Todo microcontrolador de la empresa Microchiptiene un Archivo de Definiciones, en donde seindica cuales son los nombres correctos para cadaregistro, cada bit y que posicin de memoriaocupan.
Dicho archivo se encuentra en el siguientedirectorio (Windows 7):
Autor: Mauricio Galvez Legua 16
7/26/2019 02 Assembler de PIC16F877A
17/55
PIC16F877A: Primer programa
El archivo puede servisualizado mediante elblock de notas:
Autor: Mauricio Galvez Legua 17
7/26/2019 02 Assembler de PIC16F877A
18/55
PIC16F877A: Primer programa
Nuestro primer programa enviar el byte:10101010 al puerto D.
En Proteus configure el PIC16F877A a unafrecuencia de trabajo igual a 4Mhz.
Autor: Mauricio Galvez Legua 18
7/26/2019 02 Assembler de PIC16F877A
19/55
PIC16F877A: Primer programa
El programa en ensamblador es:
Autor: Mauricio Galvez Legua 19
7/26/2019 02 Assembler de PIC16F877A
20/55
PIC16F877A: Primer programa
Recordar el registro STATUS para la seleccin delbanco:
Autor: Mauricio Galvez Legua 20
7/26/2019 02 Assembler de PIC16F877A
21/55
PIC16F877A: Primer programa
Finalmente lo compilamos y lo probamos en elcircuito diseado en Proteus:
Autor: Mauricio Galvez Legua 21
7/26/2019 02 Assembler de PIC16F877A
22/55
PIC16F877A: Primer programa
Compilar significa pasarnuestro programa queest elaborado ennemnicos, a byte code.
En el MPLAB existe unaopcin que nos permitevisualizar el contenidoque est almacenado en
la memoria de programadel PIC:
Windows PIC MemoryViews
Autor: Mauricio Galvez Legua 22
7/26/2019 02 Assembler de PIC16F877A
23/55
PIC16F877A: Primer programa
Observamos los byte code de cada instruccin y suubicacin en la memoria de programa:
Autor: Mauricio Galvez Legua 23
7/26/2019 02 Assembler de PIC16F877A
24/55
PIC16F877A:
Las instrucciones soncodificadas de lasiguiente manera:
Autor: Mauricio Galvez Legua 24
7/26/2019 02 Assembler de PIC16F877A
25/55
PIC16F877A:
Autor: Mauricio Galvez Legua 25
7/26/2019 02 Assembler de PIC16F877A
26/55
PIC16F877A:
Autor: Mauricio Galvez Legua 26
7/26/2019 02 Assembler de PIC16F877A
27/55
PIC16F877A: Variables
Una variable es una posicin de memoria(definicin ms elemental), en donde se almacenael valor de dicha variable y es modificable encualquier momento.
Para definir una variable podemos emplear la
directiva EQU:tiempo1 EQU 0x20
tiempo2 EQU 0x21
rotar EQU 0x22
cuenta EQU 0x23 Observar que estamos haciendo uso de las
direcciones GPR del PIC.
Autor: Mauricio Galvez Legua 27
7/26/2019 02 Assembler de PIC16F877A
28/55
PIC16F877A: Variables
Otra forma de hacerlo sin tener que especificar ladireccin para cada variable es mediante ladirectiva CBLOCK. Ejemplo:
CBLOCK 0x20
tiempo1
tiempo2
rotar
cuenta
ENDC
Tambin es posible escribir las variables en unasolo lnea, pero separado por comas.
Autor: Mauricio Galvez Legua 28
7/26/2019 02 Assembler de PIC16F877A
29/55
PIC16F877A: Subrutinas
Se le llama subrutina a un segmento de cdigoseparado del bloque principal y que puede serinvocado en cualquier momento desde este odesde otra subrutina.
Una subrutina al ser llamada dentro de unprograma hace que el cdigo principal se detenga yse dirija a ejecutar el cdigo de la subrutina. Unavez terminado de ejecutar la subrutina, vuelve al
programa principal y contina donde se quedo.
Autor: Mauricio Galvez Legua 29
7/26/2019 02 Assembler de PIC16F877A
30/55
PIC16F877A: Subrutinas
Autor: Mauricio Galvez Legua 30
7/26/2019 02 Assembler de PIC16F877A
31/55
PIC16F877A: Subrutinas
El como recuerda donde se qued es porquepreviamente antes de ir a la subrutina guarda lasiguiente direccin del programa principal enla Zona de Stack.
Autor: Mauricio Galvez Legua 31
7/26/2019 02 Assembler de PIC16F877A
32/55
PIC16F877A: Subrutinas P01)
Ahora vamos a realizar una subrutina de retardoque nos permita poder generar cambios visiblespor el ojo humano en los leds. Para ello haremos unloop dentro de otro loop:
Autor: Mauricio Galvez Legua 32
7/26/2019 02 Assembler de PIC16F877A
33/55
PIC16F877A: Subrutinas P01)
La subrutina utiliza dos variables: TIEMPO1 yTIEMPO2, las cuales deben ser definidas al iniciodel programa de la siguiente manera:
Si se requiere ms tiempo de retardo se debeadicionar ms instrucciones NOP.
Autor: Mauricio Galvez Legua 33
7/26/2019 02 Assembler de PIC16F877A
34/55
PIC16F877A: Subrutinas P01)
Modificamos el programa anterior para hacer que los leds
del puerto D "parpadeen". Para ello luego de enviar el datoal puerto D (y finalizando el retardo), negamos el contenidodel puerto D (instruccin COMF) y nuevamente llamamos ala subrutina de retardo. Esto se repite indefinidamente.
Las variables se reservan en el espacio de memoria
denominado GPR (Registros de Propsitos Generales).
La configuracin del registro TRISD se realiza con una solainstruccin denominada CLRF.
La llamada a la subrutina se hace con la instruccin CALL. La
subrutina tiene al final una instruccin RETURN, queasegure el retorno al programa principal.
La instruccin GOTO salta incondicionalmente a la direccinespecificada por la etiqueta.
Autor: Mauricio Galvez Legua 34
7/26/2019 02 Assembler de PIC16F877A
35/55
PIC16F877A: Subrutinas P01)
Autor: Mauricio Galvez Legua 35
7/26/2019 02 Assembler de PIC16F877A
36/55
PIC16F877A: Ejemplo P01A
El siguiente programa rotar a la derecha un nicoled encendido Para ello requerimos saber comofuncionan las instrucciones de rotacin:
Autor: Mauricio Galvez Legua 36
7/26/2019 02 Assembler de PIC16F877A
37/55
PIC16F877A: Ejemplo P01A
Observar que las dos instrucciones de rotacin utilizan alflag de CARRY. Dicho flag esta ubicado en el registro STATUS.
Autor: Mauricio Galvez Legua 37
7/26/2019 02 Assembler de PIC16F877A
38/55
PIC16F877A: Ejemplo P01A
Autor: Mauricio Galvez Legua 38
7/26/2019 02 Assembler de PIC16F877A
39/55
PIC16F877A: Ejemplo P01B
Vamos a realizar una variante al programa anterior,para que en vez de displayar un led "prendido a lavez", el cual esta rotando, displaye lo contrario(todo los leds prendidos y el que rota es un ledapagado).
Nuestro programa es:
Autor: Mauricio Galvez Legua 39
7/26/2019 02 Assembler de PIC16F877A
40/55
PIC16F877A: Ejemplo P01B
Autor: Mauricio Galvez Legua 40
7/26/2019 02 Assembler de PIC16F877A
41/55
PIC16F877A: Ejercicio P01C
Realizar un programa que muestre un ledencendido, rotando a la derecha por los puertosPORTD y PORTC. Siempre debe mostrarse un ledencendido.
Autor: Mauricio Galvez Legua 41
7/26/2019 02 Assembler de PIC16F877A
42/55
PIC16F877A: Ejercicio P01D
Realizar un programa querealice la siguientesecuencia en el PORTD yPORTC:
Autor: Mauricio Galvez Legua 42
7/26/2019 02 Assembler de PIC16F877A
43/55
PIC17F877A: Ejercicio P01D
Autor: Mauricio Galvez Legua 43
7/26/2019 02 Assembler de PIC16F877A
44/55
PIC17F877A: Ejercicio P01E
Elaborar un programa que realice la siguientesecuencia en el PORTD y PORTC:
Autor: Mauricio Galvez Legua 44
7/26/2019 02 Assembler de PIC16F877A
45/55
PIC17F877A: Ejercicio P01E
Autor: Mauricio Galvez Legua 45
7/26/2019 02 Assembler de PIC16F877A
46/55
PIC17F877A: Ejemplo P03
Vamos a realizar un programa que visualice en undisplay los nmeros del 0 al 9. Existe una granvariedad de display como podemos observar en elsiguiente grfico:
Nosotros vamos emplear el display de 7 segmentos.
Autor: Mauricio Galvez Legua 46
7/26/2019 02 Assembler de PIC16F877A
47/55
PIC17F877A: Ejemplo P03
Para realizarlo vamos hacer uso de variables ysubrutinas:
Recuerde que las posiciones de memoria 0x20 y
0x21 estn ubicadas en la zona denominada GPR(Registros de Propsitos Generales).
Autor: Mauricio Galvez Legua 47
7/26/2019 02 Assembler de PIC16F877A
48/55
PIC17F877A: Ejemplo P03
Ahora debemos de obtener los valores debemosenviar al display para que se visualicen cada uno delos nmeros del 0 al 9 solicitados. El display es dectodo comn:
Autor: Mauricio Galvez Legua 48
7/26/2019 02 Assembler de PIC16F877A
49/55
PIC17F877A: Ejemplo P03
Proteus: P03.DSN
Programa: P03.asm
Autor: Mauricio Galvez Legua 49
7/26/2019 02 Assembler de PIC16F877A
50/55
PIC17F877A: Ejemplo P04
Elaborar un programa que permita displayar en una matriz
de dos display, el nmero 0 en el primer display y el nmero1 en el segundo display (utilizar 7SEG-MPX2-CC-BLUE). Sedebe emplear la tcnica de multiplexado para habilitar cadauno de los display.
Proteus: P04.DSN
Programa: P04.asm
Autor: Mauricio Galvez Legua 50
7/26/2019 02 Assembler de PIC16F877A
51/55
PIC17F877A: Ejercicio P04B
Modificar el programa para que funcione sin los inversores.
Autor: Mauricio Galvez Legua 51
7/26/2019 02 Assembler de PIC16F877A
52/55
PIC17F877A: Ejemplo P05
Programa que permite displayar el mensaje FIEE en cuatro
display de ctodo comn. Se esta empleando tcnica demultiplexado para habilitar cada uno de los display.
Autor: Mauricio Galvez Legua 52
Proteus: P05.DSN
Programa: P05.asm
7/26/2019 02 Assembler de PIC16F877A
53/55
PIC17F877A: Ejercicio P05B
Modificar el programa para que trabaje con un decoder
74139 en la parte del multiplexado.
Autor: Mauricio Galvez Legua 53
Proteus: P05B.DSN
7/26/2019 02 Assembler de PIC16F877A
54/55
PIC17F877A: Ejercicio P05C
Modificar nuevamente el programa para que trabaje con un
display 7SEG-MPX8-CC-BLUE y con un decoder 74138. Debedisplayar: FIEE-UNI
Autor: Mauricio Galvez Legua 54
Proteus: P05C.DSN
7/26/2019 02 Assembler de PIC16F877A
55/55
FinAutor: Mauricio Galvez Legua
(mgalvez@uni.edu.pe)