Computadoras Electronicas

59
I.P.E.T. Juan XXIII Computadoras Electrónicas Gustavo A. Yarce Paraná - Entre Ríos 2011

Transcript of Computadoras Electronicas

Page 1: Computadoras Electronicas

I.P.E.T. Juan XXIII

Computadoras Electrónicas

Gustavo A. Yarce

Paraná - Entre Ríos2011

Page 2: Computadoras Electronicas

2 Gustavo A. Yarce

Page 3: Computadoras Electronicas

Índice general

1. Microcontroladores 91.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.2. Estructura de un microcontrolador . . . . . . . . . . . . . . . . . 10

2. El PIC16f873 132.1. Estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.2. El reloj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.3. Osciladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.4. Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3. Estructura de la memoria 193.1. Memoria de Programa . . . . . . . . . . . . . . . . . . . . . . . . 193.2. Memoria de Datos(RAM) . . . . . . . . . . . . . . . . . . . . . . . 203.3. Registros Específicos - El PC . . . . . . . . . . . . . . . . . . . . . 20

3.3.1. La pila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223.4. Direccionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.5. Los Puertos del PIC . . . . . . . . . . . . . . . . . . . . . . . . . . 243.6. Puerto A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243.7. Puerto B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.8. Puerto C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.9. El Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . 273.10. El acumulador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

4. Lenguaje Ensamblador 314.1. Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314.2. Instrucciones del MPLAB . . . . . . . . . . . . . . . . . . . . . . . 344.3. Estructura de un programa ASM . . . . . . . . . . . . . . . . . . 36

5. Programación 375.1. CALL - RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . 375.2. Rutinas de retardo . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

3

Page 4: Computadoras Electronicas

4 Gustavo A. Yarce

5.2.1. Rutina simple de retardo . . . . . . . . . . . . . . . . . . . 385.2.2. Rutina de demora doble . . . . . . . . . . . . . . . . . . . 395.2.3. Rutina de retardo triple . . . . . . . . . . . . . . . . . . . 41

6. Programación en C de Microcontroladores 436.1. Introducción a CCs . . . . . . . . . . . . . . . . . . . . . . . . . . 436.2. Estructura de un programa en C . . . . . . . . . . . . . . . . . . . 44

6.2.1. CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456.3. Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

6.3.1. Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . 466.3.2. Varibles Locales y Globales . . . . . . . . . . . . . . . . . 476.3.3. Conversiones entre tipos . . . . . . . . . . . . . . . . . . . 48

6.4. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496.5. Preámbulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.6. Directivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

Page 5: Computadoras Electronicas

Índice de figuras

1.1. Estructura de sistema programable . . . . . . . . . . . . . . . . . . . 91.2. Estructura de un microcontrolador . . . . . . . . . . . . . . . . . . . 11

2.1. pic16f873 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.2. Esquema del Ciclo de Instrucción . . . . . . . . . . . . . . . . . . . . 16

3.1. Organización de la memoria de Programa . . . . . . . . . . . . . . . 193.2. Organización de la memoria RAM . . . . . . . . . . . . . . . . . . . 21

6.1. Compilador CCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456.2. Fusibles válidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

5

Page 6: Computadoras Electronicas

6 Gustavo A. Yarce

Page 7: Computadoras Electronicas

Índice de tablas

3.1. Tabla de configuración de bancos . . . . . . . . . . . . . . . . . . 203.2. Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

4.1. Instrucciones orientadas a registros . . . . . . . . . . . . . . . . . 334.2. Instrucciones orientadas a bit . . . . . . . . . . . . . . . . . . . . 334.3. Instrucciones orientadas a literal y conrol . . . . . . . . . . . . . 34

6.1. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466.2. Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466.3. Operadores de asignación . . . . . . . . . . . . . . . . . . . . . . 496.4. Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . 506.5. Operadores de relación . . . . . . . . . . . . . . . . . . . . . . . . 506.6. Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . 506.7. Operadores de manejo de bits . . . . . . . . . . . . . . . . . . . . 50

7

Page 8: Computadoras Electronicas

Prologo

Este documento no pretende ser un libro completo sobre microcontrolado-res, es una ayuda para el alumno, para su utilización como guía de aprendizaje.Se tiene como objetivo presentar los conceptos básicos y las características ge-nerales de los dispositivos microprogramables, para el desarrollo y resoluciónde problemas que se presentan en el ámbito técnico.Los temas tratados y el desarrollo que se realiza sobre ellos persiguen la en-señanza en entornos educativos técnicos de nivel medio que necesitan conoci-mientos sobre estas tecnologías.Se prioriza la enseñanza de una metodología de programación correcta tratan-do de conservar la facilidad de uso como herramienta. Siempre se consideraque lo más importante es adquirir una base de conocimientos que permita unaposterior evolución hacia conocimientos relacionados con la Electrónica y laprogramación.

Page 9: Computadoras Electronicas

Capítulo 1

Microcontroladores

1.1 Introducción

Antes de ver qué es un microcontrolador y de analizar sus puntos fuertesy sus defectos, será útil hacer un repaso relativo a la estructura de cualquiersistema programable, que pueda hacer uso de un microcontrolador.

Figura 1.1: Estructura de sistema programable

La figura 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

Page 10: Computadoras Electronicas

10 Gustavo A. Yarce

La memoria RAM

Los circuitos de interfaz

Un bus de interconexión

La presencia de estos elementos básicos es indispensable y aun cuandono siempre se presenten tan claramente como en nuestro esquema siempreexisten. Obsérvese, que son los mismos que los de un sistema informáticoclásico, pero dentro del marco de una aplicación que pueda ser tratada por unmicrocontrolador.

La unidad central, generalmente constituida por un microprocesador máso menos evolucionado, ejecuta el programa que da vida a la aplicación. Losprogramas pueden ser muy diversos, puesto que, como es evidente, el queasegura la gestión de un termostato inteligente no tiene nada que ver con elque controla el correcto funcionamiento de una fotocopiadora. Sin embargo,estos programas tienen en común el hecho de que muy raramente necesitancálculos complejos y, en cambio, sí suelen incluir numerosas manipulacionesde la información 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 unamemoria no volátil desde la que se ejecutará el programa una vez alimentado elsistema. Para poder trabajar correctamente, nuestro microprocesador necesita,a menudo, almacenar datos temporales en alguna parte, y aquí es dondeinterviene 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 loselementos de la figura 1.1 en un único encapsulado. El esquema básico de unmicrocontrolador sería

Encontramos en él la unidad central pero se ha simplificado con respecto alos microprocesadores clásicos. En contrapartida se le han añadido instruccio-

Page 11: Computadoras Electronicas

Computadoras Electrónicas 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 número de registros internos, quesirven de memoria RAM, por lo que puede parecer que ésta última está ausentede algunos esquemas.

A continuación podemos ver la memoria ROM, aunque ésta no siempreaparece. Cierto número de microcontroladores estaban, y todavía están,disponibles sin ROM (ROMless).

Posteriormente, los fabricantes han introducido en el chip una memoriaprogramable eléctricamente y borrable mediante rayos ultravioleta (UVPROM)o, más recientemente, borrable eléctricamente (EEPROM).

Un último producto para almacenar de forma no volátil son las memoriasFLASH, de bajo consumo, que se puede escribir y borrar en circuito al igualque las EEPROM, pero suelen disponer de mayor capacidad que estas últimas.El borrado solo es posible con bloques completos y no se puede realizar sobreposiciones concretas.

En lo referente a la memoria RAM, suele utilizarse una del tipo SRAM(RAM estática) de pequeño tamaño, por qué generalmente la unidad centralposee suficientes registros para realizar operaciones intermedias. En algunoscasos, esta memoria se completa con una EEPROM de datos, que memoriza deforma semipermanente datos del usuario que se manejan como constante en laejecución del programa y que de vez en cuando (pasados meses o años) deben

