Está en la página 1de 59

I.P.E.T.

Juan XXIII

Computadoras Electrnicas
Gustavo A. Yarce

Paran - Entre Ros 2011

Gustavo A. Yarce

ndice general
1. Microcontroladores 1.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Estructura de un microcontrolador . . . . . . . . . . . . . . . . . 2. El PIC16f873 2.1. Estructura 2.2. El reloj . . 2.3. Osciladores 2.4. Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 10 13 13 15 16 17 19 19 20 20 22 23 24 24 26 26 27 29 31 31 34 36 37 37 38

3. Estructura de la memoria 3.1. Memoria de Programa . . . 3.2. Memoria de Datos(RAM) . . 3.3. Registros Especcos - El PC 3.3.1. La pila . . . . . . . . 3.4. Direccionamiento . . . . . . 3.5. Los Puertos del PIC . . . . . 3.6. Puerto A . . . . . . . . . . . 3.7. Puerto B . . . . . . . . . . . 3.8. Puerto C . . . . . . . . . . . 3.9. El Registro de Estado . . . . 3.10. El acumulador . . . . . . . .

4. Lenguaje Ensamblador 4.1. Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Instrucciones del MPLAB . . . . . . . . . . . . . . . . . . . . . . . 4.3. Estructura de un programa ASM . . . . . . . . . . . . . . . . . . 5. Programacin 5.1. CALL - RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Rutinas de retardo . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Gustavo A. Yarce 5.2.1. Rutina simple de retardo . . . . . . . . . . . . . . . . . . . 5.2.2. Rutina de demora doble . . . . . . . . . . . . . . . . . . . 5.2.3. Rutina de retardo triple . . . . . . . . . . . . . . . . . . . 38 39 41 43 43 44 45 46 46 47 48 49 51 53

6. Programacin en C de Microcontroladores 6.1. Introduccin a CCs . . . . . . . . . . . 6.2. Estructura de un programa en C . . . . 6.2.1. CCs . . . . . . . . . . . . . . . . 6.3. Tipos . . . . . . . . . . . . . . . . . . . 6.3.1. Expresiones . . . . . . . . . . . 6.3.2. Varibles Locales y Globales . . 6.3.3. Conversiones entre tipos . . . . 6.4. Operadores . . . . . . . . . . . . . . . . 6.5. Prembulo . . . . . . . . . . . . . . . . 6.6. Directivas . . . . . . . . . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

ndice de guras
1.1. Estructura de sistema programable . . . . . . . . . . . . . . . . . . . 1.2. Estructura de un microcontrolador . . . . . . . . . . . . . . . . . . . 2.1. pic16f873 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Esquema del Ciclo de Instruccin . . . . . . . . . . . . . . . . . . . . 3.1. Organizacin de la memoria de Programa . . . . . . . . . . . . . . . 3.2. Organizacin de la memoria RAM . . . . . . . . . . . . . . . . . . . 6.1. Compilador CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2. Fusibles vlidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 11 14 16 19 21 45 45

Gustavo A. Yarce

ndice de tablas
3.1. Tabla de conguracin de bancos . . . . . . . . . . . . . . . . . . 3.2. Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1. Instrucciones orientadas a registros . . . . . . . . . . . . . . . . . 4.2. Instrucciones orientadas a bit . . . . . . . . . . . . . . . . . . . . 4.3. Instrucciones orientadas a literal y conrol . . . . . . . . . . . . . 6.1. 6.2. 6.3. 6.4. 6.5. 6.6. 6.7. Tipos de datos . . . . . . . . . Expresiones . . . . . . . . . . Operadores de asignacin . . Operadores aritmticos . . . . Operadores de relacin . . . . Operadores lgicos . . . . . . Operadores de manejo de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 28 33 33 34 46 46 49 50 50 50 50

Prologo Este documento no pretende ser un libro completo sobre microcontroladores, es una ayuda para el alumno, para su utilizacin como gua de aprendizaje. Se tiene como objetivo presentar los conceptos bsicos y las caractersticas generales de los dispositivos microprogramables, para el desarrollo y resolucin de problemas que se presentan en el mbito tcnico. Los temas tratados y el desarrollo que se realiza sobre ellos persiguen la enseanza en entornos educativos tcnicos de nivel medio que necesitan conocimientos sobre estas tecnologas. Se prioriza la enseanza de una metodologa de programacin correcta tratando de conservar la facilidad de uso como herramienta. Siempre se considera que lo ms importante es adquirir una base de conocimientos que permita una posterior evolucin hacia conocimientos relacionados con la Electrnica y la programacin.

Captulo 1 Microcontroladores
1.1 Introduccin

Antes de ver qu es un microcontrolador y de analizar sus puntos fuertes y sus defectos, ser til hacer un repaso relativo a la estructura de cualquier sistema programable, que pueda hacer uso de un microcontrolador.

Figura 1.1: Estructura de sistema programable

La gura 1.1 presenta el esquema tipo de cualquier sistema programable. Veamos que elementos son indispensables para su funcionamiento: La unidad central La memoria ROM 9

10 La memoria RAM Los circuitos de interfaz Un bus de interconexin

Gustavo A. Yarce

La presencia de estos elementos bsicos es indispensable y aun cuando no siempre se presenten tan claramente como en nuestro esquema siempre existen. Obsrvese, que son los mismos que los de un sistema informtico clsico, pero dentro del marco de una aplicacin que pueda ser tratada por un microcontrolador. La unidad central, generalmente constituida por un microprocesador ms o menos evolucionado, ejecuta el programa que da vida a la aplicacin. Los programas pueden ser muy diversos, puesto que, como es evidente, el que asegura la gestin de un termostato inteligente no tiene nada que ver con el que controla el correcto funcionamiento de una fotocopiadora. Sin embargo, estos programas tienen en comn el hecho de que muy raramente necesitan clculos complejos y, en cambio, s suelen incluir numerosas manipulaciones de la informacin de entrada/salida. El programa se almacena en un segundo elemento, que es la memoria ROM. Esta memoria puede constituirse de diferentes formas: UVPROMUVPROM, EEPROM u OTPROMOTPROM, cualquiera que sea la que se utilice es una memoria no voltil desde la que se ejecutar el programa una vez alimentado el sistema. Para poder trabajar correctamente, nuestro microprocesador necesita, a menudo, almacenar datos temporales en alguna parte, y aqu es donde interviene la memoria RAM, que no necesita ser de grandes dimensiones.

1.2

Estructura de un microcontrolador

De lo visto anteriormente, un microcontrolador debe contener todos los elementos de la gura 1.1 en un nico encapsulado. El esquema bsico de un microcontrolador sera

Encontramos en l la unidad central pero se ha simplicado con respecto a los microprocesadores clsicos. En contrapartida se le han aadido instruccio-

Computadoras Electrnicas

11

Figura 1.2: Estructura de un microcontrolador

nes de manejo de bits, muy tiles para las entradas/salidas. En ciertos circuitos, esta unidad central est dotada de un gran nmero de registros internos, que sirven de memoria RAM, por lo que puede parecer que sta ltima est ausente de algunos esquemas. A continuacin podemos ver la memoria ROM, aunque sta no siempre aparece. Cierto nmero de microcontroladores estaban, y todava estn, disponibles sin ROM (ROMless). Posteriormente, los fabricantes han introducido en el chip una memoria programable elctricamente y borrable mediante rayos ultravioleta (UVPROM) o, ms recientemente, borrable elctricamente (EEPROM). Un ltimo producto para almacenar de forma no voltil son las memorias FLASH, de bajo consumo, que se puede escribir y borrar en circuito al igual que las EEPROM, pero suelen disponer de mayor capacidad que estas ltimas. El borrado solo es posible con bloques completos y no se puede realizar sobre posiciones concretas. En lo referente a la memoria RAM, suele utilizarse una del tipo SRAM (RAM esttica) de pequeo tamao, por qu generalmente la unidad central posee sucientes registros para realizar operaciones intermedias. En algunos casos, esta memoria se completa con una EEPROM de datos, que memoriza de forma semipermanente datos del usuario que se manejan como constante en la ejecucin del programa y que de vez en cuando (pasados meses o aos) deben

12 ser modicados.

Gustavo A. Yarce

