02 Assembler de PIC16F877A

Embed Size (px)

Citation preview

  • 7/26/2019 02 Assembler de PIC16F877A

    1/55

    MicroelectrnicaAutor: Mauricio Galvez Legua

    ([email protected])

    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

    ([email protected])