Page 12: Computadoras Electronicas

12 Gustavo A. Yarce

ser modificados.

Algo más delicado es hacer un esquema tipo para los circuitos de interfaz,ya que es un punto donde se distinguen los diferentes microcontroladores, enfunción de las aplicaciones que pretenden. No obstante se pueden encontrar lossiguientes elementos básicos:

Líneas de entrada/salida paralelo, en cantidad variable, según la finalidady el tamaño del encapsulado (se plantea un problema de número máximode pines debido al crecimiento del número de estas líneas).

Al menos una interfaz de entrada/salida serie asíncrona, más o menosevolucionada según los circuitos.

Uno o varios temporizadores internos cuyas posibilidades pueden sermuy variables pero que, generalmente, funcionan como contadoresascendentes y descendentes, generadores de impulsos programables, etc.

Uno o varios convertidores analógicos/digitales, precedidos o no demultiplexores para ofrecer varias vías.

A veces, pero es raro, un covertidor digital/analógico.

Por último, aunque no sea una verdadera interfaz de entrada/salida enel sentido en que nosotros entendemos, ciertos microcontroladores disponende un acceso a su bus interno. Esto permite conectar con otros circuitosdestinados a cumplir funciones que faltan en el chip, lo que a veces resulta útil.Precisemos, aunque es evidente, que todos los microcontroladores sin memoriaROM interna disponen necesariamente de esta interfaz, puesto que es necesariopermitirle acceder a una memoria ROM externa.

Page 13: Computadoras Electronicas

Capítulo 2

El PIC16f873

2.1 Estructura

