2 descripción general del pic16f877

Upload: juan-eduardo-pazmino

Post on 30-Oct-2015

69 views

Category:

Documents


3 download

DESCRIPTION

Descripción General del PIC16F877

TRANSCRIPT

  • 1

    DESCRIPCIN GENERAL DEL PIC 16F877

  • 2

    2. Descripcin General del PIC16F877

    2.1. La Familia del PIC16F877

    El microcontrolador PIC16F877 de Microchip pertenece a una gran familia de microcontroladores de 8 bits (bus de datos) que tienen las siguientes caractersticas generales que los distinguen de otras familias:

    - Arquitectura Harvard del Microcontrolador - Tecnologa RISC de la CPU - Tecnologa CMOS

    Estas caractersticas se conjugan para lograr un dispositivo altamente eficiente en el uso de la memoria de datos y programa y por lo tanto en la velocidad de ejecucin.

    Microchip ha dividido sus microcontroladores en tres grandes subfamilias de acuerdo al nmero de bits de su bus de instrucciones:

    Subfamilia Instrucciones Nomenclatura Base - Line 33 instrucciones de12 bits PIC12XXX y PIC14XXX Mid - Range 35 instrucciones de 14 bits PIC16XXX High - End 58 instrucciones de 16 bits PIC17XXX y PIC18XXX

    Existen algunas excepciones, como el PIC16C5X que maneja 33 instrucciones de 12 bits (posee empaquetados de 18 y 28 pines y se energiza con 2.5 volts)

    Algunos autores manejan una gama enana consistente en los PIC12C508 y PIC12C509 en empaque de 8 patitas y con un bus de instrucciones de 12 o de 14 bits.

    1. Variantes principales

    Los microcontroladores que produce Microchip cubren una amplio rango de dispositivos cuyas caractersticas pueden variar como sigue:

    - Empaquetado (desde 8 patitas hasta 68 patitas) - Tecnologa de la memoria incluida (EEPROM, ROM, Flash) - Voltajes de operacin (desde 2.5 v. Hasta 6v) - Frecuencia de operacin (Hasta 20 Mhz)

    2. Empaquetados

    Aunque cada empaquetado tiene variantes, especialmente en lo relativo a las dimensiones del espesor del paquete, en general se pueden encontrar paquetes tipo PDIP (Plastic Dual In Line Package), PLCC (Plastic Leaded Chip Carrier), QFP (Quad Flat Package) y SOIC (Small Outline I.C.) los cuales se muestran en las figuras siguientes:

  • 3

  • 4

    3. Nomenclatura

    Adems de lo mostrado en la tabla anterior, en el nombre especfico del microcontrolador pueden aparecer algunas siglas que dependen del rango de voltaje manejado y del tipo de memoria ROM incluida, como se muestra en la siguiente tabla:

    Tipo de memoria Rango de voltaje

    Estndar (4.5 a 6 volts) Extendido (2.5 a 6 volts) EEPROM, OTP PIC16CXXX PIC16LCXXX

    ROM PIC16CRXXX PIC16LCRXXX Flash PIC16FXXX PIC16LFXXX

    4. Oscilador

    Los PIC de rango medio permiten hasta 8 diferentes modos para el oscilador. El usuario puede seleccionar alguno de estos 8 modos programando 2 bits de configuracin del dispositivo denominados: FOSC1 y FOSC0, ubicados en un registro especial de configuracin en la localidad 2007H de la memoria de programa:

    5. Configuration word (2007H):

    La palabra de configuracin selecciona las distintas configuraciones del microcontrolador, la cual est ubicada en la direccin de memoria 2007h. Esta direccin de memoria est ms all de

  • 5

    la memoria de programa de usuario. De hecho, pertenece al espacio de memoria de test/configuracin (2000h - 3FFFh), a la que solo puede accederse durante la programacin.

    13 12 11 10 9 8 7 6 5 4 3 2 1 0 CP1 CP0 DEBUG - WRT CPD LVP BODEN CP1 CP0 #PWRTE WDTE FOSC1 FOSC1

    Configuracin del Oscilador

    Estos modelos de microcontroladores no se apartan de la lnea seguida por las familias anteriores. En algunos de l o s modos d e configuraciones, el usuario puede indicar que se genere o no una salida del oscilador (CLKOUT) a travs de una patita de Entrada/Salida. Los modos de configuracin del oscilador para la operacin del microcontrolador, se muestran en la siguiente lista:

    FOSC1 FOSC0 Modo de operacin del oscilador 0 0 LP Baja frecuencia (y bajo consumo de potencia) 0 1 XT Cristal / Resonador cermico externos, (Media potencia) 1 0 HS Alta velocidad (y alta potencia) Cristal/resonador 1 1 RC Resistencia / capacitor externos

    Observacin: Algunos PICs poseen un modo de oscilacin que les permite usar una resistencia y un capacitor interno calibrados para 4 Mhz.

    LP Oscilador de cristal de cuarzo o resonador cermico de baja potencia (Low Power Cristal). Se trata de un oscilador de bajo consumo con un cristal o resonador para trabajar con frecuencias comprendidas entre 32 y 200 KHz.

    XT (Cristal/Resonador) Oscilador o resonador cermico. Se trata de un oscilador estndar que permite una frecuencia de reloj comprendida entre 100 KHz y 4 MHz.

    HS (High Spedd Cristal/Resonador) Oscilador de cristal o resonador de alta velocidad. Es un oscilador de una frecuencia comprendida ente 4MHz y 20 MHz.

    RC (Resistor/Capacitor). Es un oscilador de bajo costo, formado por una resistencia y un condensador

    Tipos de Osciladores

    Los tres modos LP, XT y HS usan un cristal o resonador externo, la diferencia sin embargo es la ganancia de los drivers internos, lo cual se ve reflejado en el rango de frecuencia admitido y la potencia consumida. A continuacin se describe los diferentes tipos de osciladores:

    a. Cristal externo: En los tres modos mostrados en la tabla anterior se puede usar un cristal o resonador cermico externo. En la siguiente figura se muestra la conexin de un cristal a las patitas OSC1 y OS2 del PIC.

  • 6

    b. Circuito RC externo: En los modos RC y EXTRC el PIC puede generar su seal oscilatoria basada en un arreglo RC externo conectado a la patita OSC1 como se muestra en la siguiente figura:

    Este modo slo se recomienda cuando la aplicacin no requiera una gran precisin en la medicin de tiempos.

    Rangos. La frecuencia de oscilacin depende no slo de los valores de Rext y Cext, sino tambin del voltaje de la fuente Vdd. Los rangos admisibles para resistencia y capacitor son:

    I. Rext: de 3 a 100 Kohms II. Cext: mayor de 20 pf

    c. Oscilador externo. Tambin es posible conectar una seal de reloj generada mediante un oscilador externo a la patita OSC1 del PIC. Para ello el PIC deber estar en uno de los tres modos que admiten cristal (LP, XT o HS). La conexin se muestra en la siguiente figura:

  • 7

    d. Oscilador interno de 4Mhz. En los PICs que poseen este modo de oscilacin, (modo INTRC) el PIC usa un arreglo RC interno que genera una frecuencia de 4 Mhz con un rango de error calibrable de 1.5%. Para calibrar el error de oscilacin se usan los bits CAL3, CAL2, CAL1 Y CAL0 del registro OSCCAL.

    Calibracin del oscilador interno. El fabricante ha colocado un valor de calibracin para estos bits en la ltima direccin de la memoria de programa. Este dato ha sido guardado en la forma de una instruccin RETLW XX. Si no se quiere perder este valor al borrar el PIC (en versiones EPROM con ventana) primero se deber leer y copiar. Es una buena idea escribirlo en el empaquetado antes de borrar la memoria).

    En resumen, los modos XT, LP o HS, el cristal o resonador se conecta entre las patillas OSC1/CLKIN y OSC2/CLKOUT, pero tambin permite conectar un oscilador externo a la patilla OSC1/CLKIN. En la siguiente Figura se muestra los modos de configuracin del oscilador principal del sistema:

    Conexin del Cristal o Resonador en modo (HS, XT o

    LP)

    Oscilador en modo RC Conexin de Oscilador externo en modo (HS, XT o

    LP)

    Rangos de frecuencia para los Osciladores

    En la siguiente tabla se muestran los rangos de frecuencia as como los capacitores recomendados para un oscilador en base a cristal.

    Modo Frecuencia tpica Capacitores recomendados

    C1 C2 LP 32 khz 33 a 68 pf 33 a 68 pf

    200 khz 15 a 30 pf 15 a 30 pf XT 200 khz 47 a 68 pf 47 a 68 pf

    1 Mhz 15 a 30 pf 15 a 30 pf

    4 Mhz 15 a 30 pf 15 a 30 pf HS 4 Mhz 15 a 30 pf 15 a 30 pf

    8 Mhz 15 a 30 pf 15 a 30 pf 20 Mhz 15 a 30 pf 15 a 30 pf

    En la siguiente Figura se indica los valores de los Resonadores Cermicos y Condensadores para cristales, necesarios a instalar entre la masa y las patillas de los cristales y/o resonadores:

  • 8

    Resonadores Cermicos Condensadores para cristales

    2.2 El Reset

    En estos circuitos hay seis formas de que se produzca un Reset:

    1. Power-On Reset (POR) 2. #MCLR reset durante una operacin normal 3. #MCLR reset durante Sleep 4. WDT reset durante una operacin normal 5. WDT por despertar de Sleep 6. Brown-Out Reset (BOR)

    Con la lectura de los bits #TO y #PD del registro de STATUS y los bits POR y BOR del registro PCON (83h) sabremos en todo momento quin y cmo se produjo un reset.

    Llevando a cero la patilla #MCLR se puede generar un reset. Si no se desea ningn sistema de reset externo, esta patilla se puede conectar directamente a la alimentacin o a travs de una resistencia.

    El impulso de inicializacin POR (Power-On Reset) es generado internamente cuando la tensin de alimentacin se encuentra entre los limites de 1,2 V y 1,7 V, es un mtodo cmodo de originar un reset al conectar la alimentacin, ya que no requiere de ningn componente adicional pero no siempre es el mtodo ideal para realizarlo, en muchas ocasiones se necesita que ste se produzca a una tensin superior. En estos casos se pueden utilizar los circuitos y clculos que muestra la siguiente Figura, dos circuitos externos de reset y frmulas para calcular la tensin a la que tendr lugar:

  • 9

    En este circuito cuando VDD desciende por debajo del valor VZ = +0,7V, se produce un Reset por la activacin de patilla MCLR#.

    En este circuito el transistor Q1 se bloquea y activa el Reset al pasar a nivel bajo la patilla MCLR#, cuando el valor de VDD desciende por debajo de :

    Cuando se conecta la tensin de alimentacin a los circuitos, sobre todo cuando la fuente de alimentacin tiene grandes condensadores de filtrado, la salida de tensin continua tarda en crecer desde cero hasta alcanzar el mximo valor; una vez se hayan sobrepasado los 1, 7 V y antes de llegar a la mxima tensin, en estos pocos milisegundos el microcontrolador tiene tiempo para ejecutar algunas miles de instrucciones, pero antes de que comiencen a ser ejecutadas hay que estar seguro de que el resto de los componentes que constituyen el diseo se han terminado de inicializar. Es aqu donde se aprovechan las ventajas del Power-On Reset y si se ha habilitado, las del temporizador Power-Up Timer (PWRT), bit configurable en la programacin del microcontrolador) que aade 72 milisegundos adicionales al impulso interno de reset. Para la mayora de los casos con el POR y el tiempo aadido por el PWRT ser ms que suficiente para que, tanto la tensin de alimentacin como el resto de los circuitos, se hayan estabilizado. No obstante, si se desea que el microcontrolador permanezca inactivo hasta que la tensin de alimentacin est muy prxima a su mximo valor, no queda ms remedio que, adems de habilitar el PWRT, se instale un circuito externo de reset con tensin de disparo ajustable, tres resistencias y un transistor as lo garantizan (ver el esquema de la Figura anterior).

    Los circuitos internos de reset tambin tienen un circuito de control (OST, Oscillator Start-up Timer) que aade un retardo de 1.024 ciclos del reloj externo despus de los 72 ms. proporcionados por el PWRT. Este retardo asegura que el oscilador externo ha terminado de estabilizarse antes de que la CPU comience a ejecutar instrucciones.

    Otro de los modos de reset es el Brown- Out Reset que tiene un comportamiento muy similar al POR, slo que los mrgenes de tensin son diferentes, en este caso se sitan entre 3,8 V y 4,2 V, en realidad lo que trata de detectar, es que la tensin de alimentacin no tenga fallos o pequeas cadas de voltaje durante periodos de tiempo muy cortos.

    No sustituye a los circuitos de reset es una forma muy eficaz de controlar los pequeos fallos que se pueden producir en la alimentacin, bien por cortes rpidos de la tensin de entrada, o bien porque se ha producido un pico de corriente muy elevado y la fuente de alimentacin no ha sido capaz de proporcionarlo y ha cado su tensin.

  • 10

    En el diagrama de bloques del circuito de reset dentro del chip de la siguiente Figura se pueden ver, los circuitos PWRT y OST, el primero est formado por un contador de 10 bits que se encarga de contar 1.024 impulsos de reloj interno formado por una red RC (este oscilador no tiene nada que ver con el oscilador principal). Este es el circuito encargado de proporcionar los 72 milisegundos de retardo; una vez hayan transcurrido se habilita un segundo contador (OST) tambin de 10 bits, que se encarga de contar 1.024 impulsos del oscilador externo; suficientes ciclos para que al finalizar la cuenta el oscilador ya est totalmente estabilizado.

    2.3. Caractersticas generales del PIC16F877

    La siguiente es una lista de las caractersticas que comparte el PIC16F877 con los dispositivos ms cercanos de su familia:

    PIC16F873 PIC16F874 PIC16F876 PIC16F877

    1. CPU: - Tecnologa RISC - Slo 35 instrucciones que aprender - Todas las instrucciones se ejecutan en un ciclo de reloj, excepto los saltos que requieren

    dos - Frecuencia de operacin de 0 a 20 MHz (200 nseg de ciclo de instruccin) - Opciones de seleccin del oscilador

    2. Memoria: - Hasta 8k x 14 bits de memoria Flash de programa - Hasta 368 bytes de memoria de datos (RAM) - Hasta 256 bytes de memoria de datos EEPROM - Lectura/escritura de la CPU a la memoria flash de programa

  • 11

    - Proteccin programable de cdigo - Stack de hardware de 8 niveles

    3. Reset e interrupciones: - Hasta 14 fuentes de interrupcin - Reset de encendido (POR) - Timer de encendido (PWRT) - Timer de arranque del oscilador (OST) - Sistema de vigilancia Watchdog timer.

    4. Otros: - Modo SLEEP de bajo consumo de energa - Programacin y depuracin serie In-Circuit (ICSP) a travs de dos patitas - Rango de voltaje de operacin de 2.0 a 5.5 volts - Alta disipacin de corriente de la fuente: 25mA - Rangos de temperatura: Comercial, Industrial y Extendido - Bajo consumo de potencia:

    Menos de 0.6mA a 3V, 4 Mhz 20 A a 3V, 32 Khz menos de 1A corriente de standby (modo SLEEP).

    5. Perifricos:

    Perifrico PIC16F873 PIC16F874 Caractersticas PIC16F876 PIC16F877 3 a 5 Puertos Paralelos

    PortA,B,C PortA,B,C,D,E con lneas digitales programables individualmente

    3 Timers

    Timer0 Timer0 Contador/Temporizador de 8 bits con pre-escalador de 8 bits Timer1 Timer1 Contador/Temporizador de 16 bits con pre-escalador

    Timer2 Timer2 Contador/Temporizador de 8 bits con pre-escalador y post- escalador de 8 bits y registro de periodo

    2 mdulos CCP

    Captura Captura 16 bits, 1.5 nseg de resolucin mxima Comparacin Comparacin 16 bits, 200 nseg de resolucin mxima

    PWM PWM 10 bits 1 Conversor A/D AN0,...,AN4 AN0,...,AN7 de 10 bits, hasta 8 canales

    Puertos Serie

    SSP SSP Puerto Serie Sncrono USART/SCI USART/SCI Puerto Serie Universal

    ICSP ICSP Puerto serie para programacin y depuracin in circuit Puerto Paralelo Esclavo

    PSP PSP Puerto de 8 bits con lneas de protocolo

    2.4. Diagrama de Bloques del PIC16F877

    En la siguiente figura se muestra a manera de bloques la organizacin interna del PIC16F877, Se muestra tambin junto a este diagrama su diagrama de patitas, para tener una visin conjunta del interior y exterior del Chip.

  • 12

  • 13

    2.5. Descripcin de la CPU

    La CPU es la responsable de la interpretacin y ejecucin de la informacin (instrucciones) guardada en la memoria de programa. Muchas de estas instrucciones operan sobre la memoria de datos. Para operar sobre la memoria de datos adems, si se van a realizar operaciones lgicas o aritmticas, requieren usar la Unidad de Lgica y Aritmtica (ALU). La ALU controla los bits de estado (Registro STATUS), los bits de este registro se alteran dependiendo del resultado de algunas instrucciones.

    1. Ciclo de instruccin

    El registro Program Counter (PC) es gobernado por el ciclo de instruccin como se muestra en la siguiente figura. Cada ciclo de instruccin la CPU lee (ciclo Fetch) la instruccin guardada en la memoria de programa apuntada por PC y al mismo tiempo ejecuta la instruccin anterior, esto debido a una cola de instrucciones que le permite ejecutar una instruccin mientras lee la prxima:

    Como puede verse, cada ciclo de instruccin (Tcy = 4Tosc) se compone a su vez de cuatro ciclos del oscilador (Tosc= 1/Fosc)). Cada ciclo Q provee la sincronizacin para los siguientes eventos:

    Q1: Decodificacin de la instruccin Q2: Lectura del dato (si lo hay) Q3: Procesa el dato Q4: Escribe el dato

    Debido a esto cada ciclo de instruccin consume 4 ciclos de reloj, de manera que si la frecuencia de oscilacin es Fosc, Tcy ser 4/Fosc.

    2. Algunos Registros de la CPU

    Registro PC. Registro de 13 bits que siempre apunta a la siguiente instruccin a ejecutarse. En la siguiente seccin se dan mayores detalles en el manejo de este registro.

    El PC consta de 13 bits, separados en dos partes: como se muestra en la figura siguiente:

  • 14

    PCL = El byte de orden bajo PCH = El byte de orden alto

    Registro de Instruccin. Registro de 14 bits. Todas las instrucciones se colocan en l para ser decodificadas por la CPU antes de ejecutarlas.

    Registro W. Registro de 8 bits que guarda resultados temporales de las operaciones realizadas por la ALU.

    Registro STATUS. Registro de 8 bits, cada uno de sus bits (denominados Banderas) es un indicador de estado de la CPU o del resultado de la ltima operacin como se indica en la siguiente figura:

    Registro de STATUS (Direcciones 03h, 83h,103h, 183h)

    R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x IRP RP1 RP0 #T0 #PD Z DC C

    Bit 7 6 5 4 3 2 1 Bit 0

    bit 7: IRP: Seleccin de bancos para el direccionamiento indirecto 1 = Bancos 2 y 3 (1 00h-1 FFh) 0 = Bancos 0 y 1 (00h-FFh)

    bit 6-5: RP1:RP0: Seleccin del banco para el direccionamiento directo 11 = Banco 3 (1 80h- 1 FFh) 10 = Banco 2(100h-17Fh) 01 = Banco 1 (80h-FFh) 00 = Banco 0 (00h-7Fh)

    Cada Banco es de 128 bytes

    bit 4:#TO: Flag de Timer Out 1 = Despus de conectar VDD o ejecutar CLRWDT o SLEEP 0 = Al desbordarse el temporizador de WDT

    bit 3:#PD:Flag de Power Down 1 = Despus de conectar VDD o al ejecutar la instruccin CLRWDT 0 = Al ejecutar la instruccin SLEEP

    bit 2: Z: Flag de Cero 1 = El resultado de la ltima operacin aritmtica o lgica es Cero 0 = El resultado de la ltima operacin aritmtica o lgica es distinto cero

  • 15

    bit 1: DC: Flag de acarreo en el 4 bit de menos peso 1 = Acarreo en la suma 0 = No acarreo en la suma

    En la resta es al contrario

    bit 0: C: Flag de acarreo en el octavo bit 1 = Se ha producido un acarreo en la suma y no en la resta 0 = Se ha producido un acarreo en la resta y no en la suma

    Este bit tambin se utiliza en las instrucciones de rotacin

    Notacin: # = Negacin R = Bit leble, W= Bit Escribible, U= No implementado (se lee como 0) -n = Valor despus del Reset de encendido

    Banderas

    - Z. Este bit se pone (=1) para indicar que el resultado de la ltima operacin ari tmtica o lgica fue cero, de lo contrario se limpia (=0)

    - C. Bit de acarreo/prstamo de la ltima operacin aritmtica (en el caso de prstamo (resta), el bit se invierte antes de guardarse)

    - DC. Acarreo/ prstamo proveniente del cuarto bit menos significativo. Funciona igual que el bit C, pero para operaciones de 4 bits.

    Las restas se realizan sumando el complemento a dos del segundo operando, por ejemplo, para los datos 4FH y 25H:

  • 16

    2.6. Conjunto de Instrucciones de Rango Medio En la siguiente tabla se resumen las 35 instrucciones que reconoce la CPU de los PIC de medio rango, incluyendo su mnemnico, tiempo de ejecucin, cdigo de mquina y afectacin de banderas:

  • 17

    1. Descripcin de algunas instrucciones

    Para obtener la descripcin detallada de cada instruccin de la tabla anterior se deber consultar la seccin 29 del manual del fabricante (PICmicro Mid-Range MCU Reference Manual) o el ANEXO 1 de este documento. A continuacin slo se ejemplificarn algunas instrucciones con el propsito de clarificar la operacin que realizan.

    Ejemplo 1

    Para realizar la suma y la resta mencionadas en la seccin anterior (4Fh+25h y 4Fh-25h) se pueden usar las siguientes instrucciones:

    Suma MOVLW 0x4F ;carga el primer sumando en W ADDLW 0x25 ;suma W+25h y guarda el resultado en W

    ...

    Resta MOVLW 0x25 ;carga el sustraendo en W SUBLW 0x4F ;Resta 4Fh-W y guarda el resultado en W

    En el siguiente ejemplo se ejemplifica el efecto de algunas instrucciones sobre el registro W, sobre el registro de propsito general 20h de memoria RAM.

    Ejemplo 2

    Se anota como comentario a un lado de cada instruccin como queda el contenido de W, del registro 20h y de las banderas C, DC y Z:

    inicio MOVLW 0xF4 ;W=F4h, 0x20= ??, C=?, DC=?, Z=? ADDLW 0x0B ;W=FFh, 0x20= ??, C=0, DC=0, Z=0 MOVWF 0X20 ;W=FFh, 0x20=FFh, C=0, DC=0, Z=0 INCF 0x20,1 ;W=FFh, 0X20=00h, C=0, DC=0, Z=1 INCF 0X20,0 ;W=01h, 0x20=00h, C=0, DC=0, Z=0 COMF 0X20,1 ;W=01h, 0x20=FFh, C=0, DC=0, Z=0 XORWF 0x20,1 ;W=01h, 0x20=FEh, C=0, DC=0, Z=0 MOVF 0x20,0 ;W=FEh, 0x20=FEh, C=0, DC=0, Z=0

    ;(El ensamblador permite escribir esta ltima como MOVFW 0x20) DECF 0x20,1 ;W=FEh, 0x20=FDh, C=0, DC=0, Z=0 ANDWF 0x20,1 ;W=FEh, 0x20=FCh, C=0, DC=0, Z=0 RLF 0x20,1 ;W=FEh, 0x20=F8h, C=1, DC=0, Z=0 SWAPF 0x20,1 ;W=FEh, 0x20=8Fh, C=1, DC=0, Z=0 BCF 0x20,3 ;W=FEh, 0x20=87h, C=1, DC=0, Z=0 BSF 0x20,5 ;W=FEh, 0x20=A7h, C=1, DC=0, Z=0

    2. Formato General de las Instrucciones.

    Cada instruccin en lenguaje de mquina (binario) del PIC contiene un cdigo de operacin (opcode) el cual puede ser de 3 a 4 o 6 bits, dependiendo del tipo de instruccin.

    A continuacin se describe el formato para cada tipo de instruccin de los PIC de rango medio:

    a. Operaciones con el archivo de registros orientados a bytes

  • 18

    El bit d especifica el destino del resultado de la operacin: d = 0: destino W d = 1: destino f f = direccin de 7 bits del archivo de registros.

    b. Operaciones con el archivo de registros orientados a bits

    b : Especificacin en tres bits del bit sobre el que se va a operar f = direccin de 7 bits del archivo de registros.

    c. Operaciones con literales y de control

    Formato general:

    k : Literal = Valor de un operando de 8 bits

    Formato para CALL y GOTO:

    k : Literal = Valor de un operando de 8 bits

    2.7. Organizacin de la memoria del PIC

    Los PIC tienen dos tipos de memoria: Memoria de Datos y Memoria de programa, cada bloque con su propio bus: Bus de datos y Bus de programa, para poder permitir el acceso simultneo a estos dos bloques; por lo cual cada bloque puede ser accedido durante un mismo ciclo de oscilacin.

    La Memoria de datos a su vez se divide en

    - Memoria RAM de propsito general - Archivo de Registros (Special Function Registers (SFR))

    El tercer bloque de la Memoria de datos es la EEPROM.

    2.7.1. La Memoria de Programa

    Los PIC de rango medio poseen un registro Contador del Programa (PC) de 13 bits, capaz de direccionar un espacio de 8K x 14 posiciones de memoria de tipo FLASH, como todas las instrucciones son de 14 bits, esto significa un bloque de 8k instrucciones. Acceder a una posicin de memoria no implementada, provoca la lectura o escritura de la posicin de memoria envolvente.

  • 19

    El bloque total de 8K palabras x 14 bits de memoria de programa est subdividido en 4 pginas de 2K x 14. En la siguiente figura se muestra esta organizacin.

    Observacin1: No todos los PIC tienen implementado todo el espacio de 8K de memoria de programa (Consultar las hojas de datos del PIC especfico).

    Observacin2: El fabricante puede grabar datos de calibracin en localidades de memoria de programa por lo que se debern anotar en papel antes de borrar los dispositivos con ventana transparente.

    Vector de Reset. Cuando ocurre un reset el contenido del PC es forzado a cero, sta es la direccin donde la ejecucin del programa continuar despus del reset, por ello se le llama direccin del vector de reset.

    Vector de interrupcin. Cuando la CPU acepta una solicitud de interrupcin ejecuta un salto a la direccin 0004h, por lo cual a sta se le conoce como direccin del vector de interrupcin. El programador deber colocar en esta direccin la Rutina de Atencin a la Interrupcin (Interrupt Service Routine (ISR))., o bien un salto al inicio de ella.

    El registro PCLATH no es modificado en esta circunstancia, por lo cual habr que tener cuidado al manipular el registro PC (saltos y llamadas a subrutina) dentro de la Rutina de Atencin a la Interrupcin.

    Manejo del Contador del Programa (PC)

    El registro contador del programa (PC) especifica la direccin de la instruccin que la CPU buscar (fetch) para ejecutarla.

    El PC consta de 13 bits, separados en dos partes: como se muestra en la figura siguiente:

  • 20

    El byte de orden bajo es llamado el registro PCL, mientras que el byte de orden alto es llamado registro PCH. Este ltimo contiene los bits PC y no se puede leer o escribir directamente Todas las actualizaciones al registro PCH deben ser hechas a travs del registro PCLATH.

    En la siguiente figura se ilustran las cuatro situaciones y las maneras correspondientes en que el PC puede ser actualizado.

  • 21

    Paginacin

    Para saltar entre una pgina y otra, los bits ms significativos del PC debern ser modificados. Debido a que las instrucciones GOTO y CALL slo pueden direccionar un bloque de 2K (pues usan una direccin de 11 bits) deben existir otros dos bits que acompleten los 13 bits del PC para moverse sobre los 8K de memoria de programa.

    Estos dos bits extra se encuentran en un SFR denominado PCLATH (Program Counter Latch High) en sus bits PCLATH. Por esto antes de un GOTO o un CALL el usuario deber asegurarse que estos bits apunten a la pgina deseada.

    Si las instrucciones se ejecutan secuencialmente el PC cruza libremente los lmites de pgina sin necesidad de que el usuario escriba en el PCLATH

    Memoria de Stack

    La memoria de stack es una rea de memoria completamente separada de la memoria de datos y la memoria de programa. El stack consta de 8 niveles de 13 bits cada uno. Esta memoria es usada por la CPU para almacenar las direcciones de retorno de subrutinas. El apuntador de stack no es ni leble ni escribible.

    El vector de Reset est en la posicin de memoria 0000h y el vector de interrupcin est en la posicin de memoria 0004h. En la siguiente figura se muestra el Mapa de Memoria y STACK del PIC16F877/878:

    Cuando se ejecuta una instruccin CALL o es reconocida una interrupcin el PC es guardado en el stack y el apuntador de stack es incrementado en 1 para apuntar a la siguiente posicin vaca. A la inversa, cuando se ejecuta una instruccin RETURN, RETLW o

  • 22

    RETFIE el contenido de la posicin actual del stack es colocado en el PC y el apuntador de stack es decrementado en 1.

    Nota 1: PCLATH no se modifica en ninguna de estas operaciones

    Nota 2: Cuando el apuntador de stack ya est en la posicin 8 (se llamaron desde 8 subrutinas anidadas) y se ejecuta otro CALL se reinicia a la posicin 1 sobrescribiendo en dicha posicin. No existe ningn indicador que avise de esta situacin. As que el usuario deber llevar el control para que esto no ocurra.s

    2.7.2. La Memoria de Datos

    La memoria de datos consta de dos reas mezcladas y destinadas a funciones distintas: Registros de Propsito Especial (SFR) Registro de Propsito General (GPR)

    Los SFR son localidades asociadas especficamente a los diferentes perifricos y funciones de configuracin del PIC y tienen un nombre especfico asociado con su funcin. Mientras que los GPR son memoria RAM de uso general.

    Bancos de memoria

    Toda la memoria de datos est organizada en 4 bancos numerados 0, 1, 2 y 3. Para seleccionar un banco se debe hacer uso de los bits del registro STATUS denominados IRP, RP1 y RP0.

    Hay dos maneras de acceder a la memoria de datos: Direccionamiento directo e ndirecto. La seleccin de bancos se basa en la siguiente tabla, Seleccin de los bancos de memoria RAM con RP0 y RP1:

    Direccionamiento Indirecto (IRP) RP1:RP0 Banco

    0 0 0 0 0 1 1

    1 1 0 2 1 1 3

    Cada banco consta de 128 bytes (de 00h a 7Fh). En las posiciones ms bajas de cada banco se encuentran los SFR, y arriba de stos se encuentran los GPR. Toda la memoria de datos est implementada en Ram esttica.

    Algunos Registros de las Funciones Especiales estn reflejados en varios bancos para reducir el cdigo y tener un acceso ms rpido.

    Registros de Funciones Especiales (F.S.R)

    Los Registros de Funciones Especiales (SFR) son registros usados por la CPU y los mdulos perifricos para controlar el funcionamiento deseado del dispositivo. Estos registros estn realizados como RAM esttica.

    Los Registros de Funcin Especiales podemos clasificarlos en dos tipos:

  • 23

    Los correspondientes a la CPU, y Los que controlan los perifricos.

    Nota: Los registros que afectan directamente a la CPU se describen seguidamente con detalle. Aquellos registros relacionados con el funcionamiento de los perifricos se describen en el apartado correspondiente al perifrico.

    Un listado de los Registro Especiales de los PIC 16F87X es el que se muestra en la siguiente tabla:

    Banco 0: Registros especiales del PIC 16F87X (1)

  • 24

    Banco 1: Registros especiales del PIC 16F87X (2)

  • 25

    Banco 2 y 3: Registros especiales del PIC 16F87X (3)

  • 26

    Direccionamiento Directo

    Para acceder una posicin de memoria mediante direccionamiento directo, la CPU simplemente usa la direccin indicada en los 7 bits menos significativos del cdigo de operacin y la seleccin de banco de los bits RP1:RP0 como se ilustra en la siguiente figura.

    Direccionamiento indirecto

    Este modo de direccionamiento permite acceder una localidad de memoria de datos usando una direccin de memoria variable a diferencia del direccionamiento directo, en que la direccin es fija. Esto puede ser til para el manejo de tablas de datos.

    El registro INDF. En la figura anterior se muestra la manera en que esto se realiza. Para hacer posible el direccionamiento indirecto se debe usar el registro INDF. Cualquier instruccin que haga un acceso al registro INDF en realidad accede a la direccin apuntada por el registro FSR (File Select Register).

    La seleccin de banco en el caso de direccionamiento indirecto se realiza mediante los bits IRP (STATUS) y el bit 7 del registro FSR, como se muestra en la figura anterior.

    El registro INDF mismo al leerse de manera indirecta (con FSR=0) producir un cero. Y al escribirse de manera indirecta no es afectado.

    A continuacin se muestra un ejemplo del uso de este direccionamiento para limpiar las localidades de la memoria RAM desde 20h a 2Fh.

    Ejemplo 3.

    Limpiar un bloque de memoria de datos desde la localidad 20h a la localidad 2Fh

    CLRF STATUS ;Selecciona Banco cero MOVLW 0X20 ;carga valor de apuntador a RAM MOVWF FSR ;inicializa apuntador

  • 27

    Sigue CLRF INDF ;limpia localidad apuntada por FSR INCF FSR,F ;incrementa apuntador

    BTFSS FSR,4 ;si ya termin escapa a continuar GOTO sigue ;si no repite

    Contina ...

    En el siguiente ejemplo se muestra la manera como se switchea mediante instrucciones dentro del programa de un banco a otro

    Ejemplo 4.

    Switcheo entre bancos de memoria RAM

    CLRF STATUS ;Limpia registro STATUS (Banco 0)

    BSF STATUS,5 ;RP0=1, (Banco 1)

    BSF STATUS,6 ;RP1=1, (Banco 3)

    BCF STATUS,5 ;RP0=0, (Banco 2)

  • 28

    El Archivo de Registros

    Aunque el archivo de registros en RAM puede variar de un PIC a otro, la familia del PIC16F87x coincide casi en su totalidad. En la siguiente figura se muestra a detalle el mapa de este archivo de registros y su organizacin en los cuatro bancos que ya se describieron.

    Cada uno de los registros de propsito especial, est asociado a un dispositivo interno del cc. En el siguiente captulo se tratar con detalle el uso de cada uno de estos dispositivos y de los registros asociados a l.

    2.8 Palabra de Configuracin (FUSES)

    Luego de hacer un programa es lgico que queramos grabarlo en nuestro PIC para poder probar su funcionamiento, para esto existen infinidad de grabadores y softwares que nos permiten hacer esta tarea. Una vez grabado el programa muchas veces nos damos con la sorpresa que no

  • 29

    funciona nuestra aplicacin y en muchos casos se debe a que no configuramos antes el software para grabar el PIC, y nos dicen que se trata de los FUSES, que debemos configurarlos.

    Bueno, los PIC's incluyen en una posicin reservada de memoria (2007H) la famosa Palabra de Configuracin y a la cual solo se accede durante la grabacin. El cmo configuremos este registro determinar las caractersticas de funcionamiento del PIC.

    Palabra de Configuracin:

    13 12 11 10 9 8 7 6 5 4 3 2 1 0 CP1 CP0 DEBUG - WRT CPD LVP BODEN CP1 CP0 #PWRTE WDTE FOSC1 FOSC0

    2.8.1 Configuracin de los Bits

    Los bits de la configuracin pueden ponerse a 0 o a 1 para seleccionar las distintas configuraciones del dispositivo, por lo que se puede seleccionar varias configuraciones del dispositivo. Estos bits se graban en la posicin de memoria situada en la direccin 2007h. Esta direccin de memoria est ms all de la memoria de programa de usuario. De hecho, pertenece al espacio de memoria de test/configuracin (2000h - 3FFFh), a la que solo puede accederse durante la programacin.

    bit 13-12: bit 5-4: CP1:CP0: Bits de proteccin del cdigo de la memoria Flash de programa(2)

    11 = Sin proteccin de cdigo 10 = 1F00h a 1FFFh cdigo protegido (PIC16F877, 876) 10 = 0F00h a 0FFFh cdigo protegido (PIC16F874, 873) 01 = 1000h a 1FFFh cdigo protegido (PIC16F877, 876) 01 = 0800h a 0FFFh cdigo protegido (PIC16F874, 873) 00 = 0000h a lFFFh cdigo protegido (PIC16F877, 876) 00 = 0000h a 0FFFh cdigo protegido (PIC16F8741873)

    bit 11: DEBUG: Modo In-Circuit Debugger 1 = Deshabilitado modo In-Circuit Debugger, RB6 y, RB7 sern patillas de entrda/salida 0 = Habilitado modo In-Circuit Debugger, RB6 y RB7 dedicadas al debugger

    bit 10: Sin implementar: En lectura es "1"

    bit 9: WRT: Habilita escritura en memoria Flash de programa 1 = Sin proteccin, se puede escribir con el control ECON. 0 = Sin proteccin, no se puede escribir con el control EECON

    bit 8: CPD: Proteccin de los datos de la memoria EEPROM 1 = Sin proteccin 0 = Datos de la EEPRON protegidos

    bit 7: LVP: Bit de habilitacin de programacin a bajo voltaje 1 = Patillas RB3/PGM tienen funciones PGM , bajo voltaje de programacin

    habilitado 0 = RB3 es digital I/O, HV habilitado, #MCLR se emplea para programacin

    bit 6: BODEN: Bit de habilitacin Brown-out Reset (1) 1 = BOR habilitado 0 = BOR deshabilitado

  • 30

    bit 3: PWRTE: Bit de habilitacin del temporizador Power-up (1) 1 = PWRT deshabilitado 0 = PWRT habilitado

    bit 2: WDTE: Bit de habilitacin Watchdog 1 = WDT habilitado 0 = WDT deshabilitado

    bit 1-0: FOSC1:FOSC0: Bit de seleccin del oscilador 11 = Oscilador RC 10 = Oscilador HS 01 = Oscilador XT 00 = Oscilador LP

    Nota (1)= Al habilitar el Brown-out Reset se habilita automticamente el temporizador Power-up

    (PWRT) .Habilitando el Power-up Timer se habilita al mismo tiempo el Brown-out Reset

    (2)= Los dos pares de bit CP1:CP0 tienen que tener el mismo valor para habilitar el esquema de la proteccin del cdigo listado.

    Descripcin de los bits

    CP1-CP0: Cdigo de proteccin de memoria de programa. Si no estn activos cualquiera puede leer nuestro progama que grabamos en la memoria. Se suele activar solo cuando tienes una aplicacin final que deseas vender y no quieres que lean t cdigo. DEBBUG: Modo Depurador en Circuito. Se usa cuando se tiene herramientas de Emulacin como el ICD2 que combinado con el MPLAB permiten Emular una aplicacin directamente en Hardware. WRT: Permiso para escritura en Modo FLASH. Se usa cuando en nuestro programa accedemos a la memoria de datos EEPROM. CPD: Cdigo de Proteccin de la memoria EEPROM de Datos. Es como nuestro password en caso de querer proteger esa parte de la memoria. LVP: Bit de Permiso para Programacin en Bajo Voltaje. Se usa con algunos modelos de PIC's

    sobretodo con los LF que trabajan con voltajes de 3V hasta 6V.

    BODEN: Bit de Permiso para el Reseteo por Cada de Tensin.

    #PWRTE: Bit de Permiso para el Timer de conexin de alimentacin. Se usa para resetear el PIC cada vez que se conecta la fuente de alimentacin de nuestra aplicacin.

    WDTE: Bit de Permiso del Timer del Perro Guardin. Se activa cuando se usa el Perro Guardin o WDT en nuestras aplicaciones, se ver ms adelante.

    FOSC1-FOSC0: Sirve para elegir el tipo de Xtal que usamos. LP (Baja potencia, de 35 a 200kHz), XT (Estndar, de 100kHz a 4MHz), HS (Alta Velocidad, ms de 4MHz), RC (Cuando usamos una Resistencia y un Condensador en vez de un Xtal).

    2.8.2. Establecimiento de la palabra de configuracin

    La palabra de configuracin se puede establecer de dos formas:

  • 31

    En el programa de grabacin, o En el cdigo de programa

    1. Desde el programa de grabacin. Por ejemplo en el WinPIC800 para el caso del PIC16F877A se configura de la siguiente forma:

    En el cdigo de programa. Es este caso se debe agregar una lnea de cdigo, con la Directiva de Ensamblador __CONFIG, como se indica a continuacin:

    ;resto del programa... Cdigo: [Descargar] [Ocultar] [Seleccionar] LIST P=16F877A INCLUDE __CONFIG _BODEN_OFF&_CP_OFF&_WRT_ENABLE_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC&_DEBUG_OFF&_CPD_OFF&_LVP_OFF

    de esta manera nos aseguramos de tener configurados los FUSES usemos el software que usemos (Ese cdigo hace lo mismo que la configuracin en WinPIC800 que mostramos arriba).

    A continuacin se muestra los bits de configuracin que se debe agregar al cdigo de programa:

    ;========================================================================== ; ; Configuration Bits ; ;==========================================================================

    _CP_ALL EQU H'0FCF' _CP_HALF EQU H'1FDF' _CP_UPPER_256 EQU H'2FEF' _CP_OFF EQU H'3FFF' _DEBUG_ON EQU H'37FF' _DEBUG_OFF EQU H'3FFF' _WRT_ENABLE_ON EQU H'3FFF' _WRT_ENABLE_OFF EQU H'3DFF' _CPD_ON EQU H'3EFF' _CPD_OFF EQU H'3FFF' _LVP_ON EQU H'3FFF' _LVP_OFF EQU H'3F7F' _BODEN_ON EQU H'3FFF' _BODEN_OFF EQU H'3FBF' _PWRTE_OFF EQU H'3FFF' _PWRTE_ON EQU H'3FF7' _WDT_ON EQU H'3FFF'

  • 32

    _WDT_OFF EQU H'3FFB' _LP_OSC EQU H'3FFC' _XT_OSC EQU H'3FFD' _HS_OSC EQU H'3FFE' _RC_OSC EQU H'3FFF'

    Algunos fuses que son comunes a todos los pics:

    WDT_ON Enable the internal Watchdog timer. WDT_OFF Disable the internal Watchdog timer. HS_OSC Use a High-speed crystal (Xtals over 4MHz). XT_OSC Use a standard crystal (4MHz or under). LP_OSC Use a low frequency crystal (KHz range). PWRTE_ON Enable power up timer. PWRTE_OFF Disable power up timer.

    Por ejemplo: Para configurar el microcontrolador 16F877, previamente se debe establecer la palabra de configuracin, como se muestra a continuacin.

    PROCESSOR 16F877 ;LIST P=16F877 INCLUDE "P16F877.INC" ;# INCLUDE "P16F877.INC"

    ;Setup of PIC configuration flags

    ;XT oscillator, OSC: XT ;Disable watch dog timer, WDT: OFF ;Enable power up timer, PWRTE: ON ;Disable code protect, CP: OFF

    __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

    2.9. Resumen de Directivas del Ensamblador MPASM ATE-Uniovi

    1. Directivas para carga o reserva en la Memoria de Programa

    DATA Inicializa una o ms palabras de la memoria de programa con datos o tiras de caracteres.

    DATA 0x012, 0x1345 DATA Prueba 1,2,3

    DA Almacena en paquetes de 14 bits dos caracteres ASCII representados con 7 bits.

    DA abcdef

    DB Reserva e inicializa bytes en la memoria de programa.

    DB T, 0xF0, S

    DW Reserva e inicializa palabras en la memoria de programa.

    DW 0x39, 0x45B

    DT Genera una serie de instrucciones RETLW, una por cada expresin que acompaa a la directiva.

  • 33

    DT 1, 2, 3, 5, 7

    DE Reserva y carga posiciones de la memoria de programa con bytes, en principio estaba pensada para rellenar la EEPROM de datos (empieza en la 0x2100), pero se puede emplear para cualquier posicin de memoria de programa ORG 0x2100.

    DE Programa version 1.0

    FILL Rellena un nmero de posiciones de memoria de programa con un mismo contenido (dato o instruccin si va entre parntesis).

    FILL 0x190F, 5

    RES Reserva un determinado nmero de posiciones de la memoria de programa (avanza el puntero de cuenta de posicin en la memoria de programa).

    RES 64

    _ _CONFIG Carga la palabra de configuracin del microcontrolador, previamente se debe haber declarado el microcontrolador.

    _ _CONFIG 0x3F43

    _ _IDLOCS Se emplea para cargar las 4 posiciones de identificacin del microcontrolador. Se debe haber declarado previamente el microcontrolador.

    _ _IDLOCS 1234

    2. Directivas de Control

    CBLOCK Se emplean para declarar inicio y final de un bloque de

    ENDC constantes. Se asignan valores correlativos.

    CBLOCK 0x20 A, B, C, D ;A = 0x20, B=0x21, C=0x22, D=0x23 ENDC

    CONSTANT Las dos se emplean para asignar expresiones a smbolos.

    EQU esos smbolos no pueden luego cambiar de valor (son constantes). Sintaxis distinta, pero igual efecto.

    CONSTANT longitud=0x10 longitud EQU 0x10

    VARIABLE Las dos se emplean para asignar expresiones a smbolos.

    SET esos smbolos pueden cambiar de valor (son variables). Sintaxis distinta, pero igual efecto.

  • 34

    VARIABLE BUFFER=0x20 BUFFER SET 0x20

    #DEFINE Se emplea para definir una etiqueta para una tira de caracteres siempre que aparezca la etiqueta, se sustituye directamente por la tira.

    #DEFINE bit_0 STATUS,RP0

    #UNDEFINE Anula una asignacin previa realizada con #DEFINE.

    #UNDEFINE bit_0

    ORG Sita el cdigo que se vaya generando despus a partir de la posicin especificada.

    ORG 0x100

    END Final de cdigo fuente.

    END

    INCLUDE Se incluye el fichero especificado, se inserta en la posicin y ser ensamblado.

    INCLUDE c:\mplab\PIC16F877.INC INCLUDE

    RADIX Se especifica el RADIX que se est usando.

    RADIX dec ;pueden ser hex oct

    PROCESSOR Define el tipo de microcontrolador.

    PROCESSOR 16F877

    Para controlar la generacin del fichero de listado (.LST):

    TITLE Ttulo en la cabecera de las pginas.

    SUBTITLE Subttulo (segunda lnea) en cabecera.

    SPACE Inserta lneas en blanco.

    PAGE Inserta salto de pgina.

    LIST Habilita listado y opciones del mismo.

    NOLIST Deshabilita generacin en fichero .LST

    MESSG Saca mensajes en el fichero .LST

    ERROR Tambin para sacar mensajes en .LST

  • 35

    ERRORLEVEL Especifica tipos de mensajes que aparecern en fichero.LST.

    ERRORLEVEL 0 ;Errores, warnings y mensajes ERRORLEVEL 1 ;Warnings y errores ERRORLEVEL 2 ;Errores

    3. Directivas de Ensamblado condicional

    IF expresin Grupo de directivas e instrucciones que se ensamblan si es cierta la expresin ENDIF

    p.e. IF versin==1 MOVLW 0x0A MOVWF PORTB ENDIF

    IF expresin ;Si la expresin es cierta ;Se ensambla este grupo Grupo 1 de Directivas e Instrucciones ELSE ;y si es falsa, este otro Grupo 2 de Directivas e Instrucciones ENDIF

    IFDEF etiqueta Puede sustituir en las dos directivas anteriores IF expresin Se ensambla si est definida la etiqueta #DEFINE DE_B_a_A 1 .

    p.e. IFDEF DE_B_a_A MOVF PORTB,w MOVWF PORTA ELSE MOVF PORTA,W MOVWF PORTB ENDIF

    IFNDEF etiqueta Puede sustituir en las dos directivas anteriores IF expresin Se ensambla si no est definida la etiqueta

    WHILE expresin Grupo de instrucciones y directivas que se ensamblan mientras la expresin sea cierta ENDW

    p.e. VARIABLE i i=0 WHILE i < CONTADOR RETLW i

  • 36

    i+=1 ENDW

    4. Macros

    Una macro es un conjunto de instrucciones que pueden ser insertadas en el cdigo fuente mediante una simple llamada a macro.

    Una macro debe ser definida primero antes de poder ser llamada en el cdigo fuente siguiente.

    Una macro puede llamar a otra macro o a s misma de manera recursiva

    Definicin de una macro: Etiqueta MACRO argumento1, arguento2, argumento3, Conjunto de Instrucciones

    EXITM (salida intermedia opcional) Ms instrucciones

    ENDM Utilizacin de una macro (llamada): Etiqueta_de_Macro arg1, arg2, arg3

    p.e. Definiciones: Banco_0 MACRO bcf STATUS,RP0 bcf STATUS,RP1 ENDM Banco_1 MACRO bsf STATUS,RP0 bcf STATUS,RP1 ENDM Utilizacin: movlw 0xF0 Banco_1 movwf TRISB Banco_0

    Para mayor informacin ver Anexo2 MPASM, el ensamblador de Microchip, o el arhivo mpasm2005.pdf.

  • 37

    2.10. Escritura y compilacin de un programa en assembler

    Como cualquier sistema a microprocesador, tambin para los PIC es necesario preparar un programa que le permita desarrollar su trabajo.

    Un programa est constituido por una lista de instrucciones en secuencia, cada una de las cuales identifican unvocamente las funciones de base que los PIC estn en grado de desarrollar. Cada instruccin est representada por un cdigo operativo ( en ingls operation code o ms brevemente opcode ) a 14 bit y es almacenada en una posicin de memoria EEPROM. Un ejemplo de opcode en anotacin binaria se muestra a continuacin:

    00 0001 0000 0000B

    Pero es muy probable que opcode venga representado en notacin hexadecimal, es decir:

    0100H

    Que representan exactamente el mismo valor pero en forma ms breve. La letra H al final del valor 0100, indica el tipo de notacin (hexadecimal). El mismo valor puede ser representado en assembler con la notacin 0x100 derivada del lenguaje C o H0100. Estos cdigos, completamente privados de sentido para un ser humano, son los nicos que el PIC estan en grado de entender.

    La primera convencin es aquella de asociar a cada opcode ( en total 35 para l PIC16F87x ) una sigla mnemnica es decir, una sigla que ayude a recordar el significado de la instruccin.

    Por ejemplo, el opcode 0100H corresponde a la instruccin mnemnica CLRW que es la forma breve de la instruccin CLEAR W REGISTER, es decir, encera el registro W.

    Otras convenciones permiten definir las variables, las constantes, las etiquetas (label) de referencia a las direcciones de memoria, etc. El conjunto de estas convenciones facilita la escritura de un programa para los PIC que viene implemento en lenguaje assembler. Un programa escrito en lenguaje assembler puede ser escrito en un PC utilizando cualquier procesador de palabra o editor en grado de generar archivos de tipo ASCII. Un archivo ASCII o, mejor dicho, un archivo de texto que contenga un programa en assembler es llamado source o fuente assembler.

    Una vez preparado el source assembler, es necesario un programa que traduzca las instrucciones mnemnicas y todas las otras formas convencionales con las cuales fue escrito el source en una serie de nmeros ( los opcode ) reconocibles directamente por el PIC. Este programa se llama compilador assembler o assemblador.

    En la figura siguiente viene esquematizado el flujo de operaciones y el archivo (file) que se genera para pasar de un source assembler a un PIC programado.

  • 38

    La primera operacin a efectuar es escribir el sourse assembler y su almacenamiento en un archivo ( file ) de texto con extensin .ASM. Para hacer esto es necesario utilizar un editor ASCII, es decir, un programa de escritura como por ejemplo el NOTEPAD.EXE de Windows o el EDIT.EXE de MS/DOS. Es posible generar este archivo tambin con programas de elaboracin de texto como Word, teniendo el cuidado de almacenar siempre el archivo producido en formato texto y no en formato nativo. Esto para evitar que se almacenen los caracteres de control de formateo del texto que el compilador assembler no est en grado de tratar.

    El paso sucesivo es la compilacin del source, es decir, la transformacin en opcode de los cdigos mnemnicos o instrucciones assembler en los contenidos.

    El compilador assembler que se utilizar es el MPASMWIN.EXE producido por Microchip y disponible en el site internet de Microchip (http://www.microchip.com).

    Adems, del source con extensin .ASM es necesario entregar al compilador un segundo archivo producido por Microchip con extensin .INC diferente segn el tipo de PIC que se est

  • 39

    utilizando, este source contiene algunas definiciones dependientes del chip utilizado. En este caso el archivo es el P16F877.INC que se muestra a continuacin.

    LIST ; P16F877.INC Standard Header File, Version 1.00 Microchip Technology, Inc. NOLIST

    ; This header file defines configurations, registers, and other useful bits of ; information for the PIC16F877 microcontroller. These names are taken to match ; the data sheets as closely as possible.

    ; Note that the processor must be selected before this file is ; included. The processor may be selected the following ways:

    ; 1. Command line switch: ; C:\ MPASM MYFILE.ASM /PIC16F877 ; 2. LIST directive in the source file ; LIST P=PIC16F877 ; 3. Processor Type entry in the MPASM full-screen interface

    ;========================================================================== ; ; Revision History ; ;==========================================================================

    ;Rev: Date: Reason:

    ;1.12 01/12/00 Changed some bit names, a register name, configuration bits ; to match datasheet (DS30292B) ;1.00 08/07/98 Initial Release

    ;========================================================================== ; ; Verify Processor ; ;==========================================================================

    IFNDEF __16F877 MESSG "Processor-header file mismatch. Verify selected processor." ENDIF

    ;========================================================================== ; ; Register Definitions ; ;==========================================================================

    W EQU H'0000' F EQU H'0001'

    ;----- Register Files------------------------------------------------------

    INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' PORTA EQU H'0005' PORTB EQU H'0006' PORTC EQU H'0007' PORTD EQU H'0008' PORTE EQU H'0009' PCLATH EQU H'000A' INTCON EQU H'000B' PIR1 EQU H'000C' PIR2 EQU H'000D'

  • 40

    TMR1L EQU H'000E' TMR1H EQU H'000F' T1CON EQU H'0010' TMR2 EQU H'0011' T2CON EQU H'0012' SSPBUF EQU H'0013' SSPCON EQU H'0014' CCPR1L EQU H'0015' CCPR1H EQU H'0016' CCP1CON EQU H'0017' RCSTA EQU H'0018' TXREG EQU H'0019' RCREG EQU H'001A' CCPR2L EQU H'001B' CCPR2H EQU H'001C' CCP2CON EQU H'001D' ADRESH EQU H'001E' ADCON0 EQU H'001F'

    OPTION_REG EQU H'0081' TRISA EQU H'0085' TRISB EQU H'0086' TRISC EQU H'0087' TRISD EQU H'0088' TRISE EQU H'0089' PIE1 EQU H'008C' PIE2 EQU H'008D' PCON EQU H'008E' SSPCON2 EQU H'0091' PR2 EQU H'0092' SSPADD EQU H'0093' SSPSTAT EQU H'0094' TXSTA EQU H'0098' SPBRG EQU H'0099' ADRESL EQU H'009E' ADCON1 EQU H'009F'

    EEDATA EQU H'010C' EEADR EQU H'010D' EEDATH EQU H'010E' EEADRH EQU H'010F'

    EECON1 EQU H'018C' EECON2 EQU H'018D'

    ;----- STATUS Bits --------------------------------------------------------

    IRP EQU H'0007' RP1 EQU H'0006' RP0 EQU H'0005' NOT_TO EQU H'0004' NOT_PD EQU H'0003' Z EQU H'0002' DC EQU H'0001' C EQU H'0000'

    ;----- INTCON Bits --------------------------------------------------------

    GIE EQU H'0007' PEIE EQU H'0006' T0IE EQU H'0005' INTE EQU H'0004' RBIE EQU H'0003' T0IF EQU H'0002' INTF EQU H'0001' RBIF EQU H'0000'

    ;----- PIR1 Bits ----------------------------------------------------------

  • 41

    PSPIF EQU H'0007' ADIF EQU H'0006' RCIF EQU H'0005' TXIF EQU H'0004' SSPIF EQU H'0003' CCP1IF EQU H'0002' TMR2IF EQU H'0001' TMR1IF EQU H'0000'

    ;----- PIR2 Bits ----------------------------------------------------------

    EEIF EQU H'0004' BCLIF EQU H'0003' CCP2IF EQU H'0000'

    ;----- T1CON Bits ---------------------------------------------------------

    T1CKPS1 EQU H'0005' T1CKPS0 EQU H'0004' T1OSCEN EQU H'0003' NOT_T1SYNC EQU H'0002' T1INSYNC EQU H'0002' ; Backward compatibility only T1SYNC EQU H'0002' TMR1CS EQU H'0001' TMR1ON EQU H'0000'

    ;----- T2CON Bits ---------------------------------------------------------

    TOUTPS3 EQU H'0006' TOUTPS2 EQU H'0005' TOUTPS1 EQU H'0004' TOUTPS0 EQU H'0003' TMR2ON EQU H'0002' T2CKPS1 EQU H'0001' T2CKPS0 EQU H'0000'

    ;----- SSPCON Bits --------------------------------------------------------

    WCOL EQU H'0007' SSPOV EQU H'0006' SSPEN EQU H'0005' CKP EQU H'0004' SSPM3 EQU H'0003' SSPM2 EQU H'0002' SSPM1 EQU H'0001' SSPM0 EQU H'0000'

    ;----- CCP1CON Bits -------------------------------------------------------

    CCP1X EQU H'0005' CCP1Y EQU H'0004' CCP1M3 EQU H'0003' CCP1M2 EQU H'0002' CCP1M1 EQU H'0001' CCP1M0 EQU H'0000'

    ;----- RCSTA Bits ---------------------------------------------------------

    SPEN EQU H'0007' RX9 EQU H'0006' RC9 EQU H'0006' ; Backward compatibility only NOT_RC8 EQU H'0006' ; Backward compatibility only RC8_9 EQU H'0006' ; Backward compatibility only SREN EQU H'0005' CREN EQU H'0004' ADDEN EQU H'0003' FERR EQU H'0002' OERR EQU H'0001' RX9D EQU H'0000'

  • 42

    RCD8 EQU H'0000' ; Backward compatibility only

    ;----- CCP2CON Bits -------------------------------------------------------

    CCP2X EQU H'0005' CCP2Y EQU H'0004' CCP2M3 EQU H'0003' CCP2M2 EQU H'0002' CCP2M1 EQU H'0001' CCP2M0 EQU H'0000'

    ;----- ADCON0 Bits --------------------------------------------------------

    ADCS1 EQU H'0007' ADCS0 EQU H'0006' CHS2 EQU H'0005' CHS1 EQU H'0004' CHS0 EQU H'0003' GO EQU H'0002' NOT_DONE EQU H'0002' GO_DONE EQU H'0002' ADON EQU H'0000'

    ;----- OPTION_REG Bits -----------------------------------------------------

    NOT_RBPU EQU H'0007' INTEDG EQU H'0006' T0CS EQU H'0005' T0SE EQU H'0004' PSA EQU H'0003' PS2 EQU H'0002' PS1 EQU H'0001' PS0 EQU H'0000'

    ;----- TRISE Bits ---------------------------------------------------------

    IBF EQU H'0007' OBF EQU H'0006' IBOV EQU H'0005' PSPMODE EQU H'0004' TRISE2 EQU H'0002' TRISE1 EQU H'0001' TRISE0 EQU H'0000'

    ;----- PIE1 Bits ----------------------------------------------------------

    PSPIE EQU H'0007' ADIE EQU H'0006' RCIE EQU H'0005' TXIE EQU H'0004' SSPIE EQU H'0003' CCP1IE EQU H'0002' TMR2IE EQU H'0001' TMR1IE EQU H'0000'

    ;----- PIE2 Bits ----------------------------------------------------------

    EEIE EQU H'0004' BCLIE EQU H'0003' CCP2IE EQU H'0000'

    ;----- PCON Bits ----------------------------------------------------------

    NOT_POR EQU H'0001' NOT_BO EQU H'0000' NOT_BOR EQU H'0000'

    ;----- SSPCON2 Bits --------------------------------------------------------

  • 43

    GCEN EQU H'0007' ACKSTAT EQU H'0006' ACKDT EQU H'0005' ACKEN EQU H'0004' RCEN EQU H'0003' PEN EQU H'0002' RSEN EQU H'0001' SEN EQU H'0000'

    ;----- SSPSTAT Bits -------------------------------------------------------

    SMP EQU H'0007' CKE EQU H'0006' D EQU H'0005' I2C_DATA EQU H'0005' NOT_A EQU H'0005' NOT_ADDRESS EQU H'0005' D_A EQU H'0005' DATA_ADDRESS EQU H'0005' P EQU H'0004' I2C_STOP EQU H'0004' S EQU H'0003' I2C_START EQU H'0003' R EQU H'0002' I2C_READ EQU H'0002' NOT_W EQU H'0002' NOT_WRITE EQU H'0002' R_W EQU H'0002' READ_WRITE EQU H'0002' UA EQU H'0001' BF EQU H'0000'

    ;----- TXSTA Bits ---------------------------------------------------------

    CSRC EQU H'0007' TX9 EQU H'0006' NOT_TX8 EQU H'0006' ; Backward compatibility only TX8_9 EQU H'0006' ; Backward compatibility only TXEN EQU H'0005' SYNC EQU H'0004' BRGH EQU H'0002' TRMT EQU H'0001' TX9D EQU H'0000' TXD8 EQU H'0000' ; Backward compatibility only

    ;----- ADCON1 Bits --------------------------------------------------------

    ADFM EQU H'0007' PCFG3 EQU H'0003' PCFG2 EQU H'0002' PCFG1 EQU H'0001' PCFG0 EQU H'0000'

    ;----- EECON1 Bits --------------------------------------------------------

    EEPGD EQU H'0007' WRERR EQU H'0003' WREN EQU H'0002' WR EQU H'0001' RD EQU H'0000'

    ;========================================================================== ; ; RAM Definition ; ;==========================================================================

    __MAXRAM H'1FF' __BADRAM H'8F'-H'90', H'95'-H'97', H'9A'-H'9D'

  • 44

    __BADRAM H'105', H'107'-H'109' __BADRAM H'185', H'187'-H'189', H'18E'-H'18F'

    ;========================================================================== ; ; Configuration Bits ; ;==========================================================================

    _CP_ALL EQU H'0FCF' _CP_HALF EQU H'1FDF' _CP_UPPER_256 EQU H'2FEF' _CP_OFF EQU H'3FFF' _DEBUG_ON EQU H'37FF' _DEBUG_OFF EQU H'3FFF' _WRT_ENABLE_ON EQU H'3FFF' _WRT_ENABLE_OFF EQU H'3DFF' _CPD_ON EQU H'3EFF' _CPD_OFF EQU H'3FFF' _LVP_ON EQU H'3FFF' _LVP_OFF EQU H'3F7F' _BODEN_ON EQU H'3FFF' _BODEN_OFF EQU H'3FBF' _PWRTE_OFF EQU H'3FFF' _PWRTE_ON EQU H'3FF7' _WDT_ON EQU H'3FFF' _WDT_OFF EQU H'3FFB' _LP_OSC EQU H'3FFC' _XT_OSC EQU H'3FFD' _HS_OSC EQU H'3FFE' _RC_OSC EQU H'3FFF'

    LIST

    Durante la compilacin del source, el compilador assembler genera una serie de archivos con nombre idntico a la source pero con extensin distinta:

    .HEX es el archivo que contiene los cdigos operativos para enviar al PIC a travs del programador.

    .LST es un archivo de texto el cual contiene todo el source assembler y la correspondiente traduccin en opcode. No es utilizable para la programacin del PIC pero es extremadamente til para verificar los procesos de compilacin realizados por el compilador.

    .ERR contiene la lista de los errores de compilacin encontrados y el nmero de lnea en el interno del source assembler en la cual se encontraron.

    Los archivos .LST y .ERR vienen utilizados para el control de lo realizado en la compilacin. Solo el archivo .HEX viene utilizado realmente para programar el PIC.

    El archivo .HEX no es un archivo en formato binario y no corresponden directamente al contenido que deber tener la FLASH del PIC. Pero su formato si corresponde directamente a cuanto ser transferido al PIC en forma legible y con unas instrucciones de ms.

    2.11. ANLISIS DE UN PROBLEMA SENCILLO

    Como ejemplo orientativo, se hace a continuacin el desarrollo de un programa sencillo. Se trata de obtener la nota media de un alumno durante un trimestre. El anlisis de esta tarea, que la hemos llamado MEDIA, puede dar el siguiente procedimiento:

  • 45

    1. leer NOMBRE 2. leer NOTA 3. no hay mas notas, ir al punto 5 4. ir al punto 2 5. calcular la MEDIA 6. imprimir NOMBRE 7. imprimir MEDIA

    DIAGRAMA DE FLUJO DEL EJEMPLO MEDIA

    2.12. Ejemplo. Construccin de un simple secuenciador a LED

    Realizar un circuito para hacer encender en forma secuencial un diodo LED, cuya frecuencia de intermitencia es determinada por una subrutina que introduce un retardo software, es decir, un retardo basado en el tiempo de ejecucin de un ciclo continuo de instrucciones.

    El circuito a ser realizado se presenta a continuacin:

  • 46

    El cdigo de este ejemplo est disponible en LED.ASM y se muestra a continuacin:

    ;************************************************** ; Pic by example ; LED.ASM ; ; (c) 1999, Sergio Tanzilli ; ([email protected]) ; http://www.picpoint.com ;**************************************************

    PROCESSOR 16F877 ;LIST P=16F877 RADIX DEC INCLUDE "P16F877.INC" ;# INCLUDE "P16F877.INC"

    ;Setup of PIC configuration flags

    ;XT oscillator, OSC: XT ;Disable watch dog timer, WDT: OFF ;Enable power up timer, PWRTE: ON ;Disable code protect, CP: OFF

    __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

    LED EQU 0

    ORG 20H

    Count RES 2

    ;Reset Vector ;Start point at CPU reset

    ;ORG 00H ;Versiones anteriores a V8.0

    bsf STATUS,RP0 bcf STATUS,RP1

    movlw 11111110B movwf TRISB

    bcf STATUS,RP0

    bsf PORTB,LED

    MainLoop

    call Delay

  • 47

    btfsc PORTB,LED goto SetToZero

    bsf PORTB,LED goto MainLoop

    SetToZero

    bcf PORTB,LED goto MainLoop

    ;Subroutines

    ;Software delay

    Delay clrf Count clrf Count+1

    DelayLoop

    decfsz Count,1 goto DelayLoop

    decfsz Count+1,1 goto DelayLoop

    return

    END

    2.12.1. Anlisis del cdigo LED.ASM

    Se va analizar lnea por lnea el contenido del source LED.ASM, desde de la primera lnea de cdigo.

    o PROCESSOR es una directiva del compilador assembler que permite definir para cul microprocesador se escribi el source. Las directivas no son instrucciones mnemnicas que el compilador traduce en el respectivo opcode, pero si, simples indicaciones que se entrega al compilador para determinar el funcionamiento durante la compilacin. En este caso se debe informar al compilador que las instrucciones entregadas al source son las relativas a un PIC16F877:

    PROCESSOR 16F877

    Las directivas del compilador tienen sentido solo durante la compilacin del source, por lo tanto un PIC no podr nunca seguir una directiva.

    o La directiva RADIX sirve para informar al compilador que los nmeros reportados sin notacin, deben entenderse como nmeros decimales. Es decir, si se quiere especificar, por ejemplo el nmero hexadecimal 10 (16 decimal) no se puede escribir solamente 10, porque sera interpretado como 10 decimal, pero s 10H o tambin, 0x10 o tambin, H10.

    RADIX DEC

  • 48

    o INCLUDE es otra directiva que indica al compilador incluir en el source un segundo archivo (file) denoninado P16F877.IN. El compilador se limitar a sustituir la lnea que contiene la directiva INCLUDE con el contenido del archivo indicado y a efectuar por lo tanto la compilacin como si fuera tambin parte del source.

    INCLUDE "P16F877.INC"

    o La directiva EQU es muy importante porque permite definir las constantes simblicas al interno del source. En particular la palabra LED de ahora en adelante en el source ser equivalente al valor 0. La finalidad principal de la existencia de la directiva EQU es la de poder hacer los source ms legibles y de permitir cambiar los valores constantes en un nico punto del source.

    LED EQU 0

    Es importante notar que la palabra LED no identifica una variable, es simplemente un nombre simblico vlido durante la compilacin. No ser por lo tanto, posible introducir instrucciones tipo LED = 3 al interno del source, ya que la asignacin dinmica de un valor a una variable es una operacin que requiere la intervencin de la CPU del PIC y por lo tanto debe ser expresada con instrucciones y no con directivas.

    o ORG es una directiva que permite definir la direccin para la cual se quiere que el compilador empiece a localizar los datos o las instrucciones siguientes. En este caso, se define un rea de datos al interno del PIC, es decir, un rea en la cual almacenar variables y contadores durante la ejecucin del programa. Esta rea coincide con el rea RAM del PIC definida por Microchip como el rea de los FILE REGISTER.

    ORG 20H

    Los file register son localizaciones RAM disponibles por el usuario a partir de la direccin 20H para el PIC16F877. Esta direccin de inicio es fija y no puede ser cambiada respecto a las localizaciones precedentes que son ocupadas por otros registros especializados para uso interno.

    o Count es una label (etiqueta) y RES es una directiva:

    - La directiva RES indica al compilador que se quiere reservar un cierto nmero de byte o mejor de file register al interno del rea de datos; en este caso 2 byte.

    - La label Count es una marca que en el resto del source asumir el valor de la direccin en la cual fue colocado, donde Count es un nombre escogido por el programador.

    Dado que se haba definido la direccin de partida como 20H con la directiva ORG, Count valdr 20H. Si por ejemplo, se inserta una label tambin en la lnea sucesiva esta valdr 20H + 2 (dos son los byte que se reserv), es decir 22H.

    Los nombres de las label (etiquetas) pueden ser cualquiera a excepcin de las palabras reservadas al compilador (tales como las instrucciones mnemnicas y las directivas).

    Una label se distingue de una constante simblica porque su valor viene colocado en fase de compilacin y no asignado por el programador estticamente.

  • 49

    Count RES 2

    o ORG es una segunda directiva que hace referencia a una direccin en el rea de programa (en la EEPROM) y no en el rea de datos. A partir de este punto, se empieza a insertar las instrucciones mnemnicas que el compilador deber convertir en las oportunas opcode para el PIC.

    ORG 00H

    El primer opcode seguido por el PIC despus del reset es el almacenado en la localizacin 0, correspondiente al valor 00H insertado en la ORG.

    o bsf es la primera instruccin mnemnica completa con parmetros, en este caso la instruccin mnemnica bsf significa BIT SET FILE REGISTER es decir, pone un 1 (condicin lgica alta) uno de los bit contenidos en la localizacin de la RAM especificada.

    o bcf en este caso la instruccin mnemnica bcf significa BIT CREAR FILE REGISTER es decir, pone un 0 (condicin lgica baja) uno de los bit contenidos en la localizacin de la RAM especificada.

    - STATUS es el parmetro que viene definido en el file P16F877.INC, a travs de una directiva EQU. El valor asignado a este file es 03H y corresponde a un file register (es decir, una localizacin RAM en el rea de datos) reservado.

    - RPO y RP1 son parmetros que tambin vienen definidos en el file P17F877.INC con los valores 05H y 06H, que corresponden al nmero del bit que se quiere poner en 1 y 0, respectivamente. Cada file register tiene una longitud de 8 bit y la numeracin de cada uno parte de 0 (bit menos significativo) hasta llegar a 7 (bit ms significativo).

    Las siguientes instrucciones coloca un 1 en el quinto bit y un 0 en el sexto bit del file register STATUS, siendo esta operacin necesaria para acceder a los file register TRISA y TRISB, que se encuentran en el banco 1 de la memoria de datos:

    bsf STATUS, RP0 bcf STATUS, RP1

    o Si se desea utilizar el puerto A del PIC, se hara movlw esta instruccin significa: MOVE LITERAL TO W REGISTER, es decir mueva un valor constante al acumulador. En este caso el valor constante de almacenar en el acumulador es 00111110B, es decir, un valor binario de 8 bit donde el bit ms a la derecha representa el bit 0 o el bit menos significativo.

    movlw 00111110B

    Luego con la instruccin movwf que significa: MOVE W TO FILE REGISTER, es decir mueva el valor del acumulador al registro. En este caso transfiere el valor contenido en el acumulador (inicializado oportunamente con la instruccin movlw 00111110B) al registro TRISA.

    movwf TRISA

  • 50

    - TRISA es un registro que tambin es definido a travs de una directiva EQU, cuya funcin es definir el funcionamiento de cada lnea de I/O del puerto A. En particular cada bit con 1 del registro TRISA determina un ingreso en la respectiva lnea de la puerta A mientras cada 0 determina una salida.

    En la siguiente tabla viene reportada la configuracin que asumirn los pines del PIC despus de la ejecucin de esta instruccin:

    N.bit registro TRISA Lnea puerto A N.Pin Valor Estado

    0 RA0 2 0 Output

    1 RA1 3 1 Input

    2 RA2 4 1 Input

    3 RA3 5 1 Input

    4 RA4 6 1 Input

    5 RA5 7 1 Input

    6 - - 0 -

    7 - - 0 -

    Como es posible ver los bits 6 y 7 no corresponden a ninguna lnea de I/O por lo tanto su valor no tiene ninguna importancia.

    o Las dos instrucciones siguientes realizan las mismas funciones para el puerto B del PIC, por lo tanto la instruccin

    movlw B'11111110' movwf TRISB

    En este caso la definicin de las lneas ser la siguiente:

    N.bit registro TRISB Lnea puerto B N.Pin Valor Estato

    0 RB0 33 0 Output

    1 RB1 34 1 Input

    2 RB2 35 1 Input

    3 RB3 36 1 Input

    4 RB4 37 1 Input

    5 RB5 38 1 Input

    6 RB6 39 1 Input

  • 51

    7 RB7 40 1 Input

    Ntese como el valor 0 en el bit 0 del registro TRISB determina la configuracin en la salida de la respectiva lnea del PIC. En la aplicacin actual esta lnea viene utilizada para activar el LED que va a prender y apagar.

    o bcf esta instruccin significa BIT CLEAR FILE REGISTER, es decir, encera el bit indicado por el parmetro. Del punto de vista funcional esta instruccin se escogi para tener el acceso a los registros internos del banco 0 en vez de los registros internos del banco 1 de los cuales hacen parte TRISA Y TRISB.

    bcf STATUS, RP0

    o bsf esta instruccin significa BIT SET FILE REGISTER, es decir, setea el bit indicado por el parmetro. En este caso se tiene acceso al LED conectado a la lnea RB0 para ponerle a 1.

    - PORTB es una constante definida en P16F877.INC y permite referenciar el file register correspondiente a las lneas I/O del puerto B.

    - LED es el nmero de la lnea que debe poner en 1. Si recordamos bien, al inicio del sourse la constante LED est definida igual 0, por lo tanto, la lnea interesada ser RB0.

    bsf PORTB, LED

    o MainLoop es una label o mejor una referencia simblica hacia una direccin de memoria. El valor de la label se calcula en fase de compilacin en base al nmero de instrucciones, a las directivas ORG y a las otras instrucciones que de alguna manera ocupan espacio en la memoria del PIC. En este caso, se cuentan las instrucciones a partir de la ltima directiva ORG, y el valor que ser asignado a MainLoop es 08H.

    En realidad el valor que asumen las label no tiene mucha importancia, puesto que su finalidad es de evitar conocer la posicin precisa de los opcode en la memoria del PIC, permitiendo de todas maneras diferenciar una determinada posicin de memoria.

    En este caso la label MainLoop viene utilizada como punto de inicio de un ciclo (de ingles loop) de encendido y de apagado del LED, es decir, una parte de cdigo que vendr repetida cclicamente al infinito. Por lo tanto, ms adelante se encontrar una referencia a esta label.

    MainLoop

    o call Esta instruccin determina una llamada (del ingles call ) y una subrutina que empieza en correspondencia con la label Delay.

    Las subrutinas son de las partes del programa especializadas para efectuar una funcin especfica. Cada vez que sea necesaria esta funcin es suficiente llamarla con una sola instruccin, en vez de repetir cada vez todas las instrucciones necesarias para efectuarla. En este caso la subrutina introduce un retardo igual al tiempo de encendido y apagado del LED.

    Las instrucciones que componen la subrutina Delay son explicadas mas adelante.

  • 52

    call Delay

    o btfsc el significado de esta instruccin es BIT TEST FLAG, SKIP IF CLEAR, es decir, controla el estado de un bit interno de un registro y salta a la instruccin sucesiva si el valor de tal bit es cero. En este caso, el bit a controlar corresponde a la lnea de output (salida) a que esta conectado el LED, por medio de este test se puede determinar por lo tanto si el LED esta iluminado o apagado e intervenir, es decir, si el LED esta iluminado se apagar, si esta apagado se prender.

    btfsc PORTB,LED

    o goto esta instruccin es un salto incondicional ( del ingles GO TO, ir ) a la etiqueta SetToZero donde se encontrar las instrucciones para apagar el LED. Esta instruccin vendr saltada de la instruccin sucesiva si el LED esta ya apagado.

    goto SetToZero

    o Las dos siguientes instrucciones apagan el LED y reenvan el programa al inicio del ciclo de prendido y apagado.

    bsf PORTB,LED goto MainLoop

    o Las dos siguientes instrucciones simplemente apagan el LED y reenvan el programa al inicio del ciclo de prendido y apagado.

    SetToZero bcf PORTB,LED goto MainLoop

    La subrutina Delay

    Esta subrutina introduce un retardo de alrededor de un segundo y puede ser llamada todas las veces en la sourse, a travs de la instruccin call Delay.

    En la prctica el retardo viene obtenido siguiendo miles de instrucciones que no hacen nada. Este tipo de retardo se llama retardo software o retardo a programa. Es el tipo de retardo ms simple de implementar y puede ser utilizado cuando no se necesita que el PIC haga otras tareas mientras adelanta el retardo.

    A continuacin se ver el funcionamiento:

    Delay clrf Count clrf Count+1 DelayLoop decfsz Count,1 goto DelayLoop decfsz Count+1,1 goto DelayLoop retlw 0

    END

  • 53

    Delay y DelayLoop son dos etiquetas. Delay identifica la direccin de inicio de la subrutina y viene utilizado para las llamadas del cuerpo principal del programa. DelayLoop viene llamado internamente de la subrutina y sirve como punto de ingreso para el ciclo ( del ingls loop ) de retardo.

    Las instrucciones:

    clrf Count clrf Count+1

    CLEAR FILE REGISTER enceran los dos sitios de RAM reservados anteriormente con la instruccin:

    Count RES 2

    Estos dos lugares son adyacentes a partir de la direccin referenciada por la label Count.

    decfsz Count, 1

    La instruccin significa DECREMENT FILE REGISTER, SKIP IF ZERO, es decir, decrementar el contenido de un registro ( en este caso Count y saltar a la instruccin siguiente si el valor alcanzado es cero ). Si el valor alcanzado no es cero viene ejecutada la instruccin siguiente:

    goto DelayLoop

    Qu ordena la ejecucin desde el principio del ciclo de retardo. Una vez alcanzado el cero con el contador Count se ejecutan las intrucciones:

    decfsz Count+1,1 goto DelayLoop

    Qu decrecen el registro siguiente hasta que ste tambin alcance el cero. El registro Count + 1 en particular sar decrementado de uno cada 256 decrementos de Count.

    Cuando tambin Count + 1 alcance el cero la instruccin:

    return

    Cuyo significado es RETURN FROM SUBROUTINE que determinara la salida de la rutina de retardo y la continuacin de la ejecucin de la instruccin sucesiva la call Delay.

    Para terminar END es una directiva que indica al compilador el final del source assembler.

    2.13. Compilacin de un source assembler

    La compilacin de un sourse assembler se realiza con los siguientes pasos:

    1. Por una sola vez se debe crear en el disco duro un directorio de trabajo en el cual de ahora en adelante se almacena todos los sourse, por ejemplo el nombre puede ser:

    C:\PICPRG

  • 54

    Luego copiar en el directorio de trabajo C:\PICPRO el archivo LED.ASM.

    2. Instalar el software necesario para compilar los sources, en este caso el paquete de Microchip que est disponible la direccin: http://www.microchip.com.

    3. Ejecutar desde la barra de inicio el programa MPASM, en el cual se configura el tipo de PIC a ser compilado.

    4. Compilar el sourse LED.ASM desde el programa MPASM.EXE.

    Si no existe ningn error se debe tener los siguientes archivos nuevos:

    LED.HEX LED.LST LED.ERR LED.COD

    2.14. Programar el PIC

    Para programar el PIC se utiliza solo el archivo LED.HEX que contiene el archivo compilado en formato Intel Hex 8.

    La programacin de los chips se puede realizar con cualquier programador, por lo que se recomienda hacer referencia a la respectiva documentacin.

    2.15. Ejemplo. Realizar el "secuenciador de luces"

    Modificar el LED.ASM para realizar un secuenciador a cuatro led. El nuevo sourse modificado se llamar SEQ.ASM.

    El circuito elctrico del nuevo circuito, prcticamente es igual al circuito presentado en el ejemplo LED.ASM, con la nica variante que ahora lo diodos led conectados son cuatro, en vez de uno. El circuito a ser implementado se presenta a continuacin:

    El cdigo de este ejemplo est disponible en SEQ.ASM y se muestra a continuacin:

  • 55

    ;************************************************** ; Pic by example ; SEQ.ASM ; ; (c) 1999, Sergio Tanzilli ([email protected]) ; http://www.picpoint.com/picbyexample/index.htm ;**************************************************

    PROCESSOR 16F877 RADIX DEC INCLUDE "P16F877.INC"

    ;Setup of PIC configuration flags

    ;XT oscillator ;Disable watch dog timer ;Enable power up timer ;Disable code protect

    __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

    ORG 20H

    Count RES 2 Shift RES 1

    ;Reset Vector ;Program start point at CPU reset

    ;ORG 00H

    bsf STATUS,RP0 bcf STATUS,RP1

    movlw 11110000B movwf TRISB

    bcf STATUS,RP0

    movlw 00000001B movwf Shift

    MainLoop

    movf Shift,W movwf PORTB

    bcf STATUS,C rlf Shift,F

    btfsc Shift,4 swapf Shift,F

    call Delay

    goto MainLoop

    ; Subroutines

    Delay clrf Count

  • 56

    clrf Count+1

    DelayLoop

    decfsz Count,1 goto DelayLoop

    decfsz Count+1,1 goto DelayLoop

    return

    END

    2.15.1. Anlisis del cdigo SEQ.ASM

    Las lneas de I/O utilizadas son RB0 para el primer led, RB1 para el segundo, RB2 para el tercero y RB3 para el cuarto. Estos sern por lo tanto configurados como salidas al inicio del programa:

    movlw 11110000B movwf TRISB

    los bit menos significativo correspondientes a las lneas RB0,1,2,3 son puestos en cero para definir las lneas de salida.

    En el rea de memoria del REGISTER FILE (que en el sourse inicia con la directiva ORG 20H ), adems, a los dos byte referenciados por la etiqueta Cout, les se reserva un byte con label Shif que se utiliz para determinar la secuencia de encendido del led. La directiva a introducir es:

    Shift RES 1

    Antes de ejecutar el ciclo principal ( label MainLoop ) se inicializa el nuevo registro Shift a 00000001B con las siguientes instrucciones:

    movlw 00000001B movwf Shift

    En este punto, en el ciclo principal del programa transfiere el valor almacenado en el registro Shift al puerto B, obteniendo el encendido del primer led, con las siguientes instrucciones:

    movf Shift, W movwf PORTB

    luego efectuar el Shift a la izquierda del valor contenido en Shift, con las siguientes instrucciones:

    bcf STATUS, C rlf Shift, F

    La primera instruccin sirve para poner en cero el bit CARRY del REGISTRO DE ESTADO. La instruccin RLF Rotate Left F through Carry ( gira a la izquierda a travs del bit carry ) corre un bit a la izquierda el valor almacenado en el registro Shift introduciendo en la posicin ocupada

  • 57

    por el bit 0 el valor del bit de Carry. Para lograr que el bit introducido sea siempre cero debe ejecutarse antes de la RLF la instruccin BCF STATUS, C para encerar este bit.

    En este punto el registro Shift valdr 00000010B, por lo tanto, en el ciclo sucesivo, una vez transferido tal valor al puerto B se obtendr el off del LED1 y el on del LED2 y as sucesivamente para los ciclos siguientes.

    Cuando el bit 4 de Shift valga 1, los cuatro se han encendido al menos una vez y es necesario empezar de nuevo del LED1. Las siguientes instrucciones desarrollan este tipo de control :

    btfsc Shift, 4 swapf Shift, F

    La instruccin BTFSC Shift, 4 controla si