Algo ms delicado es hacer un esquema tipo para los circuitos de interfaz, ya que es un punto donde se distinguen los diferentes microcontroladores, en funcin de las aplicaciones que pretenden. No obstante se pueden encontrar los siguientes elementos bsicos: Lneas de entrada/salida paralelo, en cantidad variable, segn la nalidad y el tamao del encapsulado (se plantea un problema de nmero mximo de pines debido al crecimiento del nmero de estas lneas). Al menos una interfaz de entrada/salida serie asncrona, ms o menos evolucionada segn los circuitos. Uno o varios temporizadores internos cuyas posibilidades pueden ser muy variables pero que, generalmente, funcionan como contadores ascendentes y descendentes, generadores de impulsos programables, etc. Uno o varios convertidores analgicos/digitales, precedidos o no de multiplexores para ofrecer varias vas. A veces, pero es raro, un covertidor digital/analgico. Por ltimo, aunque no sea una verdadera interfaz de entrada/salida en el sentido en que nosotros entendemos, ciertos microcontroladores disponen de un acceso a su bus interno. Esto permite conectar con otros circuitos destinados a cumplir funciones que faltan en el chip, lo que a veces resulta til. Precisemos, aunque es evidente, que todos los microcontroladores sin memoria ROM interna disponen necesariamente de esta interfaz, puesto que es necesario permitirle acceder a una memoria ROM externa.

Captulo 2 El PIC16f873

2.1

Estructura