Microcontrolador diseñado por la empresa Microchip (http://www.microchip.com),que se fabrica en varias versiones de las cuales se analizará con más detalle elpic16f873. Son idénticas en cuanto a su arquitectura interna todos los pic de lafamilia 16f87x a excepción de la memoria ROM y la memoria RAM y puertos.

La memoria EEPROM y la Flash son eléctricamente grabables y borrables,lo que permite escribir y borrar el programa bajo prueba manteniendo elmicrocontrolador en el mismo zócalo y usando el mismo dispositivo para grabary borrar. Esta característica supone una gran ventaja frente a la mayoría de losmicrocontroladores, que tienen como memoria de programa reescribible unatipo EPROM. Se graba eléctricamente, pero para borrarlas hay que someterlasdurante cierto tiempo a rayos ultravioleta, lo que implica sacar del zócalo elcircuito integrado y colocarlo en un borrador de EPROM.

Otra ventaja del PIC16F873 en cuanto a simplificar el proceso de escritura,borrado y reescritura de programas, tan necesario en la fase de diseño, es susistema de grabación de datos, que se realiza en serie. Para escribir un programaen la memoria se manda la información en serie usando sólo dos pins, unapara la señal de reloj y otra para los datos serie. A continuación exponemoslas características más significativas:

Frecuencia de operación 20 MHz

Memoria FLASH de programa (palabra de 14 bits) 4k

13

Page 14: Computadoras Electronicas

14 Gustavo A. Yarce

Memoria de datos 192 bytes

Memoria de datos EEPROM 128 bytes

Interrupciones 13

Puertos de E/S Puertos A, B, C

Temporizadores 3

Módulos de Captura/Comparacion/PWM 2

Comunicación serial tipo MSSP, USART

Módulo de conversión Análogo-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 laFigura 2.1 y la descripción de cada pin se muestran en el cuadro

Figura 2.1: pic16f873

Page 15: Computadoras Electronicas

Computadoras Electrónicas 15

2.2 El reloj

La frecuencia de trabajo del microcontrolador es un parámetro fundamentala la hora de establecer la velocidad de ejecución de instrucciones y el consumode energía.

Cuando un PIC16F873 funciona a 20 MHz, que es su máxima frecuencia,le corresponde un ciclo de instrucción de 200 ns, puesto que cada instruccióntarda en ejecutarse 4 períodos de reloj, o sea,

Ciclo de instruccion =4

fOSC=

420MHZ

= 200ns

Todas las instrucciones del PIC se realizan en un ciclo de instrucción, menoslas de salto que tardan el doble.

Los impulsos de reloj entrar por la pin OSC1/CLKIN y se dividen por 4internamente, dando lugar a las señales Q1, Q2, Q3 y Q4. Durante un ciclo deinstrucción, que comprende las cuatro señales mencionadas, se desarrollan lassiguientes operaciones:

Q1: Durante este impulso se incrementa el Contador de Programa.

Q4: Durante este impulso se busca el código de la instrucción en lamemoria del programa y se carga en el Registro de Instrucciones.

Q2-Q3: Durante la activación de estas dos señales se produce la decodifi-cación y la ejecución de la instrucción.

Para conseguir ejecutar cada instrucción en un ciclo de instrucción (exceptolas de salto), se aplica la técnica de segmentación o pipe-line, que consiste enrealizar en paralelo las dos fases que comprende cada instrucción.

La estructura segmentada del procesador permite realizar al mismo tiempola fase de ejecución de una instrucción y la de búsqueda de la siguiente.Cuando la instrucción ejecutada corresponde a un salto no se conoce cuál serála siguiente hasta que se realice, por eso en esta situación se sustituye la fase debúsqueda por un ciclo “vacio”, originando que las instrucciones de salto tardeen realizarse dos ciclos de instrucción.

Page 16: Computadoras Electronicas

16 Gustavo A. Yarce

Figura 2.2: Esquema del Ciclo de Instrucción

2.3 Osciladores

Los PIC admiten cuatro tipos de osciladores externos para aplicarles lafrecuencia de funcionamiento, se colocan entre las pins OSC1 y OSC2. El tipoempleado debe especificarse en dos bits de la “Palabra de Configuración”, comose comentará más adelante. Los tipos que se pueden emplear son:

Oscilador RC: Es un oscilador de bajo coste formado por una simpleresistencia y un condensador. Proporciona una estabilidad mediocre dela frecuencia, cuyo valor depende de los valores de los dos elementos R-C.

Oscilador HS: Es un oscilador que alcanza una alta velocidad comprendi-da entre 4 y 10 MHz y está basado en un cristal de cuarzo o un resonadorcerámico.

Oscilador XT: Es un oscilador de cristal o resonador para frecuenciasestándar comprendidas entre 100 KHz y 4 MHz.

Oscilador LP: Oscilador de bajo consumo con cristal o resonador diseñadopara trabajar en un rango de frecuencias de 35 a 200 KHz.

Page 17: Computadoras Electronicas

Computadoras Electrónicas 17

2.4 Reset

Cuando se aplica un nivel lógico bajo a la pin MCLR# el microcontroladorreinicializa su estado. Dos acciones importantes se producen en la reinicializa-ción o Reset:

1. El Contador de Programa se carga con la dirección 0, apuntando a laprimera dirección de la memoria de programa en donde deberá estarsituada la primera instrucción del programa de aplicación.

2. la mayoría de los registros de estado y control del procesador toman unestado conocido y determinado.

Se puede provocar el Reset de varias maneras, pero si se desea realizarmanualmente, habrá que colocar, conectado al pin MCLR#, que al ser apretadogenere un nivel lógico bajo.

Page 18: Computadoras Electronicas

18 Gustavo A. Yarce

Page 19: Computadoras Electronicas

Capítulo 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 páginas de 2K y esta direccionado con el PC(3.3),que tiene un tamaño de 13 bits.

Figura 3.1: Organización de la memoria de Programa

19

Page 20: Computadoras Electronicas

20 Gustavo A. Yarce

3.2 Memoria de Datos(RAM)

La memoria RAM de datos de los PIC 16F873 posee una capacidad de 192bytes, 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 RP00 0 01 0 12 1 03 1 1

Tabla 3.1: Tabla de configuración de bancos

La memoria de datos tiene posiciones implementadas en RAM y EEPROM,

1. Area de RAM estática o SRAM, se alojan los registros operativos funda-mentales en el funcionamiento del procesador y en el manejo de todoslos periféricos y registros que el se pueden como información de trabajopropia de la aplicación.

2. Area EEPROM, de 64 bytes donde, opcionalmente, se pueden almacenardatos que no se pierden al deconectar la alimentación.

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 losRegistros Específicos que gobiernan al procesador y sus recursos

3.3 Registros Específicos - El PC

Los 13 bits contenidos en el PC, que direccionan la memoria de código, estánguardados en dos registros específicos. El registro PCL(02h) guarda los 8 bits demenos peso y se puede leer y escribir. Los bits <12:8>del PC se alojan en PCH,

Page 21: Computadoras Electronicas

Computadoras Electrónicas 21

Figura 3.2: Organización de la memoria RAM

que al no poder ser leído ni escrito, se accede a él a través del PCLATH(0Ah).

Las instrucciones de salto CALL y GOTO sólo proporcionan 11 bits de ladirección a saltar, esto es una limitante del tamaño del salto que se puedeproducir, siendo su tamaño máximo de 2K.Al resetearse el PIC, todos los bits del PC toman valor 1, de manera que ladirección de arranque del programa es siempre la ultima posición de memoriade programa. En esta posición se deberá poner una instrucción de salto al puntodonde verdaderamente se inicia el programa. A diferencia de la mayoría de los

Page 22: Computadoras Electronicas

22 Gustavo A. Yarce

microprocesadores convencionales, el PC es también accesible al programadorcomo registro de memoria interna de datos, en la posición de 02. Es decir quecualquier instrucción común que opere sobre registros puede ser utilizada paraalterar el PC y desviar la ejecución del programa. El uso indiscriminado de estetipo de instrucciones complica el programa y puede ser muy peligroso, ya quepuede producir comportamientos difíciles de predecir. Sin embargo, algunasde esta instrucciones utilizadas con cierto método, pueden ser muy útiles paraimplementar poderosas estructuras de control tales como el goto computado.Como el PIC opera con datos de 8 bits, y la memoria de datos es también de 8bits, estas instrucciones solo pueden leer o modificar los bits 0 a 7 del PC.

Para saltar entre una página y otra, los bits más significativos del PCdeberán ser modificados. Debido a que las instrucciones GOTO y CALL sólopueden direccionar un bloque de 2K (pues usan una dirección de 11 bits)deben existir otros dos bits que completen los 13 bits del PC para moversesobre los 4K de memoria de programa. Estos dos bits extra se encuentranen un SFR denominado PCLATH (Program Counter Latch High) en sus bitsPCLATH<4:3>. Por esto antes de un GOTO o un CALL el usuario deberáasegurarse que estos bits apunten a la página deseada. Si las instruccionesse ejecutan secuencialmente el PC cruza libremente los límites de página sinnecesidad de que el usuario escriba en el PCLATH.

La pila

La memoria de stack o pila es una area de memoria completamente separadade la memoria de datos y la memoria de programa. El stack consta de 8niveles de 13 bits cada uno. Esta memoria es usada por la CPU para almacenarlas direcciones de retorno de subrutinas. El apuntador de stack no es nilegible ni escribible. Cuando se ejecuta una instrucción CALL o es reconocidauna interrupción el PC es guardado en el stack y el apuntador de stack esincrementado en 1 para apuntar a la siguiente posición vacía. A la inversa,cuando se ejecuta una instrucción RETURN, RETLW o RETFIE el contenidode la posición actual del stack es colocado en el PC.

El Stack o Pila, es una zona de memoria, transparente al usuario, conla cual se salvan las direcciones cuando se ejecuta la instrucción CALL ylas interrupciones, en esta zona se guarda el valor del PC(3.3). Es de vitalimportancia no sobrepasar el límite de 8 niveles en la realización de programas.PCLATH no se modifica en ninguna de estas operaciones y cuando el apuntadorde stack ya está en la posición 8 y se ejecuta otro CALL se reinicia a la posición1 sobrescribiendo en dicha posición. No existe ningún indicador que avise de

Page 23: Computadoras Electronicas

Computadoras Electrónicas 23

esta situación.

3.4 Direccionamiento

En los PIC de gama media la memoria de datos está organizada para alojarun máximo de 4 bancos de 128 bytes cada uno. Los PIC16C84 sólo tienenimplementados los 48 primeros bytes de los bancos 0 y 1. En el resto de losPIC de esta familia se destinan dos bits del registro ESTADO (RP0 y RP1) paradeterminar el banco y otros siete

para elegir una de las 128 posiciones del banco seleccionado, tal y comomuestra la figura 8.

Direccionamiento Directo: El operando que utiliza la instrucción en cursose referencia mediante su dirección, que viene incluida en el código OP dela misma, concretamente en los 7 bits de menos peso. El banco a accederlo determinan los bits RP0 y RP1 del registro ESTADO. En el caso delPIC16C84 sólo se usa el bit RP0 al tener implementados únicamente dosbancos. Se accede a la RAM de forma inmediata. La dirección de RAM a laque se quiere acceder está implícita en la propia instrucción. Por ejemplo:MOVWF 20 realiza una operación de escritura en la dirección 0x20. Estemodo de direccionamiento es el más habitual.

Direccionamiento Indirecto: Este modo de direccionamiento se usacuando en una instrucción se utiliza como operando el registro INDF,que ocupa la dirección =de ambos bancos. En realidad el registro INDFno está implementado físicamente y cuando se le hace referencia, seaccede a la dirección de un banco especificada con los bits de menospeso del registro FSR. El bit de más peso de FSR junto al bit IRP delregistro ESTADO se encargan de seleccionar el banco a acceder, mientrasque los 7 bits de menos peso apuntan a la posición. Como sólo hay dosbancos en el PIC16C84 en este modo de direccionamiento, el bit IRP es0 siempre. En este modo de direccionamiento se utilizan dos registrosespeciales: FSR y INDF. FSR es un puntero de RAM, es decir, contiene ladirección de memoria a la que se desea acceder. El registro INDF, utilizael valor del registro FSR para acceder al registro deseado. Por ejemplo: siescribimos 20 en FSR y después escribimos 215 en INDF, habremos escritoun 215 en la dirección de memoria 20 (que era la que contenía FSR).El direccionamiento indirecto se usa para manejar tablas ó manipular

Page 24: Computadoras Electronicas

24 Gustavo A. Yarce

segmentos de memoria. Por ejemplo, Podemos programar un bucle, enel cual, incrementamos el valor de FSR para acceder a unas direcciones dememoria consecutivas.

3.5 Los Puertos del PIC

Los PIC16f873 disponen de tres puertos de E/S. La Puerta B tiene 8 líneas,RB0-RB7, y también tiene una con funciones multiplexadas, la RB0/INT, que,además de línea típica de E/S, también sirve como pin por la que reciben losimpulsos externos que provocan una interrupción. Además tenemos el puertoC, con 8 líneas.

Cada línea de E/S puede configurarse independientemente como entradao como salida, según se ponga a 1 o a 0, respectivamente, el bit asociado delregistro de configuración de cada puerta (TRISA, TRISB y TRISC). Se llamanPORTA, PORTB y PORTC los registros que guardan la información que entra osale por la puerta y ocupan las direcciones 5 y 6 del banco 0 de la memoria dedatos. Los registros de configuración TRISA, TRISB Y TRISC ocupan las mismasdirecciones pero en el banco 1. Al reiniciarse el PIC todos los bits de los registrosTRIS quedan a 1, con lo que las líneas de las puertas quedan configuradas comoentradas. Cada línea de salida puede suministrar una corriente máxima de 20mA y si es de entrada puede absorber hasta 25 mA. Al existir una limitación enla disipación máxima de la potencia del chip se restringe la corriente máximade absorción de la Puerta A a 80 mA y la de suministro a 50 mA. La Puerta Bpuede absorber un máximo de 150 mA y suministrar un total de 100 mA.

3.6 Puerto A

La Puerta A posee 6 líneas, RA0-RA5, y soportan funciones multiplexadas.Son bidireccionales y dependen del valor del registro TRISA. Los pinesRA0/AN0,RA1/AN1 y RA2/AN2, además de líneas de E/S digitales tambiénpueden actuar como los canales 0,1 y 2 por los que se pueden utilizar comoentradas al conversor A/D.

Page 25: Computadoras Electronicas

Computadoras Electrónicas 25

El pin RA3/AN3,Vref+ puede actuar como entrada de la tensión de referenciapara los periféricos que la precisan. El pin RA4/TOCKI, que puede actuar comolínea de E/S o como el pin por la que se reciben los impulsos que debe contarTMR0.

Las líneas RA3-RA0 admiten niveles de entrada TTL y de salida CMOS. Lalínea RA4/TOCKI dispone de un circuito Trigger Schmitt que proporciona unabuena inmunidad al ruido y la salida tiene drenador abierto. RA4 multiplexasu función de E/S con la entrada de impulsos externos para el TMR0. En elcircuito de la figura 9 se muestra la adaptación de las pins RA3-RA0 a lasseñales internas del procesador.

Cuando se lee una línea de la Puerta A se recoge el nivel lógico que tieneen ese momento. Las líneas cuando actúan como salidas están conectadas aunos biestable, lo que significa que sus pins sacan el nivel lógico que se hayacargado por última vez en el registro PUERTAA. La escritura de una puerta,tal y como se ve en la figura 9, implica que primero se deposita el nivellógico en la línea correspondiente del bus interno de datos y se activa la señalWRITE, lo que origina el almacenamiento de dicho nivel en el biestable. En estasituación, el biestable de configuración (TRIS) debería tener valor 0 para queactuase como salida. Con estos valores la puerta OR tendría un 0 a su saliday la AND también. Estos valores producen la conducción de los transistoresMOS, en función del valor escrito, dando como salida final VDD o VSS (1 ó 0respectivamente).

Si una línea actúa como entrada, el nivel lógico depositado en ella desdeel exterior pasa a la línea correspondiente del bus interno de datos cuandose activa la señal READ y se hace conductor el dispositivo triestado que lesune. Al programarse como entrada, los dos transistores MOS de salida quedanbloqueados y la línea de alta impedancia. Téngase en cuenta que cuando se leeuna línea 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 biestablede datos. La información presente en una línea de entrada se muestrea aliniciarse el ciclo de instrucción y debe matenerse estable durante su desarrollo.

Cuando se produce un RESET al conectar la tensión de alimentación(PowerOn Reset) todas las patitas de la puerta A quedan configuradas como canalesde entrada para el conversor A/D y son leídas como 0. Para que el PORTAfuncione como líneas de E/S digitales se debe configurar el valor adecuado enel ADCON1, en general se suele cargar en dicho registro el valor 011x en sus 4bits de menos peso.

Page 26: Computadoras Electronicas

26 Gustavo A. Yarce

3.7 Puerto B

Consta de 8 líneas bidireccionales de E/S, RB7-RB0, cuya información sealmacena en el registro PORTB, que ocupa la dirección 6 del banco 0. El registrode configuración TRISB ocupa la misma dirección pero del banco 1. La líneaRB0/INT tiene dos funciones multiplexadas; además de pin de E/S actúa comola pin para la petición de una interrupción externa, cuando se autoriza estafunción mediante la adecuada programación del registro INTCON.

Las cuatro líneas de más peso, RB7-RB4, pueden programarse para soportaruna misión especial. Cuando las 4 líneas actúan como entradas se las puedeprogramar para generar una interrupción si alguna de ellas cambia su estadológico. Esta posibilidad es muy práctica en el control de teclados. En la figura10 se muestra el esquema de conexionado entre las pins RB7-RB4 y las líneascorrespondientes del bus interno.

El estado de las pins RB7-RB4 en modo de entrada se compara con el valorantiguo que tenían y que se había almacenado en un biestable durante la últimalectura de la Puerta B. El cambio de estado en alguna de esas líneas originauna interrupción y la activación del señalizador RBIF. La línea RB6 también seutiliza para la grabación serie de la memoria de programas y sirve para soportarla señal de reloj. La línea RB7 constituye la entrada de los datos en serie.

Los pines del puerto B disponen de una resistencia interna de pull-up alpositivo de la alimentación, que queda conectada cuando el bit RBPU#, que esel bit 7 del registro OPTION, tiene el valor 0. Las resistencias pull up se utilizanpara forzar a un nivel alto una entrada de un componente lógico. Sirve porejemplo cuando necesitas leer el estado de un interruptor o una tecla. Cuando latecla se activa se lleva a un estado lógico determinado, pero cuando está abiertaestá al aire y los circuitos lógicos hacen una interpretación indeterminada. Laresistencia pull up fuerza a nivel lógico alto cuando está abierta y permite quese lleve a nivel bajo al cerrarse sin producir un cortocircuito. También puedeservir cuando se conecta una entrada a una salida de colector abierto. El pullup suple la resistencia faltante del driver de colector abierto

3.8 Puerto C

Consta de 8 líneas bidireccional cuyo sentido se configura mediante elregistro TRISC,

Page 27: Computadoras Electronicas

Computadoras Electrónicas 27

El Puerto C tiene varias funciones en sus pines, tiene las funciones decomunicacion I2C, el reloj externo del timer 1, Usart, etc.

Cuando se usan los módulos relacionados con este puerto, se debe tenercuidado pues algunas veces cambia el estado E/S del pin sin importar lo queindique TRISC, para saber cuando si cambiaría debemos ver la descripción decada módulo.Todos los buffers de este puerto son del tipo Schmitt Trigger, además poseen lassiguientes funciones multiplexadas:

RC0/T1OSO/T1CKI: E/S, puede ser también salida del Timer1 ó entradadel impulsos para el Timer1.

RC1/T1OSI/CCP2: E/S, puede ser también entrada al oscilador delTimer1 ó entrada al módulo de captura 2, salida del comparador 2 , salidade PWM2.

RC2/CCP1: E/S, puede ser también entrada captura 1, salida comparador1 o salida PWM1.

RC3/SCK/SCL: E/S, puede ser también señal de reloj en modo SPI ó señalde reloj en modo I2C.

RC4/SDI/SDA: E/S, puede ser también entrada de datos en modo SPI oSeñal de reloj en modo I2C.

RC5/SD0: E/S, puede ser también salida de datos en modo SPI.

RC6/TX/CK: E/S, línea de transmisión eb USART ó señal de reloj síncronaen transmisión serie.

RC7/RX/DT: E/S, línea de recepción USART ó línea de datos entransmisión serie síncrona.

3.9 El Registro de Estado

Hasta ahora ESTADO es el registro más usado y llega el momento dedescribirlo en su totalidad. Ocupa la dirección 3 tanto del banco 0 como del1 de la memoria de datos RAM. Sus bits tienen tres misiones distintas:

Page 28: Computadoras Electronicas

28 Gustavo A. Yarce

1. Se encargan de avisar de la incidencias del resultado de la ALU (C, DC yZ).

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 distribución de los bits del registroESTADO, su misión es la siguiente:

IRP RP1 RP0 T0# PD# Z DC c7 6 5 4 3 2 1 0

Tabla 3.2: Registro de Estado

C: Acarreo en el bit de más peso1: Acarreo en el bit de más peso.0: No acarreo en el bit de más peso.

DC: Acarreo en el 4º bit1: Acarreo en el 4º bit.0: No acarreo en el 4º bit.

Z: Cero1: El resultado de una instrucción lógico-aritmética ha sido cero.0: El resultado de una instrucción lógico-aritmética no ha sido cero.

PD#: Power Down1: Se pone a este valor después de la conexión a la alimentación o al eje-cutar clrwdt.0: Se pone a este valor al ejecutar sleep.

Page 29: Computadoras Electronicas

Computadoras Electrónicas 29

TO#: Time Out1: Se pone a este valor después de la conexión a la alimentación o al eje-cutar clrwdt y sleep.0: Se pone a este valor al desbordarse el Perro Guardián (Watchdog).

RP1-RP0: Selección de banco en direccionamiento directoEl PIC16F873 tiene cuatro bancos, emplea el bit RP0 y RP1, de forma quese puede acceder a cualquier banco.

IRP: Selección del banco en direccionamiento indirectoEste bit junto con el de más peso del registro FSR sirven para determinarel 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, seutiliza para mover un dato/valor de un registro a otro, cargar valores en unregistro, y con la ayuda de la ALU puede hacer operaciones matemáticas. Elregistro W no está implementado en la memoria RAM en la posición 0x00 ni enotra posición. W es un registro independiente que tiene un bus directo con laALU (un camino privado). La ALU es la única entidad que puede leer o escribireste registro de trabajo.

Page 30: Computadoras Electronicas

30 Gustavo A. Yarce

Page 31: Computadoras Electronicas

Capítulo 4

Lenguaje Ensamblador

4.1 Instrucciones

El juego de instrucciones de un microprocesador o microcontrolador es elconjunto de entradas binarias que producen acciones definidas durante un ciclode instrucción. Un juego de instrucciones es para el microcontrolador lo mismoque una tabla de verdad es para una puerta lógica, un registro de desplazamien-to o un sumador. Por supuesto, las acciones que realiza un microcontroladorcon cada instrucción, son más complejas que las que realizan los dispositivos ypuertas antes mencionados.

Una instrucción es un patrón de dígitos binarios el cual debe estar adisposición del microcontrolador en el tiempo y forma que éste lo requiera.

Por ejemplo, cuando el procesador de un microcontrolador PIC16F84Arecibe el patrón binario de 12 bits ’0000 0100 0000’ en el momento adecuado,significa: Clear (borrar o poner a cero) el registro W, y corresponde a lainstrucción CLRW.

Para los PIC se han creado unas instrucciones y una estructura de programaque los hacen más sencillos y atractivos todavía..

Las instrucciones de los microcontrolador PIC cumplen con las siguientescondiciones:

Juego de instrucciones reducido: Por ejemplo, solo existen 35 instruccio-nes en el PIC16F873.

Sencillas y rápidas: La mayoría se ejecuta en un ciclo de instrucción, y sololas de salto precisan 2 ciclos. El ciclo de instrucción consta de 4 ciclos de

31

Page 32: Computadoras Electronicas

32 Gustavo A. Yarce

reloj principal. De esta manera un dispositivo con un cristal de cuarzo de20 MHz realiza 5 millones de instrucciones por segundo.

Ortogonalidad: La ubicación de los operandos que manejan es muyflexible. Cualquier objeto del procesador puede actuar como origen ocomo destino.

Formato uniforme de las instrucciones: Todas las instrucciones tienen unalongitud fija de bits. Esta característica significa un notable ahorro de lamemoria de programa y una facilidad en la construcción de compiladores.

Formato uniforme de los datos.

Un programa es una serie de instrucciones mediante las cuales un sistemabasado en CPU realiza una tarea en particular y la forma mas simple derealizar un programa es mediante el lenguaje ensamblador (Ver Sistemasmicroprogramables, Lenguajes de programación para sistemas basados enCPU).

Podríamos decir que el lenguaje ensamblador “es complejo por su sencillez”.Esto quiere decir que, a diferencia de los lenguajes de alto nivel, aquí nohay funciones que solucionen y simplifiquen algoritmos, si no que hay queimplementar hasta los pasos más elementales.

Notas:

Al modificar un registro de E/S con una operación sobre él mismo (porejemplo MOVF PORTB,1), el valor utilizado es el que se halle presente enlas patillas del PORTB. Por ejemplo, si el biestable tiene un “1” para unapatilla configurada como entrada y se pone a nivel bajo desde el exterior,el dato se volverá a escribir como “0”.

Si se ejecuta esta instrucción sobre el TMR0 y d=1, se borrará el conteode la preescala asignada (preescaler), si está asignado al TMR0, pero no seborrará la preescala asignada en OPTION_REG, que controla Timer0.

Page 33: Computadoras Electronicas

Computadoras Electrónicas 33

Mnemónicos Descripción Flags CiclosADDWF f,d w + f→ d C, DC, Z 1ANDWF f,d w AND f→ d Z 1

CLRF f 00 h→ f Z 1CLRW f 00 h→ w Z 1

COMF f,d Complemento de f→ d Z 1DECF f,d f - 1→ d Z 1

DECFSZ f,d f - 1→ d (si es 0 salta) Ninguna 1(2)INCF f,d f + 1→ d Z 1

INCFSZ f,d f + 1→ d (si es 0 salta) Ninguna 1(2)IORWF f,d w OR f→ d Z 1MOVF f,d f→ d Z 1MOVWF f w→ f Ninguna 1

NOP - No operación Ninguna 1RLF f,d Rota f izq por carry→ d C 1RRF f,d Rota f dcha por carry→ d C 1

SUBWF f,d f - w→ d C,DC,Z 1SWAPF f,d Intercambia nibbles de f→ d Ninguna 1

Tabla 4.1: Instrucciones orientadas a registros

Mnemónicos Descripción Flags CiclosBCF f,b Pone a 0 bit b de registro f Ninguna 1BSF f,b Pone a 1 bit b de registro f Ninguna 1

BTFSC f,b Salto si bit b de reg. f es 0 Ninguna 1(2)BTFSS f,b Salto si bit b de reg. f es 1 Ninguna 1(2)

Tabla 4.2: Instrucciones orientadas a bit

Si se modifica el Contador de Programa PC o una condición de prueba esverdadera, la instrucción requiere dos ciclos máquina. El segundo ciclo seejecuta como un NOP.

En las tablas siguientes, por orden alfabético, veremos todos los datos de interéssobre las 35 instrucciones.

Algunos son de poca importancia. En cambio otros, como la operación,la sintaxis, el comportamiento del registro STATUS y los ejemplos, sonimprescindibles para comprender su funcionamiento.

Aparte de estas 35 instrucciones, hay otro tipo de instrucciones usadas parasimplificar la tarea de programar, y que generalmente están formadas por dos

Page 34: Computadoras Electronicas

34 Gustavo A. Yarce

Mnemónicos Descripción Flags CiclosADDLW k w + k→ w C,DC,Z 1ANDLW k w AND k→ w Z 1

CALL k Llamada a subrutina k Ninguna 2CLRWDT - Borra temporizador del WDT TO,PD 1

GOTO k Ir a dirección k Ninguna 2IORLW k w OR k→ w Z 1

MOVLW k k→ w Ninguna 1RETFIE - Retorno de una interrupción Ninguna 2RETLW k Retorno con k en w Ninguna 2RETURN - Retorno de una subrutina Ninguna 2

SLEEP - Modo Standby TO, PD 1SUBLW k k - w→ w C,DC,Z 1XORLW k w XOR k→ w Z 1

Tabla 4.3: Instrucciones orientadas a literal y conrol

instrucciones básicas. Estas no las trataremos a fondo, pero las veremos en unresumen después de comprender el funcionamiento de las 35 instruccionesbásicas.

4.2 Instrucciones del MPLAB

No son propiamente instrucciones del microcontrolador, sino que soncomandos insertados en el programa que controlan el proceso de ensambladoEstos comandos no tienen traducción al código máquina. Suelen escribirse enla segunda columna.

Algunas de estas “pseudoinstrucciones” son:

END: Indica fin del programa. Es el único comando obligatorio ya queel ensamblador necesita saber donde termina el proceso de ensamblado.Se pone en la última línea del programa. Todas las líneas posterioresa la línea en la que se encuentra esta directiva son ignoradas y no seensamblan.

Page 35: Computadoras Electronicas

Computadoras Electrónicas 35

ORG: Su sintaxis es:

[<label>] ORG <expr>

Indica al programa ensamblador a partir de que posición de memoria deprograma tiene que ensamblar las instrucciones. Ejemplo: ORG 0x04Si las instrucciones de un programa comienzan a escribirse sin indicarORG, el ensamblador toma por defecto ORG 0x00. Pueden escribirsevarios ORG en el mismo programa

EQU. Su sintaxis es:

<label>EQU <expr>

Es una etiqueta de asignación. El valor <expr>es asignado a la etiqueta<label>. Usualmente las asignaciones EQU se ponen al principio delprograma (antes que las instrucciones). Siempre que <label>aparece enel programa es sustituido por el valor numérico de la expresión que se lehaya asignado.

_ CONFIG. Esta directiva indica la configuración elegida para el procesode grabación del microcontrolador.Ejemplo:

_CONFIG _CP_OFF & _WDT_OFF & PWRTE_ON & _XT_OSC

En este caso la configuración elegida es:

• No hay protección de código (_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)

Page 36: Computadoras Electronicas

36 Gustavo A. Yarce

4.3 Estructura de un programa ASM

E general la estructura del programa en ensamblador tiene, 3 columnasobligatoria, la primer columna es la “ETIQUETA” y sirve para darle el nombrea una posición de la memoria del programa al que se necesita apuntar(EQU.La segunda columna, se llama “INSTRUCCIÓN” y lo que justamente hace,es una instrucción a realizar por el programa. La tercera columna, se llama“OPERANDO” y es el operando de una instrucción, o sea, de la segundacolumna. Hay instrucciones que no tienen operando.

Opcionalmente se puede incluir un cuarta columna, llamada “OBSERVA-CIONES” y sirve solo para el usuario, el que está programando el PIC. Comien-zan con un “;” (punto y coma)

Page 37: Computadoras Electronicas

Capítulo 5

Programación

5.1 CALL - RETURN

La instrucción CALL ( llamada la subrutina) consigue que la ejecución delprograma continúe en la dirección donde se encuentra la subrutina a la que hacereferencia. Es similar a GOTO pero coloca en la pila la dirección de la siguienteinstrucción que se debe ejecutar después de la CALL. La subrutina finalizacon la instrucción RETURN (Retorno de la subrutina) que retoma la direcciónguardada en le pila y la coloca en el contador del programa PC continuando elflujo de control con la instrucción que sigue a la CALL.

En la familia PIC de gama media la pila tiene ocho niveles de memoriadel tipo FIFO (primero en entrar, último en salir). Si se produce la llamada auna subrutina durante la ejecución de otra subrutina, la dirección de retornode esta segunda es colocada en la cima de la pila sobre la dirección anterior.Esta segunda dirección es la primera en salir de la pila mediante la instrucciónRETURN. Con la pila de ocho niveles, una subrutina puede llamar a otra yésta, a su vez, llamar a otra hasta un máximo de ocho. La gama baja sólo puederealizar dos llamadas de este tipo al poseer una pila de sólo dos niveles. Lassubrutinas deben colocarse al comienzo de las páginas debido a que el bit 8 delcontador del programa es puesto a 0 por la instrucción CALL (o por cualquierinstrucción que modifica el PC). Las subrutinas deben colocarse en la mitadinicial de las páginas (las 256 palabras).

37

Page 38: Computadoras Electronicas

38 Gustavo A. Yarce

5.2 Rutinas de retardo

Rutina simple de retardo

Una rutina de simple puede ser implementada como:

call retardo ;llama a la rutina de retardo

retardo movlw .k1 ;carga k1 en el acumuladormovwf mem1 ;guarda el valor del w en mem1

r1 decfsz mem1,1 ;decrementa mem1goto r1 ;se ejecuta esta inst. si dec. no es ceroreturn

Cuando ejecuta la instrucción “Call” esta lleva en ejecutarse 2 ciclos. Cuandoesta dentro de la rutina “retardo” se encuentra con la instrucción “movlw.k1” que consume 1 ciclo, luego ejecuta la instrucción “movwf mem1” queconsume 1 ciclo. Luego se ejecuta la parte principal de la rutina de demora,las instrucciones “decfsz mem1,1” y la instrucción “goto r1” se ejecutan (k1-1) veces, ya que mienstras esta decrementado y no llega a cero no se saltea lainstrucción goto, por lo tanto mienstras no de cero el decremento la instruccióndecfsz consume 1 ciclo y la instrucción goto 2, por lo tanto,(k1-1 )*3 ciclosle lleva realizar este decremento, cuando llego a cero la instrucción decfszconsume 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 instrucción “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 perído es 2,5e7; cada instrucción consume 4 ciclos, por lo que eltiempo que tarda en ejecutarse cada instrucción es 4 ∗ 2,5e − 7 = 1e−6.

La secuencia de demora es {3 ∗ 254 + 2 = 764}, el máximo tiempo que puederealizar la demora es

(2 + 1 + 1 + 3 ∗ 254 + 2 + 2) = 770ciclos

Lo que lleva un tiempo de 770 u seg.

Page 39: Computadoras Electronicas

Computadoras Electrónicas 39

Rutina de demora doble

Una rutina de doble puede ser implementada como:call retardo ;llama a la rutina de retardo

retardo movlw .k2 ;{1}movwf mem2 ;{2}

r2 movlw .k1 ;{3} carga k1 en el acumuladormovwf mem1 ;{4} guarda el valor del w en mem1

r1 decfsz mem1,1 ;{5} decrementa mem1goto r1 ;{6} se ejecuta esta instr. si el dec. <>0decfsz mem2,1 ;{7}goto r2 ;{8}return ;{9}

La instrucción “Call” consume 2 ciclos, luego se ejecuta la instrucciónretardo, luego ejecuta la instrucción {1} que tarda 1 ciclo, luego se ejecuta lainstrucción {2} - 1 ciclo. Luego ejecuta la instrucción {3} aquí esta tarda 1 ciclo,luego ejecuta la instrucción {4} - 1 ciclo, luego se ejecuta la instrucción {5} {6}que ya fue analizado en el punto anterior y tarda siempre 3*(k1-1)+2 ciclos.luego se ejecuta la instrucción {7} que decrementa mem2, si el decremento noes cero tarda en ejecutarse 1 ciclo y pasa a ejecutar la instrucción {8}, que vuelvea la instrucción {3}. Entonces el secuencia de instrucciones:

{3} 1 ciclo{4} 1 ciclo

{5} {6} 3*(k1-1)+2 ciclos{7} 1 ciclo{8} 2 ciclo

Total 7+(3*(k1-1) ciclos

Esta secuencia ciclos se ejecutan en su totalidad (k2-1) veces. Luego latercera 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

Page 40: Computadoras Electronicas

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 máximo tiempo que se tarda, se cargan mem1 y mem2 con 0FFh.

La primera secuencia tarda

{3} 1 ciclo{4} 1 ciclo

{5} {6} 764 ciclos{7} 1 ciclo{8} 2 ciclo

Total 769 ciclos

Esta secuencia se ejecuta 0Feh veces o 254 veces.

La segunda secuencia es

{3} 1 ciclo{4} 1 ciclo

{5} {6} 764 ciclos{7} 2 ciclos

Total 768 ciclos

EL número de ciclos total es

2 + 1 + 1 + {769 ∗ 254 + 768}+ 2 = 2 + 1 + 2 + {101}+ 2 = 196100ciclos

Lo que lleva un tiempo de 196100 ∗ 1e−6 = 0,1961 segundos o 196.1milisegundos.

Page 41: Computadoras Electronicas

Computadoras Electrónicas 41

Rutina de retardo triple

retardo movlw .k3 ;{1}movwf mem3 ;{2}

r3 movlw .k2 ;{3}movwf mem2 ;{4}

r2 movlw .k1 ;{5}movwf mem1 ;{6}

r1 decfsz mem1,1 ;{7}goto r1 ;{8}decfsz mem2,1 ;{9}goto r2 ;{10}decfsz mem3,1 ;{11}goto r3 ;{12}return ;{13}

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

Entre las líneas {5}{6}{7}{8}{9}{10}, tenemos el bucle doble, el cual incluye elbucle simple. Denominaremos a la expresión 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 expresión que rige el segundo bucle,

[(1+1+A+1+2)*(k2-1)]+[1+1+A+2]= [(5+A)*(k2-1]+[4+A]ciclos

Page 42: Computadoras Electronicas

42 Gustavo A. Yarce

Para indicar la expresión del bucle doble lo haremos como

B=[(5+A)*(k2-1)]+[4+A]

En la línea 3 comienza el bucle triple y finaliza en 12 la cual ocupa lassiguientes líneas:

3 1 ciclo4 1 cicloB B ciclos11 1 ciclo12 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 máximo 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 instrucción es t = 1e−6seg.

D= 50.005250 segundos

Page 43: Computadoras Electronicas

Capítulo 6

Programación en C deMicrocontroladores

6.1 Introducción a CCs

Cada programa en C debe contener una función principal que es el punto departida de la ejecución del programa. El programa puede dividirse en múltiplesfunciones según el propósito y las funciones pueden ser llamadas desde laprincipal o subfunciones. En un gran proyecto, las funciones también se puedencolocar en diferentes archivos de C o archivos de cabecera que se pueden incluiren el archivo principal de C al grupo de las funciones relacionadas con sucategoría.

CCS también requiere incluir el archivo de dispositivo apropiado utilizandola directiva “# include” para incluir el dispositivo de funcionalidad específica.También hay algunas directivas de preprocesador como “# fuses” para especi-ficar los fusibles para el chip y “#use delay” para especificar la velocidad dereloj. Las funciones contienen las declaraciones de datos, definiciones, declara-ciones y expresiones. El compilador también proporciona un gran número delibrerías estándar de C, así como otros controladores de dispositivo que puedeser incluida y utilizada en los programas. CCS también provee un gran númerode funciones integradas para acceder a los distintos periféricos incluidos en elmicrocontrolador PIC.

43

Page 44: Computadoras Electronicas

44 Gustavo A. Yarce

6.2 Estructura de un programa en C

/* Preambulo */

# include# fuse# use# byte# bitdeclaración de funcionesdefinición de variables globales

/* Función Principal */

void main(void){ definición de variables locales;definiciones del PIC;Instrucciones;etc;}

/* Funciones secundarias */función 1(){definición de variables localesinstrucciones;etc;}

función 2(){definición de variables locales;instrucciones;etc;}

Page 45: Computadoras Electronicas

Computadoras Electrónicas 45

CCs

Figura 6.1: Compilador CCs

Figura 6.2: Fusibles válidos

Page 46: Computadoras Electronicas

46 Gustavo A. Yarce

6.3 Tipos

El lenguaje C proporciona cinco tipos básico de datos, con cuatro modifica-dores posibles. Podemos utilizar variables de cualquiera de esos tipos. La tablasiguiente muestra los tipos disponibles:

Tipo Ancho (Bits) Rangoshort 1 0 o 1

short int 1 0 o 1int 8 0 a 255

char 8 0 a 255unsigned 8 0 a 255

unsigned int 8 0 a 255signed 8 -128 a 127

signed int 8 -128 a 127long 16 0 a 65536

long int 16 0 a 65536signed long 16 -32768 a 32767

float 32 3.4E-38 a 3.4E+38

Tabla 6.1: Tipos de datos

Expresiones

Valor Formato123 Decimal123 Octal

0x123 Hex0b010010 Binario

’x’ Carácter′\010′ Carácter Octal′\xA5′ Carácter Hex

Tabla 6.2: Expresiones

Page 47: Computadoras Electronicas

Computadoras Electrónicas 47

Varibles Locales y Globales

Si una variable se declara dentro de una función, será “visible” solo dentrode ésta:

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

En el ejemplo anterior, la variable tipo char llamada letra solo podráutilizarse dentro de la función funcion1(). Si intentamos utilizarla fuera de ella,el compilador nos dará un error. Si declaramos una variable fuera de cualquierfunción, el alcance de esta sera global, lo que quiere decir que estará disponibleen 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 defuncion1().

Page 48: Computadoras Electronicas

48 Gustavo A. Yarce

Conversiones entre tipos

CCS nos permite mezclar diferentes tipos de variables dentro de una mismaexpresión. Y existen un conjunto de reglas que nos permiten saber que de quetipo será el resultado de la misma. Por ejemplo, el compilador convertirá auto-maticamente a int cualquier expresión que contenga variables char, short o int.Esta conversión solo tiene efecto mientras se realizan los cálculos. Las variablesen sí mismas no cambian su tipo.

Las reglas de conversión de tipos hacen que el resultado de una operaciónsea siempre el mismo que el de la variable más larga que intervenga en ella.Sin embargo, podemos forzar a que el resultado sea de un tipo en particular, dela 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 podría parecer asimple vista, por que el tipo de c no se modifica. CCS calcula a * b y obtieneefectivamente el resultado 2500, pero c sólo contendrá los 8 bits menos signifi-cativos de ese resultado, es decir, el decimal 196.

Si hubiésemos hecho:

int a = 250, b = 10;long c;c = (long) (a * b);

Page 49: Computadoras Electronicas

Computadoras Electrónicas 49

el valor almacenado en c hubiese sido efectivamente 2500.

6.4 Operadores

En CCS los operadores cumplen un rol importante. Quizás C sea uno delos lenguajes que mas operadores tiene. Una expresión es una combinación deoperadores y operandos. En la mayoría de los casos, los operadores de CCSsiguen las mismas reglas que en álgebra, y se llaman de la misma manera.

Operador Descripción+= Asignación de suma-= Asignación de resta*= Asignación de multiplicación/= Asignación de división

%= Asignación de resto de división<<= Asignación de desplazamiento a la izquierda>>= Asignación de desplazamiento a la derecha& = Asignación de AND de bits| = Asignación de OR de bitsˆˆ= Asignación de OR exclusivo de bits˜= Asignación de negación de bits

Tabla 6.3: Operadores de asignación

Page 50: Computadoras Electronicas

50 Gustavo A. Yarce

Operador Descripción Ejemplo+ Suma (enteros o reales) resul = var1 + var2- Resta (enteros o reales) resul = var1 - var2* Multiplicación (enteros o reales) resul = var1 * var2/ División (enteros o reales) resul = var1 / var2- Cambio de signo en enteros o reales 0

% Módulo; resto de una división entera rango = n [A1]% 256

Tabla 6.4: Operadores aritméticos

Operador Descripción< Menor que> Mayor que<= Menor o igual que>= Mayor o igual que== Igual a¡= Distinto de

Tabla 6.5: Operadores de relación

Operador Descripción! NO lógico

&& Y lógico|| O lógico

Tabla 6.6: Operadores lógicos

Operador DescripciónNegación 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

Page 51: Computadoras Electronicas

Computadoras Electrónicas 51

6.5 Preámbulo

La sección del preámbulo define, tipo de microcontrolador a utilizar,fusibles, clock, etc. Un ejemplo de esto es:

#include<16f84a.h> /*Selección del PIC*/

#fuses nowdt, xt,put,noprotect /*Configuración de fusibles*/

#use delay(clock=4000000) /*Velocidad del clock*/

#byte port_b = 0x06 /*Define la dirección del puerto b*/

#use standard_io(A) /*Definición del puerto A*/

Dentro del preámbulo se encuentra la definición para la funcionalidadde los puertos. Para usar los puertos como entrada o salida digital, CCSprovee directivas y funciones predefinidas para el uso de los puertos de E/Sdigital. Las funciones “output_X()” e “input_X()” dependen de la directiva deconfiguración que usemos.

#INCLUDEPermite incluir en nuestro programa uno o mas archivos (conocidos como

header file) que posean extensión .h. Estos archivos contienen información so-bre funciones, sus argumentos, el nombre de los pines de un modelo deter-minado de PIC o cualquier otra cosa que usemos habitualmente en nuestrosprogramas. Esto permite no tener que escribir un montón de cosas cada vezque comenzamos un programa nuevo: basta con incluir el .h correspondiente.La forma de utilizar esta instrucción es la siguiente: #INCLUDE <archivo>Estohará que el contenido de <archivo>se compile junto con nuestro programa.Por ejemplo:

#INCLUDE <PIC16F877A.H>

#FUSEPermite modificar el valor de los fuses del microcontrolador que estamos em-pleando. Los valores posibles dependen de cada microcontrolador en particu-lar, y los valores posibles se cargan al utilizar #ICNLUDE seguido del archivocorrespondiente. La forma de #FUSE es la siguiente: #FUSE opciones dondeopciones es una lista de las opciones posibles separadas mediante comas. Antes

Page 52: Computadoras Electronicas

52 Gustavo A. Yarce

de seguir, recuerda que puedes ver dentro del archivo con extensión .h corres-pondiente cuales son los valores posibles para ese microcontrolador. Están alcomienzo del archivo, en forma de comentarios.

Algunos valores comunes son:

Tipo de oscilador: LP, XT, HS, RC

Wach Dog Timer: WDT, NOWDT

Protección de código: PROTECT, NOPROTECT

Power Up Timer: PUT, NOPUT

Brown Out Reset: BROWNOUT, NOBROWNOUT

#DEFINELa instrucción #define tiene la siguiente forma:

#DEFINE <label>value <label>

es la etiqueta que usaremos en nuestro programa. Y value es el valor queestamos asignando a esta etiqueta.Las instrucciones #DEFINE no generan codigo ASM, si no que el preprocesadorrealiza los reemplazos que ellas indican en el momento de la compilación.El uso de #DEFINE permite construir programas más ordenados y faciles demantener. Veamos algunos ejemplos de #DEFINE

#DEFINE TRUE 1

Cada vez que en nuestro programa aparezca la etiqueta TRUE, el precompi-lador la reemplazará por 1.

#DEFINE pi 3.14159265359

Page 53: Computadoras Electronicas

Computadoras Electrónicas 53

Cada vez que en nuestro programa aparezca la etiqueta pi, el precompiladorla 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 DE-LAY_US().Opcionalmente podemos usar la función restart_WDT() para que el compiladorreinicie 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 modifica el registro TRIS en lecturas y escrituras.Hay que asegurarse de que los pines está configurados correctamente.

#use standar_io (puerto): Modifica el registro TRIS correspondiente enlecturas y escrituras. (Modo por defecto)

#use fixed_io (puerto): Configura el puerto y no modifica el registro TRISen 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)

{

Page 54: Computadoras Electronicas

54 Gustavo A. Yarce

int aux;

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

La configuración como entrada o salida se hace a través del registro “TRISx”correspondiente del banco 1 de la memoria.

Para configurar los puertos se utiliza la función “set_tris_X(valor)”. Se puedeleer la configuración de los puertos con la función “get_tris_X(valor)”.

set_tris_A (0x3F) /* Puerto A como entradas.*/

CCS tiene funciones predefinidas para el uso de los puertos de E/S digital.Los parámetros de estas funciones están definidos en un fichero “include ”.

Las funciones pueden tratar el puerto completo, a través de las instrucciones“output_X()” e “input_X()”. También se pueden operar a nivel de bit, con unformato 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_float (PIN_Xn) /*Pin como entrada (simula d. ab. */

input_state(PIN_Xn) /*Lee el valor del pin sin cambiar el sentido delterminal. */

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

#USE FAST_IO (puerto)Esta directiva afecta al código que el compilador generará para las instruc-

ciones de entrada y salida. Este método rápido de hacer I/O ocasiona que elcompilador realice I/O sin programar el registro de dirección. El puerto puede

Page 55: Computadoras Electronicas

Computadoras Electrónicas 55

ser A-G.

Ejemplo:

#use fast_io(A)

#USE FIXED_IO (puerto_OUTPUTS=pin_x#, pin_x#...)Esta directiva afecta al código que el compilador generará para las instruc-

ciones de entrada y salida. El método fijo de hacer I/O causará que el compila-dor genere código para hacer que un pin de I/O sea entrada o salida cada vezque se utiliza. Esto ahorra el byte de RAM usado en I/O normal.

Ejemplo:

#use fixed_io(a_outputs=PIN_A2 ,PIN_A3)

#USE STANDARD_IO (puerto)Esta directiva afecta al código que el compilador genera para las instruccio-

nes de entrada y salida. El método estándar de hacer I/O causará que el compi-lador genere código para hacer que un pin de I/O sea entrada o salida cada vezque se utiliza. En los procesadores de la serie 5X esto necesita un byte de RAMpara cada puerto establecido como I/O estandar.

Ejemplo:

#use standard_io(A)

input_x( ) Devuelve el estado del puerto especificado

Ejemplo:

Page 56: Computadoras Electronicas

56 Gustavo A. Yarce

x=input_a() ;

output_x(valor) Escribe el byte especificado en el puerto indicado.

Ejemplo:

valor_a(255) ;

INPUT(pin)Devuelve el estado “0” o “1” del pin. El método 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 función saca el bit dado en value(0 o 1) por el pin de I/O especificado.

El modo de establecer la dirección del registro, está determinada por la últimadirectiva #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 método de acceso de I/O depende de la úl-

tima directiva #USE *_IO utilizada.

Ejemplo:

Page 57: Computadoras Electronicas

Computadoras Electrónicas 57

output_high(PIN_A0);

OUTPUT_LOW(pin)Pone a “cero” el pin indicado. El método 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 configuración de los puertos.Esto debe usarse con FAST_IO() y cuando se accede a los puertos de I/O co-

mo si fueran memoria, igual que cuando se utiliza una directiva #BYTE. Cadabit 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 función realiza retardos del valor especificado en time. Dicho valor de

tiempo es en milisegundos y el rango es 0-65535.Para obtener retardos más largos así como retardos ’variables’ es preciso

hacer llamadas a una función separada; véase el ejemplo siguiente.Es preciso utilizar la directiva #use delay(clock=frecuencia) antes de la

llamada a esta función, para que el compilador sepa la frecuencia de reloj.

Ejemplo:

Page 58: Computadoras Electronicas

58 Gustavo A. Yarce

#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);

}

Page 59: Computadoras Electronicas

Índice alfabético

acumulador, 29

Call, 37ciclo de instrucción, 15contador de programa, 17, 20

direccionamiento, 23direccionamiento directo, 23direccionamiento indirecto, 23

EEPROM, 10, 13, 14EQU, 35Estado, 27estado, 20

FLASH, 11, 13, 19

instrucciones, 31

memoria de datos, 20

osciladores, 16

PC, 20, 22PIC, 24pic16f873, 13, 14pila, 22puerto a, 24puerto b, 25puerto c, 26

RAM, 10, 20registro de estado, 27reloj, 15reset, 17Retardo, 38

Return, 37ROM, 9, 10Rutina simple, 38

sistema programable, 9SRAM, 11

59