Microcontrolador diseado por la empresa Microchip (http://www.microchip.com), que se fabrica en varias versiones de las cuales se analizar con ms detalle el pic16f873. Son idnticas en cuanto a su arquitectura interna todos los pic de la familia 16f87x a excepcin de la memoria ROM y la memoria RAM y puertos. La memoria EEPROM y la Flash son elctricamente grabables y borrables, lo que permite escribir y borrar el programa bajo prueba manteniendo el microcontrolador en el mismo zcalo y usando el mismo dispositivo para grabar y borrar. Esta caracterstica supone una gran ventaja frente a la mayora de los microcontroladores, que tienen como memoria de programa reescribible una tipo EPROM. Se graba elctricamente, pero para borrarlas hay que someterlas durante cierto tiempo a rayos ultravioleta, lo que implica sacar del zcalo el circuito integrado y colocarlo en un borrador de EPROM. Otra ventaja del PIC16F873 en cuanto a simplicar el proceso de escritura, borrado y reescritura de programas, tan necesario en la fase de diseo, es su sistema de grabacin de datos, que se realiza en serie. Para escribir un programa en la memoria se manda la informacin en serie usando slo dos pins, una para la seal de reloj y otra para los datos serie. A continuacin exponemos las caractersticas ms signicativas: Frecuencia de operacin 20 MHz Memoria FLASH de programa (palabra de 14 bits) 4k 13

14 Memoria de datos 192 bytes Memoria de datos EEPROM 128 bytes Interrupciones 13 Puertos de E/S Puertos A, B, C Temporizadores 3 Mdulos de Captura/Comparacion/PWM 2 Comunicacin serial tipo MSSP, USART

Gustavo A. Yarce

Mdulo de conversin Anlogo-Digital (10 bits) 5 canales de entrada Conjunto de 35 instrucciones El PIC16F873 se presenta en un encapsulado de 28 pines como se ve en la Figura 2.1 y la descripcin de cada pin se muestran en el cuadro

Figura 2.1: pic16f873

Computadoras Electrnicas 2.2 El reloj

15

La frecuencia de trabajo del microcontrolador es un parmetro fundamental a la hora de establecer la velocidad de ejecucin de instrucciones y el consumo de energa. Cuando un PIC16F873 funciona a 20 MHz, que es su mxima frecuencia, le corresponde un ciclo de instruccin de 200 ns, puesto que cada instruccin tarda en ejecutarse 4 perodos de reloj, o sea, Ciclo de instrucci on = 4 fOSC = 4 = 200ns 20MHZ

Todas las instrucciones del PIC se realizan en un ciclo de instruccin, menos las de salto que tardan el doble. Los impulsos de reloj entrar por la pin OSC1/CLKIN y se dividen por 4 internamente, dando lugar a las seales Q1, Q2, Q3 y Q4. Durante un ciclo de instruccin, que comprende las cuatro seales mencionadas, se desarrollan las siguientes operaciones: Q1: Durante este impulso se incrementa el Contador de Programa. Q4: Durante este impulso se busca el cdigo de la instruccin en la memoria del programa y se carga en el Registro de Instrucciones. Q2-Q3: Durante la activacin de estas dos seales se produce la decodicacin y la ejecucin de la instruccin. Para conseguir ejecutar cada instruccin en un ciclo de instruccin (excepto las de salto), se aplica la tcnica de segmentacin o pipe-line, que consiste en realizar en paralelo las dos fases que comprende cada instruccin.

La estructura segmentada del procesador permite realizar al mismo tiempo la fase de ejecucin de una instruccin y la de bsqueda de la siguiente. Cuando la instruccin ejecutada corresponde a un salto no se conoce cul ser la siguiente hasta que se realice, por eso en esta situacin se sustituye la fase de bsqueda por un ciclo vacio, originando que las instrucciones de salto tarde en realizarse dos ciclos de instruccin.

16

Gustavo A. Yarce

Figura 2.2: Esquema del Ciclo de Instruccin

2.3

Osciladores

Los PIC admiten cuatro tipos de osciladores externos para aplicarles la frecuencia de funcionamiento, se colocan entre las pins OSC1 y OSC2. El tipo empleado debe especicarse en dos bits de la Palabra de Conguracin, como se comentar ms adelante. Los tipos que se pueden emplear son:

Oscilador RC: Es un oscilador de bajo coste formado por una simple resistencia y un condensador. Proporciona una estabilidad mediocre de la frecuencia, cuyo valor depende de los valores de los dos elementos R-C. Oscilador HS: Es un oscilador que alcanza una alta velocidad comprendida entre 4 y 10 MHz y est basado en un cristal de cuarzo o un resonador cermico. Oscilador XT: Es un oscilador de cristal o resonador para frecuencias estndar comprendidas entre 100 KHz y 4 MHz. Oscilador LP: Oscilador de bajo consumo con cristal o resonador diseado para trabajar en un rango de frecuencias de 35 a 200 KHz.

Computadoras Electrnicas 2.4 Reset

17

Cuando se aplica un nivel lgico bajo a la pin MCLR# el microcontrolador reinicializa su estado. Dos acciones importantes se producen en la reinicializacin o Reset: 1. El Contador de Programa se carga con la direccin 0, apuntando a la primera direccin de la memoria de programa en donde deber estar situada la primera instruccin del programa de aplicacin. 2. la mayora de los registros de estado y control del procesador toman un estado conocido y determinado. Se puede provocar el Reset de varias maneras, pero si se desea realizar manualmente, habr que colocar, conectado al pin MCLR#, que al ser apretado genere un nivel lgico bajo.

18

Gustavo A. Yarce

Captulo 3 Estructura de la memoria

3.1

Memoria de Programa

La memoria FLASH tiene una capacidad 4K palabras de 14 bits cada una. Esta memoria est dividida en pginas de 2K y esta direccionado con el PC(3.3), que tiene un tamao de 13 bits.

Figura 3.1: Organizacin de la memoria de Programa

19

20 3.2 Memoria de Datos(RAM)

Gustavo A. Yarce

La memoria RAM de datos de los PIC 16F873 posee una capacidad de 192 bytes, en una estructura de 4 bancos de 128 bytes cada uno. Para seleccionar el banco a acceder hay que manipular el bit 5 (RP0) y el bit 6 (RP1) del registro ESTADO(03h). BANCO RP1 0 0 1 0 2 1 3 1 RP0 0 1 0 1

Tabla 3.1: Tabla de conguracin de bancos

La memoria de datos tiene posiciones implementadas en RAM y EEPROM, 1. Area de RAM esttica o SRAM, se alojan los registros operativos fundamentales en el funcionamiento del procesador y en el manejo de todos los perifricos y registros que el se pueden como informacin de trabajo propia de la aplicacin. 2. Area EEPROM, de 64 bytes donde, opcionalmente, se pueden almacenar datos que no se pierden al deconectar la alimentacin. La zona de memoria RAM se halla dividida en 4 bancos (banco 0,1,2 y 3) de 128 bytes cada uno.En las posiciones iniciales de cada banco se ubican los Registros Especcos que gobiernan al procesador y sus recursos

3.3

Registros Especficos - El PC

Los 13 bits contenidos en el PC, que direccionan la memoria de cdigo, estn guardados en dos registros especcos. El registro PCL(02h) guarda los 8 bits de menos peso y se puede leer y escribir. Los bits <12:8>del PC se alojan en PCH,

Computadoras Electrnicas

21

Figura 3.2: Organizacin de la memoria RAM

que al no poder ser ledo ni escrito, se accede a l a travs del PCLATH(0Ah).

Las instrucciones de salto CALL y GOTO slo proporcionan 11 bits de la direccin a saltar, esto es una limitante del tamao del salto que se puede producir, siendo su tamao mximo de 2K. Al resetearse el PIC, todos los bits del PC toman valor 1, de manera que la direccin de arranque del programa es siempre la ultima posicin de memoria de programa. En esta posicin se deber poner una instruccin de salto al punto donde verdaderamente se inicia el programa. A diferencia de la mayora de los

22

Gustavo A. Yarce

microprocesadores convencionales, el PC es tambin accesible al programador como registro de memoria interna de datos, en la posicin de 02. Es decir que cualquier instruccin comn que opere sobre registros puede ser utilizada para alterar el PC y desviar la ejecucin del programa. El uso indiscriminado de este tipo de instrucciones complica el programa y puede ser muy peligroso, ya que puede producir comportamientos difciles de predecir. Sin embargo, algunas de esta instrucciones utilizadas con cierto mtodo, pueden ser muy tiles para implementar poderosas estructuras de control tales como el goto computado. Como el PIC opera con datos de 8 bits, y la memoria de datos es tambin de 8 bits, estas instrucciones solo pueden leer o modicar los bits 0 a 7 del PC. Para saltar entre una pgina y otra, los bits ms signicativos del PC debern ser modicados. 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 completen los 13 bits del PC para moverse sobre los 4K de memoria de programa. Estos dos bits extra se encuentran en un SFR denominado PCLATH (Program Counter Latch High) en sus bits PCLATH<4:3>. 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.

La pila La memoria de stack o pila es una area 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 legible ni escribible. 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 RETFIE el contenido de la posicin actual del stack es colocado en el PC. El Stack o Pila, es una zona de memoria, transparente al usuario, con la cual se salvan las direcciones cuando se ejecuta la instruccin CALL y las interrupciones, en esta zona se guarda el valor del PC(3.3). Es de vital importancia no sobrepasar el lmite de 8 niveles en la realizacin de programas. PCLATH no se modica en ninguna de estas operaciones y cuando el apuntador de stack ya est en la posicin 8 y se ejecuta otro CALL se reinicia a la posicin 1 sobrescribiendo en dicha posicin. No existe ningn indicador que avise de

Computadoras Electrnicas esta situacin.

23

3.4

Direccionamiento

En los PIC de gama media la memoria de datos est organizada para alojar un mximo de 4 bancos de 128 bytes cada uno. Los PIC16C84 slo tienen implementados los 48 primeros bytes de los bancos 0 y 1. En el resto de los PIC de esta familia se destinan dos bits del registro ESTADO (RP0 y RP1) para determinar el banco y otros siete para elegir una de las 128 posiciones del banco seleccionado, tal y como muestra la gura 8.

Direccionamiento Directo: El operando que utiliza la instruccin en curso se referencia mediante su direccin, que viene incluida en el cdigo OP de la misma, concretamente en los 7 bits de menos peso. El banco a acceder lo determinan los bits RP0 y RP1 del registro ESTADO. En el caso del PIC16C84 slo se usa el bit RP0 al tener implementados nicamente dos bancos. Se accede a la RAM de forma inmediata. La direccin de RAM a la que se quiere acceder est implcita en la propia instruccin. Por ejemplo: MOVWF 20 realiza una operacin de escritura en la direccin 0x20. Este modo de direccionamiento es el ms habitual. Direccionamiento Indirecto: Este modo de direccionamiento se usa cuando en una instruccin se utiliza como operando el registro INDF, que ocupa la direccin =de ambos bancos. En realidad el registro INDF no est implementado fsicamente y cuando se le hace referencia, se accede a la direccin de un banco especicada con los bits de menos peso del registro FSR. El bit de ms peso de FSR junto al bit IRP del registro ESTADO se encargan de seleccionar el banco a acceder, mientras que los 7 bits de menos peso apuntan a la posicin. Como slo hay dos bancos en el PIC16C84 en este modo de direccionamiento, el bit IRP es 0 siempre. En este modo de direccionamiento se utilizan dos registros especiales: FSR y INDF. FSR es un puntero de RAM, es decir, contiene la direccin de memoria a la que se desea acceder. El registro INDF, utiliza el valor del registro FSR para acceder al registro deseado. Por ejemplo: si escribimos 20 en FSR y despus escribimos 215 en INDF, habremos escrito un 215 en la direccin de memoria 20 (que era la que contena FSR). El direccionamiento indirecto se usa para manejar tablas manipular

24

Gustavo A. Yarce segmentos de memoria. Por ejemplo, Podemos programar un bucle, en el cual, incrementamos el valor de FSR para acceder a unas direcciones de memoria consecutivas.

3.5

Los Puertos del PIC

Los PIC16f873 disponen de tres puertos de E/S. La Puerta B tiene 8 lneas, RB0-RB7, y tambin tiene una con funciones multiplexadas, la RB0/INT, que, adems de lnea tpica de E/S, tambin sirve como pin por la que reciben los impulsos externos que provocan una interrupcin. Adems tenemos el puerto C, con 8 lneas. Cada lnea de E/S puede congurarse independientemente como entrada o como salida, segn se ponga a 1 o a 0, respectivamente, el bit asociado del registro de conguracin de cada puerta (TRISA, TRISB y TRISC). Se llaman PORTA, PORTB y PORTC los registros que guardan la informacin que entra o sale por la puerta y ocupan las direcciones 5 y 6 del banco 0 de la memoria de datos. Los registros de conguracin TRISA, TRISB Y TRISC ocupan las mismas direcciones pero en el banco 1. Al reiniciarse el PIC todos los bits de los registros TRIS quedan a 1, con lo que las lneas de las puertas quedan conguradas como entradas. Cada lnea de salida puede suministrar una corriente mxima de 20 mA y si es de entrada puede absorber hasta 25 mA. Al existir una limitacin en la disipacin mxima de la potencia del chip se restringe la corriente mxima de absorcin de la Puerta A a 80 mA y la de suministro a 50 mA. La Puerta B puede absorber un mximo de 150 mA y suministrar un total de 100 mA.

3.6

Puerto A

La Puerta A posee 6 lneas, RA0-RA5, y soportan funciones multiplexadas. Son bidireccionales y dependen del valor del registro TRISA. Los pines RA0/AN0,RA1/AN1 y RA2/AN2, adems de lneas de E/S digitales tambin pueden actuar como los canales 0,1 y 2 por los que se pueden utilizar como entradas al conversor A/D.

Computadoras Electrnicas

25

El pin RA3/AN3,Vref+ puede actuar como entrada de la tensin de referencia para los perifricos que la precisan. El pin RA4/TOCKI, que puede actuar como lnea de E/S o como el pin por la que se reciben los impulsos que debe contar TMR0. Las lneas RA3-RA0 admiten niveles de entrada TTL y de salida CMOS. La lnea RA4/TOCKI dispone de un circuito Trigger Schmitt que proporciona una buena inmunidad al ruido y la salida tiene drenador abierto. RA4 multiplexa su funcin de E/S con la entrada de impulsos externos para el TMR0. En el circuito de la gura 9 se muestra la adaptacin de las pins RA3-RA0 a las seales internas del procesador. Cuando se lee una lnea de la Puerta A se recoge el nivel lgico que tiene en ese momento. Las lneas cuando actan como salidas estn conectadas a unos biestable, lo que signica que sus pins sacan el nivel lgico que se haya cargado por ltima vez en el registro PUERTAA. La escritura de una puerta, tal y como se ve en la gura 9, implica que primero se deposita el nivel lgico en la lnea correspondiente del bus interno de datos y se activa la seal WRITE, lo que origina el almacenamiento de dicho nivel en el biestable. En esta situacin, el biestable de conguracin (TRIS) debera tener valor 0 para que actuase como salida. Con estos valores la puerta OR tendra un 0 a su salida y la AND tambin. Estos valores producen la conduccin de los transistores MOS, en funcin del valor escrito, dando como salida nal VDD o VSS (1 0 respectivamente). Si una lnea acta como entrada, el nivel lgico depositado en ella desde el exterior pasa a la lnea correspondiente del bus interno de datos cuando se activa la seal READ y se hace conductor el dispositivo triestado que les une. Al programarse como entrada, los dos transistores MOS de salida quedan bloqueados y la lnea de alta impedancia. Tngase en cuenta que cuando se lee una lnea de entrada se obtiene el estado actual que tiene su pin correspondiente (almacenado en el tercer biestable) y no el que haya almacenado en el biestable de datos. La informacin presente en una lnea de entrada se muestrea al iniciarse el ciclo de instruccin y debe matenerse estable durante su desarrollo. Cuando se produce un RESET al conectar la tensin de alimentacin(Power On Reset) todas las patitas de la puerta A quedan conguradas como canales de entrada para el conversor A/D y son ledas como 0. Para que el PORTA funcione como lneas de E/S digitales se debe congurar el valor adecuado en el ADCON1, en general se suele cargar en dicho registro el valor 011x en sus 4 bits de menos peso.

26 3.7 Puerto B

Gustavo A. Yarce

Consta de 8 lneas bidireccionales de E/S, RB7-RB0, cuya informacin se almacena en el registro PORTB, que ocupa la direccin 6 del banco 0. El registro de conguracin TRISB ocupa la misma direccin pero del banco 1. La lnea RB0/INT tiene dos funciones multiplexadas; adems de pin de E/S acta como la pin para la peticin de una interrupcin externa, cuando se autoriza esta funcin mediante la adecuada programacin del registro INTCON. Las cuatro lneas de ms peso, RB7-RB4, pueden programarse para soportar una misin especial. Cuando las 4 lneas actan como entradas se las puede programar para generar una interrupcin si alguna de ellas cambia su estado lgico. Esta posibilidad es muy prctica en el control de teclados. En la gura 10 se muestra el esquema de conexionado entre las pins RB7-RB4 y las lneas correspondientes del bus interno. El estado de las pins RB7-RB4 en modo de entrada se compara con el valor antiguo que tenan y que se haba almacenado en un biestable durante la ltima lectura de la Puerta B. El cambio de estado en alguna de esas lneas origina una interrupcin y la activacin del sealizador RBIF. La lnea RB6 tambin se utiliza para la grabacin serie de la memoria de programas y sirve para soportar la seal de reloj. La lnea RB7 constituye la entrada de los datos en serie. Los pines del puerto B disponen de una resistencia interna de pull-up al positivo de la alimentacin, que queda conectada cuando el bit RBPU#, que es el bit 7 del registro OPTION, tiene el valor 0. Las resistencias pull up se utilizan para forzar a un nivel alto una entrada de un componente lgico. Sirve por ejemplo cuando necesitas leer el estado de un interruptor o una tecla. Cuando la tecla se activa se lleva a un estado lgico determinado, pero cuando est abierta est al aire y los circuitos lgicos hacen una interpretacin indeterminada. La resistencia pull up fuerza a nivel lgico alto cuando est abierta y permite que se lleve a nivel bajo al cerrarse sin producir un cortocircuito. Tambin puede servir cuando se conecta una entrada a una salida de colector abierto. El pull up suple la resistencia faltante del driver de colector abierto

3.8

Puerto C

Consta de 8 lneas bidireccional cuyo sentido se congura mediante el registro TRISC,

Computadoras Electrnicas

27

El Puerto C tiene varias funciones en sus pines, tiene las funciones de comunicacion I2C, el reloj externo del timer 1, Usart, etc. Cuando se usan los mdulos relacionados con este puerto, se debe tener cuidado pues algunas veces cambia el estado E/S del pin sin importar lo que indique TRISC, para saber cuando si cambiara debemos ver la descripcin de cada mdulo. Todos los buers de este puerto son del tipo Schmitt Trigger, adems poseen las siguientes funciones multiplexadas: RC0/T1OSO/T1CKI: E/S, puede ser tambin salida del Timer1 entrada del impulsos para el Timer1. RC1/T1OSI/CCP2: E/S, puede ser tambin entrada al oscilador del Timer1 entrada al mdulo de captura 2, salida del comparador 2 , salida de PWM2. RC2/CCP1: E/S, puede ser tambin entrada captura 1, salida comparador 1 o salida PWM1. RC3/SCK/SCL: E/S, puede ser tambin seal de reloj en modo SPI seal de reloj en modo I2C. RC4/SDI/SDA: E/S, puede ser tambin entrada de datos en modo SPI o Seal de reloj en modo I2C. RC5/SD0: E/S, puede ser tambin salida de datos en modo SPI. RC6/TX/CK: E/S, lnea de transmisin eb USART seal de reloj sncrona en transmisin serie. RC7/RX/DT: E/S, lnea de recepcin USART lnea de datos en transmisin serie sncrona.

3.9

El Registro de Estado

Hasta ahora ESTADO es el registro ms usado y llega el momento de describirlo en su totalidad. Ocupa la direccin 3 tanto del banco 0 como del 1 de la memoria de datos RAM. Sus bits tienen tres misiones distintas:

28

Gustavo A. Yarce 1. Se encargan de avisar de la incidencias del resultado de la ALU (C, DC y Z). 2. Indican el estado de Reset (TO# y PD#). 3. Seleccionan el banco a acceder en la memoria de datos (IRP, RP0 y RP1)

En la tabla 3.2, se muestra el diagrama de distribucin de los bits del registro ESTADO, su misin es la siguiente:

IRP RP1 7 6

RP0 T0# PD# 5 4 3

Z 2

DC c 1 0

Tabla 3.2: Registro de Estado

C: Acarreo en el bit de ms peso 1: Acarreo en el bit de ms peso. 0: No acarreo en el bit de ms peso.

DC: Acarreo en el 4 bit 1: Acarreo en el 4 bit. 0: No acarreo en el 4 bit.

Z: Cero 1: El resultado de una instruccin lgico-aritmtica ha sido cero. 0: El resultado de una instruccin lgico-aritmtica no ha sido cero.

PD#: Power Down 1: Se pone a este valor despus de la conexin a la alimentacin o al ejecutar clrwdt. 0: Se pone a este valor al ejecutar sleep.

Computadoras Electrnicas

29

TO#: Time Out 1: Se pone a este valor despus de la conexin a la alimentacin o al ejecutar clrwdt y sleep. 0: Se pone a este valor al desbordarse el Perro Guardin (Watchdog). RP1-RP0: Seleccin de banco en direccionamiento directo El PIC16F873 tiene cuatro bancos, emplea el bit RP0 y RP1, de forma que se puede acceder a cualquier banco. IRP: Seleccin del banco en direccionamiento indirecto Este bit junto con el de ms peso del registro FSR sirven para determinar el banco de la memoria de datos seleccionado.

3.10

El acumulador

Uno de los registros mas utilizado, es el registro de trabajo W, el cual, se utiliza para mover un dato/valor de un registro a otro, cargar valores en un registro, y con la ayuda de la ALU puede hacer operaciones matemticas. El registro W no est implementado en la memoria RAM en la posicin 0x00 ni en otra posicin. W es un registro independiente que tiene un bus directo con la ALU (un camino privado). La ALU es la nica entidad que puede leer o escribir este registro de trabajo.

30

Gustavo A. Yarce

Captulo 4 Lenguaje Ensamblador

4.1

Instrucciones

El juego de instrucciones de un microprocesador o microcontrolador es el conjunto de entradas binarias que producen acciones denidas durante un ciclo de instruccin. Un juego de instrucciones es para el microcontrolador lo mismo que una tabla de verdad es para una puerta lgica, un registro de desplazamiento o un sumador. Por supuesto, las acciones que realiza un microcontrolador con cada instruccin, son ms complejas que las que realizan los dispositivos y puertas antes mencionados. Una instruccin es un patrn de dgitos binarios el cual debe estar a disposicin del microcontrolador en el tiempo y forma que ste lo requiera. Por ejemplo, cuando el procesador de un microcontrolador PIC16F84A recibe el patrn binario de 12 bits 0000 0100 0000 en el momento adecuado, signica: Clear (borrar o poner a cero) el registro W, y corresponde a la instruccin CLRW. Para los PIC se han creado unas instrucciones y una estructura de programa que los hacen ms sencillos y atractivos todava.. Las instrucciones de los microcontrolador PIC cumplen con las siguientes condiciones: Juego de instrucciones reducido: Por ejemplo, solo existen 35 instrucciones en el PIC16F873. Sencillas y rpidas: La mayora se ejecuta en un ciclo de instruccin, y solo las de salto precisan 2 ciclos. El ciclo de instruccin consta de 4 ciclos de 31

32

Gustavo A. Yarce reloj principal. De esta manera un dispositivo con un cristal de cuarzo de 20 MHz realiza 5 millones de instrucciones por segundo. Ortogonalidad: La ubicacin de los operandos que manejan es muy exible. Cualquier objeto del procesador puede actuar como origen o como destino. Formato uniforme de las instrucciones: Todas las instrucciones tienen una longitud ja de bits. Esta caracterstica signica un notable ahorro de la memoria de programa y una facilidad en la construccin de compiladores. Formato uniforme de los datos.

Un programa es una serie de instrucciones mediante las cuales un sistema basado en CPU realiza una tarea en particular y la forma mas simple de realizar un programa es mediante el lenguaje ensamblador (Ver Sistemas microprogramables, Lenguajes de programacin para sistemas basados en CPU). Podramos decir que el lenguaje ensamblador es complejo por su sencillez. Esto quiere decir que, a diferencia de los lenguajes de alto nivel, aqu no hay funciones que solucionen y simpliquen algoritmos, si no que hay que implementar hasta los pasos ms elementales.

Notas: Al modicar un registro de E/S con una operacin sobre l mismo (por ejemplo MOVF PORTB,1), el valor utilizado es el que se halle presente en las patillas del PORTB. Por ejemplo, si el biestable tiene un 1 para una patilla congurada como entrada y se pone a nivel bajo desde el exterior, el dato se volver a escribir como 0. Si se ejecuta esta instruccin sobre el TMR0 y d=1, se borrar el conteo de la preescala asignada (preescaler), si est asignado al TMR0, pero no se borrar la preescala asignada en OPTION_REG, que controla Timer0.

Computadoras Electrnicas Mnemnicos Descripcin ADDWF f,d w+fd ANDWF f,d w AND f d CLRF f 00 h f CLRW f 00 h w COMF f,d Complemento de f d DECF f,d f-1d DECFSZ f,d f - 1 d (si es 0 salta) INCF f,d f+1d INCFSZ f,d f + 1 d (si es 0 salta) IORWF f,d w OR f d MOVF f,d fd MOVWF f wf NOP No operacin RLF f,d Rota f izq por carry d RRF f,d Rota f dcha por carry d SUBWF f,d f-wd SWAPF f,d Intercambia nibbles de f d Flags Ciclos C, DC, Z 1 Z 1 Z 1 Z 1 Z 1 Z 1 Ninguna 1(2) Z 1 Ninguna 1(2) Z 1 Z 1 Ninguna 1 Ninguna 1 C 1 C 1 C,DC,Z 1 Ninguna 1

33

Tabla 4.1: Instrucciones orientadas a registros Mnemnicos Descripcin BCF f,b Pone a 0 bit b de registro f BSF f,b Pone a 1 bit b de registro f BTFSC f,b Salto si bit b de reg. f es 0 BTFSS f,b Salto si bit b de reg. f es 1 Flags Ciclos Ninguna 1 Ninguna 1 Ninguna 1(2) Ninguna 1(2)

Tabla 4.2: Instrucciones orientadas a bit Si se modica el Contador de Programa PC o una condicin de prueba es verdadera, la instruccin requiere dos ciclos mquina. El segundo ciclo se ejecuta como un NOP. En las tablas siguientes, por orden alfabtico, veremos todos los datos de inters sobre las 35 instrucciones. Algunos son de poca importancia. En cambio otros, como la operacin, la sintaxis, el comportamiento del registro STATUS y los ejemplos, son imprescindibles para comprender su funcionamiento. Aparte de estas 35 instrucciones, hay otro tipo de instrucciones usadas para simplicar la tarea de programar, y que generalmente estn formadas por dos

34 Mnemnicos Descripcin ADDLW k w+kw ANDLW k w AND k w CALL k Llamada a subrutina k CLRWDT - Borra temporizador del WDT GOTO k Ir a direccin k IORLW k w OR k w MOVLW k kw RETFIE Retorno de una interrupcin RETLW k Retorno con k en w RETURN Retorno de una subrutina SLEEP Modo Standby SUBLW k k-ww XORLW k w XOR k w

Gustavo A. Yarce Flags Ciclos C,DC,Z 1 Z 1 Ninguna 2 TO,PD 1 Ninguna 2 Z 1 Ninguna 1 Ninguna 2 Ninguna 2 Ninguna 2 TO, PD 1 C,DC,Z 1 Z 1

Tabla 4.3: Instrucciones orientadas a literal y conrol instrucciones bsicas. Estas no las trataremos a fondo, pero las veremos en un resumen despus de comprender el funcionamiento de las 35 instrucciones bsicas.

4.2

Instrucciones del MPLAB

No son propiamente instrucciones del microcontrolador, sino que son comandos insertados en el programa que controlan el proceso de ensamblado Estos comandos no tienen traduccin al cdigo mquina. Suelen escribirse en la segunda columna. Algunas de estas pseudoinstrucciones son: END: Indica n del programa. Es el nico comando obligatorio ya que el ensamblador necesita saber donde termina el proceso de ensamblado. Se pone en la ltima lnea del programa. Todas las lneas posteriores a la lnea en la que se encuentra esta directiva son ignoradas y no se ensamblan.

Computadoras Electrnicas ORG: Su sintaxis es:

35

[<label>] ORG <expr> Indica al programa ensamblador a partir de que posicin de memoria de programa tiene que ensamblar las instrucciones. Ejemplo: ORG 0x04 Si las instrucciones de un programa comienzan a escribirse sin indicar ORG, el ensamblador toma por defecto ORG 0x00. Pueden escribirse varios ORG en el mismo programa EQU. Su sintaxis es: <label>EQU <expr> Es una etiqueta de asignacin. El valor <expr>es asignado a la etiqueta <label>. Usualmente las asignaciones EQU se ponen al principio del programa (antes que las instrucciones). Siempre que <label>aparece en el programa es sustituido por el valor numrico de la expresin que se le haya asignado. _ CONFIG. Esta directiva indica la conguracin elegida para el proceso de grabacin del microcontrolador. Ejemplo: _CONFIG _CP_OFF & _WDT_OFF & PWRTE_ON & _XT_OSC En este caso la conguracin elegida es: No hay proteccin de cdigo (_CP_OFF) No se habilita el Watchdog (_WDT_OFF) Se habilita el Reset mediante Power-up Timer(_PWRTE_ON). Se utiliza el oscilador por cristal de cuarzo (_XT_OSC)

36 4.3 Estructura de un programa ASM

Gustavo A. Yarce

E general la estructura del programa en ensamblador tiene, 3 columnas obligatoria, la primer columna es la ETIQUETA y sirve para darle el nombre a una posicin de la memoria del programa al que se necesita apuntar(EQU. La segunda columna, se llama INSTRUCCIN y lo que justamente hace, es una instruccin a realizar por el programa. La tercera columna, se llama OPERANDO y es el operando de una instruccin, o sea, de la segunda columna. Hay instrucciones que no tienen operando. Opcionalmente se puede incluir un cuarta columna, llamada OBSERVACIONES y sirve solo para el usuario, el que est programando el PIC. Comienzan con un ; (punto y coma)

Captulo 5 Programacin

5.1

CALL - RETURN

La instruccin CALL ( llamada la subrutina) consigue que la ejecucin del programa contine en la direccin donde se encuentra la subrutina a la que hace referencia. Es similar a GOTO pero coloca en la pila la direccin de la siguiente instruccin que se debe ejecutar despus de la CALL. La subrutina naliza con la instruccin RETURN (Retorno de la subrutina) que retoma la direccin guardada en le pila y la coloca en el contador del programa PC continuando el ujo de control con la instruccin que sigue a la CALL.

En la familia PIC de gama media la pila tiene ocho niveles de memoria del tipo FIFO (primero en entrar, ltimo en salir). Si se produce la llamada a una subrutina durante la ejecucin de otra subrutina, la direccin de retorno de esta segunda es colocada en la cima de la pila sobre la direccin anterior. Esta segunda direccin es la primera en salir de la pila mediante la instruccin RETURN. Con la pila de ocho niveles, una subrutina puede llamar a otra y sta, a su vez, llamar a otra hasta un mximo de ocho. La gama baja slo puede realizar dos llamadas de este tipo al poseer una pila de slo dos niveles. Las subrutinas deben colocarse al comienzo de las pginas debido a que el bit 8 del contador del programa es puesto a 0 por la instruccin CALL (o por cualquier instruccin que modica el PC). Las subrutinas deben colocarse en la mitad inicial de las pginas (las 256 palabras). 37

38 5.2 Rutinas de retardo

Gustavo A. Yarce

Rutina simple de retardo Una rutina de simple puede ser implementada como:

call retardo r1

retardo

;llama a la rutina de retardo ;carga k1 en el acumulador ;guarda el valor del w en mem1 ;decrementa mem1 ;se ejecuta esta inst. si dec. no es cero

movlw .k1 movwf mem1 decfsz mem1,1 goto r1 return

Cuando ejecuta la instruccin Call esta lleva en ejecutarse 2 ciclos. Cuando esta dentro de la rutina retardo se encuentra con la instruccin movlw .k1 que consume 1 ciclo, luego ejecuta la instruccin movwf mem1 que consume 1 ciclo. Luego se ejecuta la parte principal de la rutina de demora, las instrucciones decfsz mem1,1 y la instruccin goto r1 se ejecutan (k11) veces, ya que mienstras esta decrementado y no llega a cero no se saltea la instruccin goto, por lo tanto mienstras no de cero el decremento la instruccin decfsz consume 1 ciclo y la instruccin goto 2, por lo tanto,(k1-1 )*3 ciclos le lleva realizar este decremento, cuando llego a cero la instruccin decfsz consume 2 ciclos, por lo tanto el total de ciclo de la rutina de demora es 3*(k1-1) + 2 ciclos. Luego retorna al programa principal mediante la instruccin return que consume 2 ciclos. El total de ciclos que lleva la rutina completa es 2 + 1 + 1 +(k1-1) + 2 = 35 ciclos, y el tiempo que consume esto es con un reloj de 4 Mhz, por lo tanto el perdo es 2, 5e7 ; cada instruccin consume 4 ciclos, por lo que el tiempo que tarda en ejecutarse cada instruccin es 4 2,5e 7 = 1e6 . La secuencia de demora es {3 254 + 2 = 764}, el mximo tiempo que puede realizar la demora es (2 + 1 + 1 + 3 254 + 2 + 2) = 770ciclos Lo que lleva un tiempo de 770 u seg.

Computadoras Electrnicas Rutina de demora doble Una rutina de doble puede ser implementada como: call retardo ;llama a la rutina de retardo retardo r2 r1 movlw movwf movlw movwf decfsz goto decfsz goto return .k2 ;{1} mem2 ;{2} .k1 ;{3} carga k1 en el acumulador mem1 ;{4} guarda el valor del w en mem1 mem1,1 ;{5} decrementa mem1 r1 ;{6} se ejecuta esta instr. si el dec. <>0 mem2,1 ;{7} r2 ;{8} ;{9}

39

La instruccin Call consume 2 ciclos, luego se ejecuta la instruccin retardo, luego ejecuta la instruccin {1} que tarda 1 ciclo, luego se ejecuta la instruccin {2} - 1 ciclo. Luego ejecuta la instruccin {3} aqu esta tarda 1 ciclo, luego ejecuta la instruccin {4} - 1 ciclo, luego se ejecuta la instruccin {5} {6} que ya fue analizado en el punto anterior y tarda siempre 3*(k1-1)+2 ciclos. luego se ejecuta la instruccin {7} que decrementa mem2, si el decremento no es cero tarda en ejecutarse 1 ciclo y pasa a ejecutar la instruccin {8}, que vuelve a la instruccin {3}. Entonces el secuencia de instrucciones:

{3} {4} {5} {6} {7} {8} Total

1 ciclo 1 ciclo 3*(k1-1)+2 ciclos 1 ciclo 2 ciclo 7+(3*(k1-1) ciclos

Esta secuencia ciclos se ejecutan en su totalidad (k2-1) veces. Luego la tercera vez esta secuencia resulta en: {3} 1 ciclo {4} 1 ciclo {5} {6} 3*(k1-1)+2 ciclos {7} 2 ciclos Total 6+3*(k1-1) ciclos

40

Gustavo A. Yarce se ejecuta decfsz mem2 como el decremento es 0 consume 2 ciclos El total de ciclos consumidos en esta rutina 2 + 1 + 1 + {(7 + (3 (k1 1)) 2 + 6 + 3 (k1 1)} + 2 ciclos El mximo tiempo que se tarda, se cargan mem1 y mem2 con 0FFh. La primera secuencia tarda {3} {4} {5} {6} {7} {8} Total 1 ciclo 1 ciclo 764 ciclos 1 ciclo 2 ciclo 769 ciclos

Esta secuencia se ejecuta 0Feh veces o 254 veces. La segunda secuencia es {3} {4} {5} {6} {7} Total 1 ciclo 1 ciclo 764 ciclos 2 ciclos 768 ciclos

EL nmero de ciclos total es 2 + 1 + 1 + {769 254 + 768} + 2 = 2 + 1 + 2 + {101} + 2 = 196100ciclos Lo que lleva un tiempo de 196100 1e6 = 0,1961 segundos o 196.1 milisegundos.

Computadoras Electrnicas Rutina de retardo triple

41

retardo r3 r2 r1

movlw movwf movlw movwf movlw movwf decfsz goto decfsz goto decfsz goto return

.k3 mem3 .k2 mem2 .k1 mem1 mem1,1 r1 mem2,1 r2 mem3,1 r3

;{1} ;{2} ;{3} ;{4} ;{5} ;{6} ;{7} ;{8} ;{9} ;{10} ;{11} ;{12} ;{13}

La llamada a subrutina call tarda 2 ciclos. Luego salta a la subrutina en la cual se encuentra con {1} y {2} que tardan en ejecutarse 2 ciclos. Luego entra en la rutina principal, entre las lneas {7}{8} tenemos el bucle simple el cual tarda en ejecutarse 3*(k1-1)+2 ciclos,

Entre las lneas {5}{6}{7}{8}{9}{10}, tenemos el bucle doble, el cual incluye el bucle simple. Denominaremos a la expresin del bucle simple como A = [3 (k1 1) + 2] Por lo tanto el bucle doble puede expresarse como:

{5} 1 ciclo {6} 1 ciclo {A} A ciclos {9} 1 ciclo {10} 2 ciclos

Este bucle se ejecuta (k2-1). La expresin que rige el segundo bucle, [(1+1+A+1+2)*(k2-1)]+[1+1+A+2]= [(5+A)*(k2-1]+[4+A]ciclos

42 Para indicar la expresin del bucle doble lo haremos como B=[(5+A)*(k2-1)]+[4+A]

Gustavo A. Yarce

En la lnea 3 comienza el bucle triple y naliza en 12 la cual ocupa las siguientes lneas: 3 1 ciclo 4 1 ciclo B B ciclos 11 1 ciclo 12 2 ciclos

C=[(1+1+B+1+2)*(k3-1)]+[1+1+B+2]=[(5+B)*(k3-1)]+[4+B]=

Para determinar una rutina generaliza es A=[3*(k1-1)+2] B=[(5+A)*(k2-1)]+[4+A] C=[(5+B)*(k3-1)]+[4+B] D = 2 + 1 +1 +C + 2

Para el mximo de los valores cargados en k1, k2 y k3 para 255.

A=[3*(255-1)+2]=764 ciclos B=[(5+764)*(255-1)]+[4+764] = [195326]+[768] = 196064 ciclos C=[(5+196094)*(255-1)]+[4+196094] = 50005244 ciclos D = 2 + 1 + 1 + 50005244 + 2 = 50005250 ciclos Para un oscilador de 4 MHz, el tiempo de ciclo de instruccin es t = 1e6 seg. D= 50.005250 segundos

Captulo 6 Programacin en C de Microcontroladores

6.1

Introduccin a CCs

Cada programa en C debe contener una funcin principal que es el punto de partida de la ejecucin del programa. El programa puede dividirse en mltiples funciones segn el propsito y las funciones pueden ser llamadas desde la principal o subfunciones. En un gran proyecto, las funciones tambin se pueden colocar en diferentes archivos de C o archivos de cabecera que se pueden incluir en el archivo principal de C al grupo de las funciones relacionadas con su categora. CCS tambin requiere incluir el archivo de dispositivo apropiado utilizando la directiva # include para incluir el dispositivo de funcionalidad especca. Tambin hay algunas directivas de preprocesador como # fuses para especicar los fusibles para el chip y #use delay para especicar la velocidad de reloj. Las funciones contienen las declaraciones de datos, deniciones, declaraciones y expresiones. El compilador tambin proporciona un gran nmero de libreras estndar de C, as como otros controladores de dispositivo que puede ser incluida y utilizada en los programas. CCS tambin provee un gran nmero de funciones integradas para acceder a los distintos perifricos incluidos en el microcontrolador PIC.

43

44 6.2 Estructura de un programa en C

Gustavo A. Yarce

/* Preambulo */ # include # fuse # use # byte # bit declaracin de funciones denicin de variables globales /* Funcin Principal */ void main(void) { denicin de variables locales; deniciones del PIC; Instrucciones; etc; } /* Funciones secundarias */ funcin 1() { denicin de variables locales instrucciones; etc; } funcin 2() { denicin de variables locales; instrucciones; etc; }

Computadoras Electrnicas CCs

45

Figura 6.1: Compilador CCs

Figura 6.2: Fusibles vlidos

46 6.3 Tipos

Gustavo A. Yarce

El lenguaje C proporciona cinco tipos bsico de datos, con cuatro modicadores posibles. Podemos utilizar variables de cualquiera de esos tipos. La tabla siguiente muestra los tipos disponibles:

Tipo Ancho (Bits) Rango short 1 0o1 short int 1 0o1 int 8 0 a 255 char 8 0 a 255 unsigned 8 0 a 255 unsigned int 8 0 a 255 signed 8 -128 a 127 signed int 8 -128 a 127 long 16 0 a 65536 long int 16 0 a 65536 signed long 16 -32768 a 32767 oat 32 3.4E-38 a 3.4E+38 Tabla 6.1: Tipos de datos

Expresiones

Valor Formato 123 Decimal 123 Octal 0x123 Hex 0b010010 Binario x Carcter \010 Carcter Octal \xA5 Carcter Hex Tabla 6.2: Expresiones

Computadoras Electrnicas Varibles Locales y Globales

47

Si una variable se declara dentro de una funcin, ser visible solo dentro de sta:

funcion1 () { char letra; .... }

En el ejemplo anterior, la variable tipo char llamada letra solo podr utilizarse dentro de la funcin funcion1(). Si intentamos utilizarla fuera de ella, el compilador nos dar un error. Si declaramos una variable fuera de cualquier funcin, el alcance de esta sera global, lo que quiere decir que estar disponible en cualquier parte de nuestro programa. Vemos un ejemplo de este ltimo caso. char letra; main() { .... }

funcion1() { ... }

La variable tipo char llamada letra podr utilizarse dentro de main() o de funcion1().

48 Conversiones entre tipos

Gustavo A. Yarce

CCS nos permite mezclar diferentes tipos de variables dentro de una misma expresin. Y existen un conjunto de reglas que nos permiten saber que de que tipo ser el resultado de la misma. Por ejemplo, el compilador convertir automaticamente a int cualquier expresin que contenga variables char, short o int. Esta conversin solo tiene efecto mientras se realizan los clculos. Las variables en s mismas no cambian su tipo. Las reglas de conversin de tipos hacen que el resultado de una operacin sea siempre el mismo que el de la variable ms larga que intervenga en ella. Sin embargo, podemos forzar a que el resultado sea de un tipo en particular, de la siguiente forma:

(tipo) valor donde tipo es el tipo al que queremos que pertenezca valor.

El siguiente ejemplo nos aclarar todo esto: int a = 250, b = 10; long c; c = a * b; Tal como explicamos, c no contendr el valor 2500 como podra parecer a simple vista, por que el tipo de c no se modica. CCS calcula a * b y obtiene efectivamente el resultado 2500, pero c slo contendr los 8 bits menos signicativos de ese resultado, es decir, el decimal 196. Si hubisemos hecho: int a = 250, b = 10; long c; c = (long) (a * b);

Computadoras Electrnicas el valor almacenado en c hubiese sido efectivamente 2500.

49

6.4

Operadores

En CCS los operadores cumplen un rol importante. Quizs C sea uno de los lenguajes que mas operadores tiene. Una expresin es una combinacin de operadores y operandos. En la mayora de los casos, los operadores de CCS siguen las mismas reglas que en lgebra, y se llaman de la misma manera.

Operador Descripcin += Asignacin de suma -= Asignacin de resta *= Asignacin de multiplicacin /= Asignacin de divisin %= Asignacin de resto de divisin <<= Asignacin de desplazamiento a la izquierda >>= Asignacin de desplazamiento a la derecha &= Asignacin de AND de bits |= Asignacin de OR de bits = Asignacin de OR exclusivo de bits = Asignacin de negacin de bits Tabla 6.3: Operadores de asignacin

50

Gustavo A. Yarce Operador Descripcin Ejemplo + Suma (enteros o reales) resul = var1 + var2 Resta (enteros o reales) resul = var1 - var2 * Multiplicacin (enteros o reales) resul = var1 * var2 / Divisin (enteros o reales) resul = var1 / var2 Cambio de signo en enteros o reales 0 % Mdulo; resto de una divisin entera rango = n [A1] % 256 Tabla 6.4: Operadores aritmticos

Operador < > <= >= == =

Descripcin Menor que Mayor que Menor o igual que Mayor o igual que Igual a Distinto de

Tabla 6.5: Operadores de relacin

Operador ! && ||

Descripcin NO lgico Y lgico O lgico

Tabla 6.6: Operadores lgicos

Operador & |

Descripcin Negacin de bits (complemento a 1) Y de bits (AND) O exclusivo de bits (EXOR) O de bits (OR)

Tabla 6.7: Operadores de manejo de bits

Computadoras Electrnicas 6.5 Prembulo

51

La seccin del prembulo dene, tipo de microcontrolador a utilizar, fusibles, clock, etc. Un ejemplo de esto es:

#include<16f84a.h> #fuses nowdt, xt,put,noprotect #use delay(clock=4000000) #byte port_b = 0x06 #use standard_io(A)

/*Seleccin del PIC*/ /*Configuracin de fusibles*/ /*Velocidad del clock*/ /*Define la direccin del puerto b*/ /*Definicin del puerto A*/

Dentro del prembulo se encuentra la denicin para la funcionalidad de los puertos. Para usar los puertos como entrada o salida digital, CCS provee directivas y funciones predenidas para el uso de los puertos de E/S digital. Las funciones output_X() e input_X() dependen de la directiva de conguracin que usemos. #INCLUDE Permite incluir en nuestro programa uno o mas archivos (conocidos como header le) que posean extensin .h. Estos archivos contienen informacin sobre funciones, sus argumentos, el nombre de los pines de un modelo determinado de PIC o cualquier otra cosa que usemos habitualmente en nuestros programas. Esto permite no tener que escribir un montn de cosas cada vez que comenzamos un programa nuevo: basta con incluir el .h correspondiente. La forma de utilizar esta instruccin es la siguiente: #INCLUDE <archivo>Esto har que el contenido de <archivo>se compile junto con nuestro programa. Por ejemplo: #INCLUDE <PIC16F877A.H>

#FUSE Permite modicar el valor de los fuses del microcontrolador que estamos empleando. Los valores posibles dependen de cada microcontrolador en particular, y los valores posibles se cargan al utilizar #ICNLUDE seguido del archivo correspondiente. La forma de #FUSE es la siguiente: #FUSE opciones donde opciones es una lista de las opciones posibles separadas mediante comas. Antes

52

Gustavo A. Yarce

de seguir, recuerda que puedes ver dentro del archivo con extensin .h correspondiente cuales son los valores posibles para ese microcontrolador. Estn al comienzo del archivo, en forma de comentarios. Algunos valores comunes son: Tipo de oscilador: LP, XT, HS, RC Wach Dog Timer: WDT, NOWDT Proteccin de cdigo: PROTECT, NOPROTECT Power Up Timer: PUT, NOPUT Brown Out Reset: BROWNOUT, NOBROWNOUT #DEFINE La instruccin #dene tiene la siguiente forma:

#DEFINE <label>value <label> es la etiqueta que usaremos en nuestro programa. Y value es el valor que estamos asignando a esta etiqueta. Las instrucciones #DEFINE no generan codigo ASM, si no que el preprocesador realiza los reemplazos que ellas indican en el momento de la compilacin. El uso de #DEFINE permite construir programas ms ordenados y faciles de mantener. Veamos algunos ejemplos de #DEFINE

#DEFINE TRUE 1 Cada vez que en nuestro programa aparezca la etiqueta TRUE, el precompilador la reemplazar por 1.

#DEFINE pi 3.14159265359

Computadoras Electrnicas

53

Cada vez que en nuestro programa aparezca la etiqueta pi, el precompilador la reemplazar por 3.14159265359.

#USE DELAY (CLOCK=frecuencia) Esta directiva indica al compilador la frecuencia del procesador, en ciclos por segundo, a la vez que habilita el uso de las funciones DELAY_MS() y DELAY_US(). Opcionalmente podemos usar la funcin restart_WDT() para que el compilador reinicie el WDT durante el retardo. Ejemplos: #use delay (clock=20000000) #use delay (clock=32000, RESTART_WDT)

6.6

Directivas

Las Directivas que provee CCs: #use fast_io (puerto): No modica el registro TRIS en lecturas y escrituras. Hay que asegurarse de que los pines est congurados correctamente. #use standar_io (puerto): Modica el registro TRIS correspondiente en lecturas y escrituras. (Modo por defecto) #use xed_io (puerto): Congura el puerto y no modica el registro TRIS en lecturas y escrituras.

#include <16f873a.h> #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP #use delay (clock=4000000) #use fixed_io(a_outputs=PIN_A0,PIN_A1) //A0,A1 como salidas en porta #use standard_io(b) #use fast_io(c) void main(void) {

54 int aux; set_tris_c(0xFE); /* puerto c como salida RC0 */

Gustavo A. Yarce

La conguracin como entrada o salida se hace a travs del registro TRISx correspondiente del banco 1 de la memoria. Para congurar los puertos se utiliza la funcin set_tris_X(valor). Se puede leer la conguracin de los puertos con la funcin get_tris_X(valor).

set_tris_A (0x3F)

/* Puerto A como entradas.*/

CCS tiene funciones predenidas para el uso de los puertos de E/S digital. Los parmetros de estas funciones estn denidos en un chero include . Las funciones pueden tratar el puerto completo, a travs de las instrucciones output_X() e input_X(). Tambin se pueden operar a nivel de bit, con un formato PIN_Xn donde X es el puerto y n el bit.

output_low(PIN_Xn) /*pone a 0. */ output_high(PIN_Xn) /*pone a 1. */ output_bit(PIN_Xn,valor) /*pone el pin Xn a valor (0 1). */ output_toggle (PIN_Xn) /*complementa el valor del pin */ output_oat (PIN_Xn) /*Pin como entrada (simula d. ab. */ input_state(PIN_Xn) terminal. */ /*Lee el valor del pin sin cambiar el sentido del

input(PIN_Xn) /*Lee el valor del pin. */

#USE FAST_IO (puerto) Esta directiva afecta al cdigo que el compilador generar para las instrucciones de entrada y salida. Este mtodo rpido de hacer I/O ocasiona que el compilador realice I/O sin programar el registro de direccin. El puerto puede

Computadoras Electrnicas ser A-G. Ejemplo:

55

#use fast_io(A) #USE FIXED_IO (puerto_OUTPUTS=pin_x#, pin_x#...) Esta directiva afecta al cdigo que el compilador generar para las instrucciones de entrada y salida. El mtodo jo de hacer I/O causar que el compilador genere cdigo para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza. Esto ahorra el byte de RAM usado en I/O normal.

Ejemplo:

#use xed_io(a_outputs=PIN_A2 ,PIN_A3) #USE STANDARD_IO (puerto) Esta directiva afecta al cdigo que el compilador genera para las instrucciones de entrada y salida. El mtodo estndar de hacer I/O causar que el compilador genere cdigo para hacer que un pin de I/O sea entrada o salida cada vez que se utiliza. En los procesadores de la serie 5X esto necesita un byte de RAM para cada puerto establecido como I/O estandar.

Ejemplo:

#use standard_io(A) input_x( ) Devuelve el estado del puerto especicado Ejemplo:

56 x=input_a() ;

Gustavo A. Yarce

output_x(valor) Escribe el byte especicado en el puerto indicado. Ejemplo:

valor_a(255) ;

INPUT(pin) Devuelve el estado 0 o 1 del pin. El mtodo de acceso de I/O depende de la ltima directiva #USE *_IO utilizada. El valor de retorno es un entero corto. Ejemplo:

while ( !input(PIN_B1) );

OUTPUT_BIT(pin, value) Esta funcin saca el bit dado en value(0 o 1) por el pin de I/O especicado. El modo de establecer la direccin del registro, est determinada por la ltima directiva #USE *_IO. Ejemplo: output_bit( PIN_B0, 0); // es lo mismo que output_low(pin_B0);

OUTPUT_HIGH(pin) Pone a uno el pin indicado. El mtodo de acceso de I/O depende de la ltima directiva #USE *_IO utilizada.

Ejemplo:

Computadoras Electrnicas output_high(PIN_A0);

57

OUTPUT_LOW(pin) Pone a cero el pin indicado. El mtodo de acceso de I/O depende de la ltima directiva #USE *_IO.

Ejemplo:

output_low(PIN_A0); SET_TRIS_puerto(value) Estas funciones permiten escribir directamente los registros tri-estado para la conguracin de los puertos. Esto debe usarse con FAST_IO() y cuando se accede a los puertos de I/O como si fueran memoria, igual que cuando se utiliza una directiva #BYTE. Cada bit de value representa un pin. Un 1 indica que el pinl es de entrada y un 0 que es de salida.

Ejemplo:

SET_TRIS_B( 0x0F ); delay_ms(time) Esta funcin realiza retardos del valor especicado en time. Dicho valor de tiempo es en milisegundos y el rango es 0-65535. Para obtener retardos ms largos as como retardos variables es preciso hacer llamadas a una funcin separada; vase el ejemplo siguiente. Es preciso utilizar la directiva #use delay(clock=frecuencia) antes de la llamada a esta funcin, para que el compilador sepa la frecuencia de reloj.

Ejemplo:

58 #include <16f628a.h> #fuses xt, nowdt, put #use delay(clock=4000000) #use fast_io(a) void main() { set_tris_a(0b00000000); int ba; output_low(pin_a0); do { delay_ms(1000); ba=input(pin_a0); if (ba==0) output_high(pin_a0); else output_low(pin_a0); } while(0==0); }

Gustavo A. Yarce

ndice alfabtico
acumulador, 29 Call, 37 ciclo de instruccin, 15 contador de programa, 17, 20 direccionamiento, 23 direccionamiento directo, 23 direccionamiento indirecto, 23 EEPROM, 10, 13, 14 EQU, 35 Estado, 27 estado, 20 FLASH, 11, 13, 19 instrucciones, 31 memoria de datos, 20 osciladores, 16 PC, 20, 22 PIC, 24 pic16f873, 13, 14 pila, 22 puerto a, 24 puerto b, 25 puerto c, 26 RAM, 10, 20 registro de estado, 27 reloj, 15 reset, 17 Retardo, 38 59 Return, 37 ROM, 9, 10 Rutina simple, 38 sistema programable, 9 SRAM, 11

También podría gustarte