milan verle en español

c          La situación actual en el campo de los microcontroladores se ha producido

Views 25 Downloads 0 File size 8MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

c          La situación actual en el campo de los microcontroladores se ha producido gracias al desarrollo de la tecnología de fabricación de los circuitos integrados. Este desarrollo ha permitido construir las centenas de miles de transistores en un chip. Esto fue una condición previa para la fabricación de un microprocesador. Las primeras microcomputadoras se fabricaron al añadirles periféricos externos, tales como memoria, líneas de entrada/salida, temporizadores u otros. El incremento posterior de la densidad de integración permitió crear un circuito integrado que contenía tanto al procesador como periféricos. Así es cómo fue desarrollada la primera microcomputadora en un solo chip, denominada más tarde microcontrolador.  1.1 Introducción   

1.2 NÚMEROS, NÚMEROS, NÚMEROS... 1.3 DETALLES IMPORTANTES 1.4 MICROCONTROLADORES PIC

cc Los principiantes en electrónica creen que un microcontrolador es igual a un microprocesador. Esto no es cierto. Difieren uno del otro en muchos sentidos. La primera y la más importante diferencia es su funcionalidad. Para utilizar al microprocesador en una aplicación real, se debe de conectar con componentes tales como memoria o componentes buses de transmisión de datos. Aunque el microprocesador se considera una máquina de computación poderosa, no está preparado para la comunicación con los dispositivos periféricos que se le conectan. Para que el microprocesador se comunique con algún periférico, se deben utilizar los circuitos especiales. Así era en el principio y esta práctica sigue vigente en la actualidad.

 Por otro lado, al microcontrolador se le diseña de tal manera que tenga todas las componentes integradas en el mismo chip. No necesita de otros componentes especializados para su aplicación, porque todos los circuitos necesarios, que de otra manera correspondan a los periféricos, ya se encuentran incorporados. Así se ahorra tiempo y espacio necesario para construir un dispositivo.

-    c  cc ! Para entender con más facilidad las razones del éxito tan grande de los microcontroladores, vamos a prestar atención al siguiente ejemplo. Hace unos 10 años, diseñar un dispositivo electrónico de control de un ascensor de un edificio de varios pisos era muy difícil, incluso para un equipo de expertos. ¿Ha pensado alguna vez en qué requisitos debe cumplir un simple ascensor? ¿Cómo lidiar con la situación cuando dos o más personas llaman al ascensor al mismo tiempo? ¿Cuál llamada tiene la prioridad? ¿Cómo solucionar las cuestiones de seguridad, de pérdida de electricidad, de fallos, de uso indebido? Lo que sucede después de resolver estos problemas básicos es un proceso meticuloso de diseñar los dispositivos adecuados utilizando un gran número de los chips especializados. Este proceso puede tardar semanas o meses, dependiendo de la complejidad del dispositivo. Cuando haya terminado el proceso, llega la hora de diseñar una placa de circuito impreso y de montar el dispositivo.¡Un dispositivo enorme! Es otro trabajo difícil y tardado. Por último, cuando todo está terminado y probado adecuadamente, pasamos al momento crucial y es cuando uno se concentra, respira profundamente y enciende la fuente de alimentación.

Esto suele ser el punto en el que la fiesta se convierte en un verdadero trabajo puesto que los dispositivos electrónicos casi nunca funcionan apropiadamente desde el inicio. Prepárese para muchas noches sin dormir, correcciones, mejoras... y no se olvide de que todavía estamos hablando de cómo poner en marcha un simple ascensor. Cuando el dispositivo finalmente empiece a funcionar perfectamente y todo el mundo esté satisfecho, y le paguen por el trabajo que ha hecho, muchas compañías de desarrollo estarán interesadas en su trabajo. Por supuesto, si tiene suerte, cada día le traerá una oferta de trabajo de un nuevo inversionista. Sin embargo, si lo requieren para trabajar en el control de los elevadores de un nuevo edificio que tiene cuatro pisos más de los que ya maneja su sistema de control. ¿Sabe cómo proceder? ¿Cree acaso que se pueden controlar las demandas de sus clientes? Pensamos que usted va a construir un dispositivo universal que se puede utilizar en los edificios de 4 a 40 pisos, una obra maestra de electrónica. Bueno, incluso si usted consigue construir una joya electrónica, su inversionista le esperarará delante de la puerta pidiendo una cámara en el ascensor o una música relajante en caso de fallo de ascensor. O un ascensor con dos puertas. De todos modos, la ley de Murphy es inexorable y sin duda usted no podrá tomar ventaja a pesar de todos los esfuerzos que ha hecho. Por desgracia, todo lo que se ha dicho hasta ahora sucede en la realidad. Esto es lo que ³dedicarse a la ingeniería electrónica´ realmente significa. Es así como se hacían las cosas hasta aparición de los microcontroladores diseñados pequeños, potentes y baratos. Desde ese momento su programación dejó de ser una ciencia, y todo tomó otra dirección ... El dispositivo electrónico capaz de controlar un pequeño submarino, una grúa o un ascensor como el anteriormente mencionado, ahora está incorporado en un sólo chip. Los microcontroladores ofrecen una amplia gama de aplicaciones y sólo algunas se exploran normalmente. Le toca a usted decidir qué quiere que haga el microcontrolador y cargar un programa en él con las instrucciones apropiadas. Antes de encender el dispositivo es recomendable verificar su funcionamiento con ayuda de un simulador. Si todo funciona como es debido, incorpore el microcontrolador en el sistema. Si alguna vez necesita cambiar, mejorar o actualizar el programa, hágalo. ¿Hasta cuándo? Hasta quedar satisfecho. Eso puede realizarse sin ningún problema.

 Gabía usted que todas las personas pueden ser clasificadas en uno de 10 grupos, en los que están familiarizados con el sistema de numeración binario y en los que no están familiarizados con él. Gi no entendió lo anterior significa que todavía pertenece al segundo grupo. Gi desea cambiar su estado, lea el siguiente texto que describe brevemente algunos de los conceptos

básicos utilizados más tarde en este libro (sólo para estar seguro de que estamos hablando en los mismos términos).

"# $# $#  ¡La matemática es una gran ciencia! Todo es tan lógico y simple... El universo de los números se puede describir con sólo diez dígitos. No obstante, ¿realmente tiene que ser así? ¿Necesitamos exactamente esos 10 dígitos? Por supuesto que no, es sólo cuestión del hábito. Acuérdese de las lecciones de la escuela. Por ejemplo, ¿qué significa el número 764? Cuatro unidades, seis decenas y siete centenas. ¡Muy simple! ¿Se podría expresar de una forma más desarrollada? Por supuesto que sí: 4 + 60 + 700. ¿Aún más desarrollado? Sí: 4*1 + 6*10 + 7*100. ¿Podría este número parecer un poco más ³científico´? La respuesta es sí otra vez: 4*100 + 6*101 + 7*102. ¿Qué significa esto realmente? ¿Por qué utilizamos exactamente estos números 100, 101 y 102 ? ¿Por qué es siempre el número 10? Es porque utilizamos 10 dígitos diferentes (0, 1, 2...8, 9). En otras palabras, es porque utilizamos el sistema de numeración en base 10, es decir el sistema de numeración decimal.

   c%



¿Qué pasaría si utilizáramos sólo dos números 0 y 1? Si sólo pudiéramos afirmar (1) o negar (0) que algo existe. La respuesta es ³nada especial´, seguiríamos utilizando los mismos números de la misma manera que utilizamos hoy en día, no obstante ellos parecerían un poco diferentes. Por ejemplo: 11011010.¿Cuántas son realmente 11011010 páginas de un libro? Para entenderlo, siga la misma lógica como en el ejemplo anterior, pero en el orden invertido. Tenga en cuenta que se trata de aritmética con sólo dos dígitos 0 y 1, es decir, del sistema de numeración en base 2 (sistema de numeración binario).

 Evidentemente, se trata del mismo número representado en dos sistemas de numeración diferentes. La única diferencia entre estas dos representaciones yace en el número de dígitos necesarios para escribir un número. Un dígito (2) se utiliza para escribir el número 2 en el sistema decimal, mientras que dos dígitos (1 y 0) se utilizan para escribir aquel número en el sistema binario. ¿Ahora está de acuerdo que hay 10 grupos de gente? ¡Bienvenido al mundo de la aritmética binaria! ¿Tiene alguna idea de dónde se utiliza? Excepto en las condiciones de laboratorio estrictamente controladas, los circuitos electrónicos más complicados no pueden especificar con exactitud la diferencia entre dos magnitudes (dos valores de voltaje, por ejemplo), si son demasiado pequeños (más pequeños que unos pocos voltios). La razón son los ruidos eléctricos y fenómenos que se presentan dentro de lo que llamamos ³entorno de trabajo real´ (algunos ejemplos de estos fenómenos son los cambios imprevisibles de la tensión de alimentación, cambios de temperatura, tolerancia a los valores de los componentes etc...). Imagínese una computadora que opera sobre números decimales al tratarlos de la siguiente manera: 0=0V, 1=5V, 2=10V, 3=15V, 4=20V... 9=45V!? ¿Alguien dijo baterías? Una solución mucho más fácil es una lógica binaria donde 0 indica la ausencia de voltaje, mientras que 1 indica la presencia de voltaje. Simplemente, es fácil de escribir 0 o 1 en vez de ³no hay voltaje´ o ³ hay voltaje´. Mediante el cero lógico (0) y uno lógico (1) la electrónica se enfrenta perfectamente y realiza con facilidad todas las operaciones aritméticas. Evidentemente, se trata de electrónica que en realidad aplica aritmética en la que todos los números son representados con sólo dos dígitos y donde sólo es importante saber si hay voltaje o no. Por supuesto, estamos hablando de electrónica digital.

   c & c 

En el principio del desarrollo de las computadoras era evidente que a la gente le costaba mucho trabajar con números binarios. Por eso, se estableció un nuevo sistema de numeración, que utilizaba 16 símbolos diferentes. Es llamado el sistema de numeración hexadecimal. Este sistema está compuesto de 10 dígitos a los que estamos acostumbrados (0, 1, 2, 3,... 9) y de seis letras del alfabeto A, B, C, D, E y F. ¿Cuál es el propósito de esta combinación aparentemente extraña? Basta con mirar cómo todo en la historia de los números binarios encaja perfectamente para lograr una mejor comprensión del tema.

 El mayor número que puede ser representado con 4 dígitos binarios es el número 1111. Corresponde al número 15 en el sistema decimal. En el sistema hexadecimal ese número se representa con sólo un dígito F. Es el mayor número de un dígito en el sistema hexadecimal. ¿Se da cuenta de la gran utilidad de estas equivalencias? El mayor número escrito con ocho dígitos binarios es a la vez el mayor número de dos dígitos en el sistema hexadecimal. Tenga en cuenta que una computadora utiliza números binarios de 8 dígitos. ¿Acaso se trata de una casualidad?

c'%c El código BCD (åinary- oded ecimal - Código binario decimal) es un código binario utilizado para representar a los números decimales. Se utiliza para que los circuitos electrónicos puedan comunicarse con los periféricos utilizando el sistema de numeración decimal o bien utilizando el sistema binario dentro de ³su propio mundo´. Consiste en números binarios de 4 dígitos que representan los primeros diez dígitos (0, 1, 2, 3...8, 9). Aunque cuatro dígitos pueden hacer 16 combinaciones posibles en total, el código BCD normalmente utiliza a las primeras diez.

c(    # c El sistema de numeración binario es el que utilizan los microcontroladores, el sistema decimal es el que nos resulta más comprensible, mientras que el sistema hexadecimal presenta un balance entre los dos. Por eso, es muy importante aprender cómo convertir los números de un sistema de numeración a otro, por ejemplo, cómo convertir una serie de ceros y unos a una forma de representación comprensible para nosotros.

c(  # % c   Los dígitos en un número binario tienen ponderaciones diferentes lo que depende de sus posiciones dentro del número que están representando. Además, cada dígito puede ser 1 o 0, y su ponderación se puede determinar con facilidad al contar su posición empezando por la derecha. Para hacer una conversión de un número binario a decimal es necesario multiplicar

las ponderaciones con los dígitos correspondientes (0 o 1) y sumar todos los resultados. La magia de la conversión de un número binario a decimal funciona de maravilla... ¿Tiene duda? Veamos el siguiente ejemplo:

 Cabe destacar que es necesario utilizar sólo dos dígitos binarios para representar a todos los números decimales de 0 a 3. Por consiguiente, para representar los números de 0 a 7 es necesario utilizar tres dígitos binarios, para representar los números de 0 a 15 - cuatro dígitos etc. Dicho de manera sencilla, el mayor número binario que se puede representar utilizando n dígitos se obtiene al elevar la base 2 a la potencia n. Luego, al resultado se le resta 1. Por ejemplo, si n=4: 4

2 - 1 = 16 - 1 = 15 Por consiguiente, al utilizar 4 dígitos binarios, es posible representar los números decimales de 0 a 15, que son 16 valores diferentes en total.

c(  #  & c   c   Para realizar una conversión de un número hexadecimal a decimal, cada dígito hexadecimal debe ser multiplicado con el número 16 elevado al valor de su posición. Por ejemplo:

c(  #  & c  % No es necesario realizar ningún cálculo para convertir un número hexadecimal a binario. Los dígitos hexadecimales se reemplazan simplemente por los cuatro dígitos binarios apropiados. Ya que el dígito hexadecimal máximo es equivalente al número decimal 15, es necesario utilizar cuatro dígitos binarios para representar un dígito hexadecimal. Por ejemplo:





c#  El sistema de numeración hexadecimal, junto con los sistemas binario y decimal, se consideran los más importantes para nosotros. Es fácil realizar una conversión de cualquier número hexadecimal a binario, además es fácil de recordarlo. Sin obstante, estas conversiones pueden provocar una confusión. Por ejemplo, ¿qué significa en realidad la sentencia: ³Es necesario contar 110 productos en una cadena de montaje´? Dependiendo del sistema en cuestión (binario, decimal o hexadecimal), el resultado podría ser 6, 110 o 272 productos, respectivamente. Por consiguiente, para evitar equivocaciones, diferentes prefijos y sufijos se añaden directamente a los números. El prefijo $ o 0x así como el sufijo h marca los números en el sistema hexadecimal. Por ejemplo, el número hexadecimal 10AF se puede escribir así: $10AF, 0x10AF o 10AFh. De manera similar, los números binarios normalmente obtienen el sufijo % o 0B. Si un número no tiene ni sufijo ni prefijo se considera decimal. Desafortunadamente, esta forma de marcar los números no es estandarizada, por consiguiente depende de la aplicación concreta. La siguiente es tabla comparativa que contiene los valores de números 0-255 representados en tres sistemas de numeración diferentes. Esto es probablemente la manera más fácil de entender lógica común aplicada a todos los sistemas de numeración.

#  '(



Como ya hemos visto, para escribir un número negativo en matemáticas, basta con añadirle el prefijo ³-´ (signo menos). Sin embargo, en la programación, al acabarse el proceso de la compilación, se quedan sólo los números binarios, volviéndose las cosas más complicadas. Se utilizan sólo dos dígitos - 0 y 1, mientras que todos los demás números, símbolos y signos se forman por medio de las combinaciones de estos dos dígitos. En el caso de los números negativos, la solución es la siguiente: En los números negativos, el bit más significativo (el bit del extremo izquierdo) representa el signo del número (donde 0 será positivo y 1 negativo). En el caso de un número de 8 bits, para representar un valor numérico sólo quedan 7 bits. De acuerdo a este tipo de codificación el número +127 es el mayor número positivo con signo que se puede representar con 8 bits. Asimismo, hay cero (0) positivo y negativo (refiérase a la tabla de la derecha). La siguiente pregunta sería: ¿Cómo es posible saber de qué número se trata? Por ejemplo, si ponemos el número 10000001, ¿es -1 o 129? No se preocupe, de eso se encarga el compilador. Ésta es la razón por la que se declaran variables al escribir el programa. Bueno, de eso vamos a hablar a continuación.

%



La teoría dice que un bit es la unidad básica de información...Vamos a olvidarlo por un momento y demostrar qué es eso en la práctica. La respuesta es - nada especial- un bit es un sólo dígito binario. Similar a un sistema de numeración decimal en el que los dígitos de un número no tienen la misma ponderación (por ejemplo, los dígitos en el número 444 son los mismos pero tienen los valores diferentes), el ³significado´ de un bit depende de la posición que tiene en número binario. En este caso no tiene sentido hablar de unidades, centenas etc. en los números binarios, sus dígitos se denominan el bit cero (el primer bit a la derecha), el primer bit (el segundo bit a la derecha) etc. Además, ya que el sistema binario utiliza solamente dos dígitos (0 y 1), el valor de un bit puede ser 0 o 1. No se confunda si se encuentra con un bit que tiene el valor 4, 16 o 64. Son los valores representados en el sistema decimal. Simplemente, nos hemos acostumbrado tanto a utilizar los números decimales que estas expresiones llegaron a ser comunes. Sería correcto decir por ejemplo, ³el valor del sexto bit en cualquier número binario equivale al número decimal 64´. Pero todos somos humanos y los viejos hábitos mueren difícilmente. Además, ¿cómo le suena ³número uno-uno-cero-uno-cero...´?

%)  Un byte consiste en 8 bits colocados uno junto al otro. Si un bit es un dígito, es lógico que los bytes representen los números. Todas las operaciones matemáticas se pueden realizar por medio de ellos, como por medio de los números decimales comunes. Similar a los dígitos de cualquier número, los dígitos de un byte no tienen el mismo significado. El bit del extremo izquierdo tiene la mayor ponderación, por eso es denominado el bit más significativo (MSB). El bit del extremo derecho tiene la menor ponderación, por eso es denominado el bit menos significativo (LSB). Puesto que los 8 dígitos de un byte se pueden combinar de 256 maneras diferentes, el mayor número decimal que se puede representar con un byte es 255 (una combinación representa un cero).

Un nibble o un cuarteto representa una mitad de byte. Dependiendo de la mitad del número en cuestión (izquierda o derecha), se les denomina nibbles ³altos´ o ³bajos´, respectivamente.

 Ñsted seguramente ha pensado alguna vez en cómo es la electrónica dentro de un circuito integrado digital, un microcontrolador o un microprocesador. ¿Cómo son los circuitos que realizan las operaciones matemáticas complicadas y toman decisiones? ¿Gabía que sus esquemas, aparentemente complicadas consisten en sólo unos pocos elementos diferentes, denominados circuitos lógicos o compuertas lógicas?

*     El funcionamiento de estos elementos es basado en los principios establecidos por el matemático británico leorge Boole en la mitad del siglo 19 - es decir, ¡antes de la invención de la primera bombilla! En breve, la idea principal era de expresar las formas lógicas por medio de las funciones algebraicas. Tal idea pronto se transformó en un producto práctico que se convirtió más tarde en lo que hoy en día conocemos como circuitos lógicos Y (AND), O (OR) o NO (NOT). El principio de su funcionamiento es conocido como algebra de Boole.

cc'c Algunas instrucciones de programa utilizadas por un microcontrolador funcionan de la misma manera que las compuertas lógicas, pero en forma de comandos. A continuación vamos a explicar el principio de su funcionamiento.

c  )+,

 Una compuerta lógica ³Y´ dispone de dos o más entradas y de una salida. En este caso la compuerta utilizada dispone de sólo dos entradas. Un uno lógico (1) aparecerá en su salida sólo en caso de que ambas entradas (A Y B) sean llevadas a alto (1). La tabla a la derecha es la tabla de verdad que muestra la relación entre las entradas y salidas de la compuerta. El

principio de funcionamiento es el mismo cuando la compuerta disponga de más de dos entradas: la salida proporciona un uno lógico (1) sólo si todas las entradas son llevadas a alto (1).

 Cualquier otra combinación de voltajes de entrada proporcionará un cero lógico (0) en su salida. Utilizada en el programa, la operación Y lógico es realizada por una instrucción de programa, de la que vamos a hablar más tarde. Por ahora basta con conocer que Y lógico en un programa se refiere a la realización de este tipo de operación sobre los bits correspondientes de dos registros diferentes.

c  +,

 De manera similar, la compuerta O también dispone de dos o más entradas y de una salida. Si la compuerta dispone de sólo dos entradas, es aplicable lo siguiente: la salida proporciona un uno lógico (1) si una u otra entrada (A o B) es llevada a alto (1). En caso de que la compuerta O disponga de más de dos entradas, es aplicable lo siguiente: La salida proporciona un uno lógico (1) si por lo menos una entrada es llevada a alto (1). Si todas las entradas están a cero lógico (0), la salida estará a cero lógico (0) también.

 En un programa, la operación O lógico se realiza de la misma manera que la operación Y.

c  +,

La compuerta lógica NO dispone de una sola entrada y una sola salida, por lo que funciona muy simplemente. Cuando un cero lógico (0) aparezca en su entrada, la salida proporciona un uno lógico (1) y viceversa. Esto significa que esta compuerta invierte las señales por sí mismas y por eso es denominada inversor.



 En el programa la operación lógica NO se realiza sobre un byte. El resultado es un byte con los bits invertidos. Si los bits de un byte se consideran número, el valor invertido es un complemento a ese número. El complemento de un número es el valor que se añade al número hasta llegar al mayor número binario de 8 dígitos. En otras palabras, la suma de un dígito de 8 números y de su complemento es siempre 255.

c  &+ &c(,

 La compuerta XOR (O EXCLUSIVA) es un poco complicada en comparación con las demás. Representa una combinación de todas las compuertas anteriormente descritas. La salida proporciona un uno lógico (1) sólo si sus entradas están en estados lógicos diferentes.

 En el programa, esta operación se utiliza con frecuencia para comparar dos bytes. La resta se puede utilizar con el mismo propósito (si el resultado es 0, los bytes son iguales). A diferencia de la resta, la ventaja de esta operación lógica es que no es posible obtener los resultados negativos.

 ' Un registro o una celda de memoria es un circuito electrónico que puede memorizar el estado de un byte.

 '-



A diferencia de los registros que no tienen ninguna función especial y predeterminada, cada microcontrolador dispone de un número de registros de funciones especiales (SFR), con la función predeterminada por el fabricante. Sus bits están conectados a los circuitos internos del microcontrolador tales como temporizadores, convertidores A/D, osciladores entre otros, lo que significa que directamente manejan el funcionamiento de estos circuitos, o sea del microcontrolador. Imagínese ocho interruptores que manejan el funcionamiento de un circuito pequeño dentro del microcontrolador. Los registros SFR hacen exactamente lo mismo.

 En otras palabras, el estado de los bits de registros se fija dentro de programa, los registros SFR dirigen los pequeños circuitos dentro del microcontrolador, estos circuitos se conectan por los pines del microcontrolador a un dispositivo periférico utilizado para... Bueno, depende de usted.

   .+ ., Para hacer útil un microcontrolador, hay que conectarlo a un dispositivo externo, o sea, a un periférico. Cada microcontrolador tiene uno o más registros (denominados puertos) conectados a los pines en el microcontrolador. ¿Por qué se denominan como puertos de entrada/salida? Porque usted puede cambiar la función de cada pin como quiera. Por ejemplo, usted desea que su dispositivo encienda y apague los tres señales LEDs y que simultáneamente monitoree el estado lógico de 5 sensores o botones de presión. Uno de los puertos debe estar configurado de tal manera que haya tres salidas (conectadas a los LEDs) y cinco entradas (conectadas a los sensores). Eso se realiza simplemente por medio de software, lo que significa que la función de algún pin puede ser cambiada durante el funcionamiento.

 Una de las características más importantes de los pines de entrada/salida (E/S) es la corriente máxima que pueden entregar/recibir. En la mayoría de los microcontroladores la corriente obtenida de un pin es suficiente para activar un LED u otro dispositivo de baja corriente (1020mA). Mientras más pines de E/S haya, más baja es la corriente máxima de un pin. En otras palabras, todos los puertos de E/S comparten la corriente máxima declarada en la hoja de especificación técnica del microprocesador. Otra característica importante de los pines es que pueden disponer de los resistores pull-up. Estos resistores conectan los pines al polo positivo del voltaje de la fuente de alimentación y su efecto se puede ver al configurar el pin como una entrada conectada a un interruptor mecánico o a un botón de presión. Las últimas versiones de los microcontroladores tienen las resistencias pull-up configurables por software. Cada puerto de E/S normalmente está bajo el control de un registro SFR especializado, lo que significa que cada bit de ese registro determina el estado del pin correspondiente en el el microcontrolador. Por ejemplo, al escribir un uno lógico (1) a un bit del registro de control (SFR), el pin apropiado del puerto se configura automáticamente como salida. Eso significa que el voltaje llevado a ese pin se puede leer como 0 o 1 lógico. En caso contrario, al escribir 0 al registro SFR, el pin apropiado del puerto se configura como salida. Su voltaje (0V o 5V) corresponde al estado del bit apropiado del registro del puerto.

   La unidad de memoria es una parte del microcontrolador utilizada para almacenar los datos. La manera más fácil de explicarlo es compararlo con un armario grande con muchos cajones. Si marcamos los cajones claramente, será fácil acceder a cualquiera de sus contenidos al leer la etiqueta en la parte delantera del cajón.

 De manera similar, cada dirección de memoria corresponde a una localidad de memoria. El contenido de cualquier localidad se puede leer y se le puede acceder al direccionarla. La memoria se puede escribir en la localidad o leer. Hay varios tipos de memoria dentro del microcontrolador:

 + ) ),/   c La memoria ROM se utiliza para guardar permanentemente el programa que se está ejecutando. El tamaño de programa que se puede escribir depende del tamaño de esta memoria. Los microcontroladores actuales normalmente utilizan el direccionamiento de 16 bits, que significa que son capaces de direccionar hasta 64 Kb de memoria, o sea 65535 localidades. Por ejemplo, si usted es principiante, su programa excederá pocas veces el límite de varios cientos de instrucciones. Hay varios tipos de memoria ROM.

   0  +   , /   La ROM enmascarada es un tipo de ROM cuyo contenido es programado por el fabricante. El término ³de máscara´ viene del proceso de fabricación, donde las partes del chip se plasman en las mascaras utilizadas durante el proceso de fotolitografía. En caso de fabricación de grandes series, el precio es muy bajo. Olvide la idea de modificarla...

 +  1 2 ,/ 1 2  34  La memoria programable una sola vez permite descargar un programa en el chip, pero como dice su nombre, una sola vez. Si se detecta un error después de descargarlo, lo único que se puede hacer es descargar el programa correcto en otro chip.

(  +(   21 2 , / 1 22 2  5 3 

 El encapsulado de este microcontrolador tiene una ³ventana´ reconocible en la parte alta. Eso permite exponer la superficie del chip de silicio a la luz de ultravioleta y borrar el programa completamente en varios minutos. Luego es posible descargar un nuevo programa en él. La instalación de esta ventana es complicada, lo que por supuesto afecta al precio. Desde nuestro punto de vista, desgraciadamente, de manera negativa...

  - 6 Este tipo de memoria se inventó en los años 80 en los laboratorios de la compañía INTEL, como forma desarrollada de la memoria UV EPROM. Ya que es posible escribir y borrar el contenido de esta memoria prácticamente un número ilimitado de veces, los microcontroladores con memoria Flash son perfectos para estudiar, experimentar y para la fabricación en pequeña escala. Por la gran popularidad de esta memoria, la mayoría de los microconroladores se fabrican con tecnología flash hoy en día. Si usted va a comprar un microcontrolador, ¡éste es en definitiva la opción perfecta!

 + cc  ),/  cc    Al apagar la fuente de alimentación, se pierde el contenido de la memoria RAM. Se utiliza para almacenar temporalmente los datos y los resultados inmediatos creados y utilizados durante el funcionamiento del microcontrolador. Por ejemplo, si el programa ejecuta la adición (de cualquier cosa) es necesario tener un registro que representa lo que se llama ³suma´ en vida cotidiana. Con tal propósito, uno de los registros de la RAM es denominado ³suma´ y se utiliza para almacenar los resultados de la adición.



 +  cc) % '  ' % )%%  7cc  

%  ,/

El contenido de la EEPROM se puede cambiar durante el funcionamiento (similar a la RAM), pero se queda permanentemente guardado después de la pérdida de la fuente de alimentación (similar a la ROM). Por lo tanto, la EEPROM se utiliza con frecuencia para almacenar los

valores creados durante el funcionamiento, que tienen que estar permanentemente guardados. Por ejemplo, si usted ha diseñado una llave electrónica o un alarma, sería estupendo permitir al usuario crear e introducir una contraseña por su cuenta. Por supuesto, la nueva contraseña tiene que estar guardada al apagar la fuente de alimentación. En tal caso una solución perfecta es el microcontrolador con una EEPROM embebida.

 c La mayoría de programas utilizan interrupciones durante ejecución de programa regular. El propósito del microcontrolador generalmente consiste en reaccionar a los cambios en su entorno. En otras palabras, cuando ocurre algo, el microcontrolador reacciona de alguna manera... Por ejemplo, al apretar el botón del mando a distancia, el microcontrolador lo registra y responde al comando cambiando de canal, subiendo o bajando el volumen etc. Si el microcontrolador pasará la mayoría del tiempo comprobando varios botones sin parar - las horas, los días, esto no sería nada práctico. Por lo tanto, el microcontrolador ³aprendió un truco´ durante su evolución. En vez de seguir comprobando algún pin o bit, el microconrolador deja su ³trabajo de esperar´ a un ³experto´ que reaccionará sólo en caso de que suceda algo digno de atención. La señal que informa al procesador central acerca de tal acontecimiento se denomina INTERRUPCIÓN.

c  c   +c c / c, Como indica su nombre, esto es una unidad que controla todos los procesos dentro del microcontrolador. Consiste en varias unidades más pequeñas, de las que las más importantes son: 

 

 8     es la parte que descodifica las instrucciones del programa y acciona otros circuitos basándose en esto. El ³conjunto de instrucciones´ que es diferente para cada familia de microcontrolador expresa las capacidades de este circuito;   91   : +6  1   /, realiza todas las operaciones matemáticas y lógica s sobre datos; y    o registro de trabajo. Es un registro SFR estrechamente relacionado con el funcionamiento de la ALU. Es utilizado para almacenar todos los datos sobre los que se debe realizar alguna operación (sumar, mover). También almacena lo s resultados preparados para el procesamiento futuro. Uno de los registros SFR, denominado Registro Status (PSW), está estrechamente relacionado con el acumulador. Muestra el ³estado´ de un número almacenado en el acumulador (el número es mayor o menor que cero etc.) en cualquier instante dado.



%

El bus está formado por 8, 16 o más cables. Hay dos tipos de buses: el bus de direcciones y el bus de datos. El bus de direcciones consiste en tantas líneas como sean necesarias para direccionar la memoria. Se utiliza para transmitir la dirección de la CPU a la memoria. El bus de datos es tan ancho como los datos, en este caso es de 8 bits o líneas de ancho. Se utiliza para conectar todos los circuitos dentro del microcontrolador.

c cc    La conexión paralela entre el microcontrolador y los periféricos a través de los puertos de entrada/salida es una solución perfecta para las distancias cortas - hasta varios metros. No obstante, en otros casos cuando es necesario establecer comunicación entre dos dispositivos a largas distancias no es posible utilizar la conexión paralela. En vez de eso, se utiliza la conexión en serie. Hoy en día, la mayoría de los microcontroladores llevan incorporados varios sistemas diferentes para la comunicación en serie, como un equipo estándar. Cuál de estos sistemas se utilizará en un caso concreto, depende de muchos factores, de los que más importantes son:    

¿Con cuántos dispositivos el microcontrolador tiene que intercambiar los datos? ¿Cuál es la velocidad del intercambio de datos obligatoria? ¿Cuál es la distancia entre los dispositivos? ¿Es necesario transmitir y recibir los datos simultáneamente?

 Una de las cosas más importantes en cuanto a la comunicación en serie es el Protocolo que debe ser estrictamente observado. Es un conjunto de reglas que se aplican obligatoriamente para que los dispositivos puedan interpretar correctamente los datos que intercambian mutuamente. Afortunadamente, los microcontroladores se encargan de eso automáticamente, así que el trabajo de programador/usuario es reducido a la escritura y lectura de datos.

( c    La velocidad de transmisión serial (baud rate) es el término utilizado para denotar el número de bits transmitidos por segundo [bps]. ¡Fíjese que este término se refiere a bits, y no a bytes! El protocolo normalmente requiere que cada byte se transmita junto con varios bits de control. Eso quiere decir que un byte en un flujo de datos serial puede consistir en 11 bits. Por ejemplo, si velocidad de transmisión serial es 300 bps un máximo de 37 y un mínimo de 27 bytes se pueden transmitir por segundo. Los sistemas de comunicación serial más utilizados son:

"c+  ' cc,/cc / ' Circuito inter-integrado es un sistema para el intercambio de datos serial entre los microcontroladores y los circuitos integrados especializados de generación. Se utiliza cuando la distancia entre ellos es corta (el receptor y el transmisor están normalmente en la misma placa de circuito impreso). La conexión se establece por medio de dos líneas - una se utiliza para

transmitir los datos, mientras que la otra se utiliza para la sincronización (la señal de reloj). Como se muestra en la figura, un dispositivo es siempre el principal (master - maestro), el que realiza el direccionamiento de un chip subordinado (slave - esclavo) antes de que se inicie la comunicación. De esta manera un microcontrolador puede comunicarse con 112 dispositivos diferentes. La velocidad de transmisión serial es normalmente 100 Kb/seg (el modo estándar) o 10 Kb/seg (modo de velocidad de transmisión baja). Recientemente han aparecido los sistemas con la velocidad de transmisión serial 3.4 Mb/sec. La distancia entre los dispositivos que se comunican por el bus I2C está limitada a unos metros.



+    -c %, /%   -;   -7c Un bus serial de interfaz de periféricos es un sistema para la comunicación serial que utiliza hasta cuatro líneas (normalmente solo son necesarias tres) - para recibir los datos, para transmitir los datos, para sincronizar y (opcional) para seleccionar el dispositivo con el que se comunica. Esto es la conexión full duplex, lo que significa que los datos se envían y se reciben simultáneamente. La velocidad de transmisión máxima es mayor que en el sistema de conexión I2C.

+( )c c ( .  , /  / c  w

1

MOVWF f

Mover el contenido de W a f

W -> f

1

MOVF f,d

Mover el contenido de f a d

f -> d

Z

1

CLRW

Borrar el contenido de W

0 -> W

Z

1

Z

1

2

1

1, 2

¦  "       

CLRF f

Borrar el contenido de f

0 -> f

SWAPF f,d

Intercambiar de nibbles en f

f(7:4),(3:0) -> f(3:0),(7:4)

1, 2

¦    . /*  ADDLW k

Sumar literal a W

W+k -> W

C, DC, Z

1

ADDWF f,d

Sumar el contenido de W y f

W+f -> d

C, DC ,Z

1

SUBLW k

Restar W de literal

k-W -> W

C, DC, Z

1

SUBWF f,d

Restar W de f

f-W -> d

C, DC, Z

1

ANDLW k

AND W con literal

W AND k -> W

Z

1

ANDWF f,d

AND W con f

W AND f -> d

Z

1

1, 2

1, 2

1, 2

IORLW k

OR inclusivo de W con literal

W OR k -> W

Z

1

IORWF f,d

OR inclusivo de W con f

W OR f -> d

Z

1

1, 2

XORWF f,d

OR exclusivo de W con literal

W XOR k -> W

Z

1

1, 2

XORLW k

OR exclusivo de W con f

W XOR f -> d

Z

1

INCF f,d

Sumar 1 a f

f+1 -> f

Z

1

1, 2

DECF f,d

Restar 1 a f

RLF f,d

f-1 -> f

Z

1

1, 2

Rotar F a la izquierda a través del bit de Acarreo

C

1

1, 2

RRF f,d

Rotar F a la derecha a través del bit de Acarreo

C

1

1, 2

COMF f,d

Complementar f

Z

1

1, 2

BCF f,b

Poner a 0 el bit b del registro f

0 -> f(b)

1

1, 2

BSF f,b

Poner a 1 el bit b del registro f

1 -> f(b)

1

1, 2

BTFSC f,b

Saltar si bit b de registro f es 0

Skip if f(b) = 0

1 (2)

3

BTFSS f,b

Saltar si bit b de reg. f es 1

Skip if f(b) = 1

1 (2)

3

f -> d

¦       

¦     "* 

DECFSZ f,d

Disminuir f en 1. Saltar si el resultado es 0

f-1 -> d skip if Z = 1

1 (2)

1, 2, 3

INCFSZ f,d

Incrementar f en 1. Saltar si el resultado es 1

f+1 -> d skip if Z = 0

1 (2)

1, 2, 3

GOTO k

Saltar a una dirección

k -> PC

2

CALL k

Llamar a una subrutina

PC -> TOS, k -> PC

2

RETURN

Retornar de una subrutina

TOS -> PC

2

RETLW k

Retornar con literal en W

k -> W, TOS -> PC

2

RETFIE

Retornar de una interupción

TOS -> PC, 1 -> GIE

2

     NOP

No operación

TOS -> PC, 1 -> GIE

CLRWDT

Reiniciar el temporizador perro guardián

0 -> WDT, 1 -> TO, 1 -> PD

1 TO, PD

1

SLEEP

Poner en estado de reposo

0 -> WDT, 1 -> TO, 0 -> PD

TO, PD

1

*1 Si un registro de E/S está modificado, el valor utilizado será el valor presentado en los pines del microcontrolador. *2 Si la instrucción se ejecuta en el registro TMR y si d=1, el pre-escalador será borrado. *3 Si la instrucción se ejecuta en el registro TMR y si d=1, el pre-escalador será borrado.

 Arquitectura de los microcontroladores PIC de 8 bits. Cuáles de estos módulos pertenecerán al microcontrolador, dependerá del tipo de microcontrolador

c "/1 9     

Ñsted seguramente sabe que no es suficiente sólo conectar el microcontrolador a los otros componentes y encender una fuente de alimentación para hacerlo funcionar, ¿verdad? [ay que hacer algo más. Ge necesita programar el microcontrolador. Gi cree que esto es complicado, está equivocado. Todo el procedimiento es muy simple. Basta con leer el texto para entender de lo que estamos hablando.  2.1 LENGUAJES DE PROGRAMACIÓN          

2.2 CARACTERÍSTICAS PRINCIPALES DEL MIKROC 2.3 TIPOS DE DATOS EN MIKROC 2.4 VARIABLES Y CONSTANTES 2.5 OPERADORES 2.6 ESTRUCTURAS DE CONTROL 2.7 TIPOS DE DATOS AVANZADOS 2.8 FUNCIONES 2.9 CARACTERÍSTICAS PRINCIPALES DEL PREPROCESADOR 2.10 MIKROC PRO FOR PIC 2.11 PROGRAMAR LOS PIC UTILIZANDO MIKROC PRO FOR PIC

" '°  ' c

 El microcontrolador ejecuta el programa cargado en la memoria Flash. Esto se denomina el código ejecutable y está compuesto por una serie de ceros y unos, aparentemente sin significado. Dependiendo de la arquitectura del microcontrolador, el código binario está compuesto por palabras de 12, 14 o 16 bits de anchura. Cada palabra se interpreta por la CPU como una instrucción a ser ejecutada durante el funcionamiento del microcontrolador. Todas las instrucciones que el microcontrolador puede reconocer y ejecutar se les denominan colectivamente Conjunto de instrucciones. Como es más fácil trabajar con el sistema de numeración hexadecimal, el código ejecutable se representa con frecuencia como una serie de los números hexadecimales denominada código Hex. En los microcontroladores PIC con las

palabras de programa de 14 bits de anchura, el conjunto de instrucciones tiene 35 instrucciones diferentes.

 '°   %

 Como el proceso de escribir un código ejecutable era considerablemente arduo, en consecuencia fue creado el primer lenguaje de programación denominado ensamblador (ASM). Siguiendo la sintaxis básica del ensamblador, era más fácil escribir y comprender el código. Las instrucciones en ensamblador consisten en las abreviaturas con significado y a cada instrucción corresponde una localidad de memoria. Un programa denominado ensamblador compila (traduce) las instrucciones del lenguaje ensamblador a código máquina (código binario). HEste programa compila instrucción a instrucción sin optimización. Como permite controlar en detalle todos los procesos puestos en marcha dentro del chip, este lenguaje de programación todavía sigue siendo popular.

(  B   1 B 1 9    3  A pesar de todos los lados buenos, el lenguaje ensamblador tiene algunas desventajas:   

Incluso una sola operación en el programa escrito en ensamblador consiste en muchas instrucciones, haciéndolo muy largo y difícil de manejar. Cada tipo de microcontrolador tiene su propio conjunto de instrucciones que un programador tiene que conocer para escribir un programa Un programador tiene que conocer el hardware del microcontrolador para escribir un programa

Programa escrito en C (El mismo programa compilado al código ensamblador):

 Los lenguajes de programación de alto nivel (Basic, Pascal, C etc.) fueron creados con el propósito de superar las desventajas del ensamblador. En lenguajes de programación de alto nivel varias instrucciones en ensamblador se sustituyen por una sentencia. El programador ya no tiene que conocer el conjunto de instrucciones o características del hardware del microcontrolador utilizado. Ya no es posible conocer exactamente cómo se ejecuta cada sentencia, de todas formas ya no importa. Aunque siempre se puede insertar en el programa una secuencia escrita en ensamblador. Si alguna vez ha escrito un programa para un microcontrolador PIC en lenguaje ensamblador, probablemente sepa que la arquitectura RISC carece de algunas instrucciones. Por ejemplo, no hay instrucción apropiada para multiplicar dos números. Por supuesto, para cada problema hay una solución y éste no es una excepción gracias a la aritmética que permite realizar las operaciones complejas al descomponerlas en un gran número operaciones más simples. En este caso, la multiplicación se puede sustituir con facilidad por adición sucesiva (a x b = a + a + a + ... + a). Ya estamos en el comienzo de una historia muy larga... No hay que preocuparse al utilizar uno de estos lenguajes de programación de alto nivel como es C, porque el compilador encontrará automáticamente la solución a éste problema y otros similares. Para multiplicar los números a y b, basta con escribir a*b.

 1 Bc

El lenguaje C dispone de todas las ventajas de un lenguaje de programación de alto nivel (anteriormente descritas) y le permite realizar algunas operaciones tanto sobre los bytes como sobre los bits (operaciones lógicas, desplazamiento etc.). Las características de C pueden ser muy útiles al programar los microcontroladores. Además, C está estandarizado (el estándar ANSI), es muy portable, así que el mismo código se puede utilizar muchas veces en diferentes proyectos. Lo que lo hace accesible para cualquiera que conozca este lenguaje sin reparar en el propósito de uso del microcontrolador. C es un lenguaje compilado, lo que significa que los archivos fuentes que contienen el código C se traducen a lenguaje máquina por el compilador. Todas estas características hicieron al C uno de los lenguajes de programación más populares.

 La figura anterior es un ejemplo general de lo que sucede durante la compilación de programa de un lenguaje de programación de alto nivel a bajo nivel.

""cc     )( '(  )   ( (ëë +(  (    ( (  )      (      &%'  '"     &%'  4Ê      |&%'   Ê  "     ,

La palabra clave de C µbreak¶ se puede utilizar en cualquier tipo de bloques. Al utilizar µbreak¶, es posible salir de un bloque aunque la condición para su final no se haya cumplido. Ge puede utilizar para terminar un bucle infinito, o para forzar un bucle a terminar antes de lo normal.

%c  A menudo es necesario repetir una cierta operación un par de veces en el programa. Un conjunto de comandos que se repiten es denominado un bucle de programa. Cuántas veces se ejecutará, es decir cuánto tiempo el programa se quedará en el bucle, depende de las condiciones de salir del bucle.

%?6 El bucle while se parece a lo siguiente: Ê  Ê (    ,

Los comandos se ejecutan repetidamente (el programa se queda en el bucle) hasta que la expresión llegue a ser falsa. Si la expresión es falsa en la entrada del bucle, entonces el bucle no se ejecutará y el programa continuará desde el fin del bucle while. Un tipo especial del bucle de programa es un bucle infinito. Se forma si la condición sigue sin cambios dentro del bucle. La ejecución es simple en este caso ya que el resultado entre llaves es siempre verdadero (1=verdadero), lo que significa que el programa se queda en el mismo bucle:

Ê(ëë + 4  JK 67JF ( '  (    JK 67J ëë + '( (   ( 

( ( ? ! ëë '  6    7 ,

%- El bucle 8 se parece a lo siguiente:    Ê Ê ÊÊ  Ê   ÊÊ Ê  Ê (  Ê   ,

La ejecución de esta secuencia de programa es similar al bucle while, salvo que en este caso el proceso de especificar el valor inicial (inicialización) se realice en la declaración. La expresión_ inicial especifica la variable inicial del bucle, que más tarde se compara con la expresión_ de_condición antes de entrar al bucle. Las operaciones dentro del bucle se ejecutan repetidamente y después de cada iteración el valor de la expresión_inicial se incrementa de acuerdo con la regla cambiar_expresión. La iteración continúa hasta que la expresión_de_condición llegue a ser falsa.   O

ëë >    L (     ( 6    7 -  Ê ëë   4 ( '    '( D ' D 

La operación se ejecutará cinco veces. Luego, al comprobar se valida que la expresión k$8 ' 5   ëë /    ( &%&%'%& ëë O  >$8 ' 5  ëë /   ( Ê

ëë $  (   ,  Ê ÊO Ê

(ëë %  4 DF  DF   &+!! -  ëë , ( 4 M

N   >$8 ' 5   ëë /    ( &%&%'%& ëë O  >$8 ' 5  ëë /   ( , Ê ëë %  4 D     ( 

&+!! -  ëë , ( 4 M

N   >$8



' 5   ëë /    (



&%&%'%& ëë O >$8



' 5  ëë /   (



Ê

ëë $  (  

, ÊÊO ëë $ D

  c    c% D A veces es necesario detener y salir de un bucle dentro de su cuerpo. La sentencia break se puede utilizar dentro de cualquier bucle (while, for, do while) y en las sentencias switch también. En éstas la sentencia break se utiliza para salir de las sentencias switch si la

condición case es verdadera. En este ejemplo, ³Esperar´ está parpadeando en la pantalla LCD hasta que el programa detecte un uno lógico en el pin 0 del puerto PORTA.

Ê(ëë O     Ê +#4 ëë H (  (  D*   '    '  ëë H0/;" ( A (   F (     &+!!   ëë , ( 4 M+('N   >$8 ' 5   ëë /    ( &%&%'%& ëë O >$8 ' 5  ëë /   ( ,

  cc  La sentencia continue colocada dentro de un bucle se utiliza para saltar una iteración. A diferencia de la sentencia break, el programa se queda dentro del bucle y las iteraciones continúan.

ëë # F '       ( D '  ëë   (  4 ) '   ( (  D  Ê O ( Ê (ëë (   '    ( D '  &%&%'%&  &+!! 'ÊÊÊ 5   ' 5    

 Ô

Ê |ëë 8('P(  ( )F (    (  K   I

,  2 ëë +(  ( D *!   ( 

ë 9 ( ' ( '     ) ë  &+!! 'ÊÊÊ Ê+6 ëë H ( (?   >$8 ' 5    

 ,

  c' La sentencia goto le permite hacer un salto absoluto al otro punto en el programa. Esta característica se debe utilizar con precaución ya que su ejecución puede causar un salto incondicional sin hacer caso a todos los tipos de limitaciones de anidación. El punto destino es

identificado por una etiqueta, utilizada como un argumento para la sentencia goto. Una etiqueta consiste en un identificador válido seguido por un colon (:).



Ê%+   Ê  ÊÊ ëë # ( (     ëë      $0HX: # 4 ëë H0/;" (  *      & = ëë Y   ' D '  D   :>HX:  #%+ )  #%+  ëë Y   ( ( ' (  & ëë H(     ? (  

1c El registro PCON contiene solamente dos bits de banderas utilizados para diferenciar entre un Power-on reset (POR), un Brown-out reset (BOR), un reinicio por el temporizador perro guardián (WDT) y un reinicio externo por el pin MCLR.





? / =/=? N/ 22+2 6 2 9          2 B   /  3 9 , 

 - Se habilita salir del modo de ultra bajo consumo.



L - No se habilita salir del modo de ultra bajo consumo.

% /8= % 22+2  6 2 9  % 8= ,





 - Se habilita Brown-out reset.



L - Se deshabilita Brown-out reset.

/=/  2+2  = / , 

 - No se ha producido Power - on reset.



L - Se ha producido Power - on reset. El bit debe ponerse a uno por software después de que se haya producido un Power - on reset.



%/%= / 2+2  %=  /, 

 - No se ha producido Brown - out reset.



L - Se ha producido Brown - out reset. El bit debe ponerse a uno por software después de que se haya producido Brown - out reset.

 'c)c La memoria de programa del PIC16F887 es de 8K y tiene 8192 localidades para el almacenamiento de programa. Por esta razón, el contador de programa debe de ser de 13 bits de anchura (213 = 8192). Para habilitar el acceso a una localidad de memoria de programa durante el funcionamiento del microcontrolador , es necesario acceder a su dirección por medio de los registros SFR. Como todos los registros SFR son de 8 bits de anchura, este registro de direccionamiento es creado ³artificialmente´ al dividir los 13 bits en dos registros independientes, PCLATH y PCL. Si la ejecución de programa no afecta al contador de programa, el valor de este registro va incrementándose automática y constantemente: +1, +1, +1, +1... De esta manera, el programa se ejecuta como está escrito - instrucción a instrucción, seguido por un incremento de dirección constante.

Si el contador de programa ha sido cambiado por software, debe tomar en cuenta lo siguiente para evitar problemas: 

 

Los ocho bits inferiores (el byte inferior) del regis tro PCL son de lectura/escritura, mientras que los cinco bits superiores del registro PCLATH son de sólo escritura. El registro PCLATH se borra con cada reinicio. En el lenguaje ensamblador, el valor del contador de programa está marcado con PCL y se refiere sólo a los ocho bits. Usted debe tener cuidado al utilizar la instrucción ''=4 %& . Esto es una instrucción de salto que especifica la localidad destino al añadir un número a la dirección actual. Se utiliza con frecuencia para saltar a la tabla de búsqueda o a la tabla de ramificación de programa y leerlas. Un problema surge si la dirección actual es de tal tamaño que al sumar se produce un cambio en un bit que pertenece al byte superior del registro PCLATH. La ejecución de una instrucción sobre el registro PCL causa simultáneamente la sustitución de los bits del contador de programa por los contenidos en el



registro PCLATH. De todos modos, el registro PCL puede acceder sólo a 8 bits inferiores del resultado de la instrucción, pues el siguiente salto será completamente incorrecto. La solución a este problema es poner estas instrucciones en las direcciones que terminan en xx00h. De esta manera se habilitan los saltos de programa hasta 255 localidades. Si se ejecutan los saltos más largos por medio de e sta instrucción, el registro PCLATH debe ser incrementado por 1 cada vez que se produce desbordamiento en el registro PCL. Al llamar una subrutina o al ejecutarse un salto (instrucciones c y ), el microcontrolador es capaz de proporcionar solamente direccionamiento de 11 bits. Similar a la RAM que está dividida en ³bancos´, la ROM está dividida en las cuatro ³páginas´ de 2K cada una. Las instrucciones dentro de estas páginas se ejecutan regularmente. Dicho de manera sencilla, como el procesador está proporcionado con una dirección de 11 bits del programa, es capaz de direccionar cualquier localidad dentro de 2KB. La siguiente figura muestra el salto a la dirección del subprograma PP1.

 Sin embargo, si una subrutina o una dirección de salto no está en la misma página que la localidad de salto, se deben proporcionar dos bits superiores que faltan al escribir en el registro PCLATH. La siguiente figura muestra el salto a la dirección de la subrutina PP2.

En ambos casos, cuando la subrutina llega a las instrucciones  ,    o   (vuelta al programa principal), el microcontrolador continuará con la ejecución de programa desde donde se interrumpió, ya que la dirección de retorno se empuja y se guarda en la pila que consiste en registros de 13 bits, como hemos mencionado.

 '  cc   c Además del direccionamiento directo, que es lógico y claro (basta con especificar la dirección de un registro para leer su contenido), este microcontrolador es capaz de realizar el direccionamiento indirecto por los registros INDF y FSR. A veces esto facilita el proceso de escribir un programa. El procedimiento entero está habilitado ya que el registro INDF no es real (no existe físicamente), sino que solamente especifica el registro cuya dirección está situada en el registro FSR. Por esta razón, escribir o leer los datos del registro INDF realmente significa escribir o leer del registro cuya dirección está situada en el registro FSR. En otras palabras, direcciones de registros se especifican en el registro FSR, y su contenido se almacena en el registro INDF. La diferencia entre el direccionamiento directo e indirecto se muestra en la siguiente figura: Como hemos visto, el problema con "los bits de direccionamiento que faltan" se soluciona con un "préstamo" del otro registro. Esta vez, es el séptimo bit, denominado bit IRP del registro STATUS.

Ñna de las características más importantes del microcontrolador es el número de los pines de entrada/ salida, que permite conectarlo con los periféricos. El PIC16F887 tiene en total 35 pines de E/G de propósito general, lo que es suficiente para la mayoría de las aplicaciones.

**   . Con el propósito de sincronizar el funcionamiento de los puertos de E/S con la organización interna del microcontrolador de 8 bits, ellos se agrupan, de manera similar a los registros, en cinco puertos denotados con A, B, C, D y E. Todos ellos tienen las siguientes características en común: 



Por las razones prácticas, muchos pines de E/S son multifuncionale s. Si un pin re aliza una de estas funciones, puede ser utilizado como pin de E/S de propósito general. Cada puerto tiene su propio registro de control de flujo, o sea el registro TRIS correspondiente: TRISA, TRISB, TRISC etc. lo que determina el comportamiento de bits del puerto, pero no determina su contenido.

Al poner a cero un bit del registro TRIS (pin=0), el pin correspondiente del puerto se configurará como una salida. De manera similar, al poner a uno un bit del registro TRIS (bit=1), el pin correspondiente del puerto se configurará como una entrada. Esta regla es fácil de recordar: 0 = Entrada 1 = Salida.

51 El puerto PORTA es un puerto bidireccional, de 8 bits de anchura. Los bits de los registros TRISA y ANSEL controlan los pines del PORTA. Todos los pines del PORTA se comportan como entradas/salidas digitales. Cinco de ellos pueden ser entradas analógicas (denotadas por AN):

RA0 = AN0 (determinado por el bit ANS0 del registro ANSEL)

RA1 = AN1 (determinado por el bit ANS1 del registro ANSEL)

RA2 = AN2 (determinado por el bit ANS2 del registro ANSEL)

RA3 = AN3 (determinado por el bit ANS3 del registro ANSEL)

RA5 = AN4 (determinado por el bit ANS4 del registro ANSEL) Similar a que los bits del registro TRISA determinan cuáles pines serán configurados como entradas y cuáles serán configurados como salidas, los bits apropiados del registro ANSEL determinan si los pines serán configurados como entradas analógicas o entradas/salidas digitales. Cada bit de este puerto tiene una función adicional relacionada a algunas unidades periféricas integradas, que vamos a describir en los siguientes capítulos. Este capítulo cubre sólo la función adicional del pin RA0, puesto que está relacionado al puerto PORTA y a la unidad ULPWU. (  6   Nc ëë + '  H0/;" (  *     *   ; ( ( !( ' (  ' ëë H0/;" ( ( ( *  (      &  &; ëë ; ( ( ' (  +ë# (  *  *  ( +# ëë ; ( ( ' (  ' H0/;" ( '   #         ëë ; ( ( ' (  ' H0/;"  '   ëë H0/;" (  *  ( (  

? El microcontrolador se utiliza generalmente en los dispositivos que funcionan periódicamente y completamente independiente utilizando una fuente de alimentación de batería. En tal caso, el consumo de corriente mínimo es una de las prioridades. Los ejemplos típicos de tales aplicaciones son: termómetros, sensores de detección del fuego y similar. Es conocido que al reducir frecuencia de reloj se reduce el consumo de corriente, pues una de las soluciones más convenientes a este problema es bajar la frecuencia de reloj, o sea utilizar el cristal de cuarzo de 32KHz en vez de el de 20MHz.

 Al poner el microcontrolador en el modo de reposo es otro paso en la misma dirección. Aún ha quedado el problema de salir de este modo y poner el microcontrolador en modo normal de funcionamiento. Es obviamente necesario tener una señal externa en alguno de los pines. Esta señal debe ser generada por componentes electrónicos adicionales, lo que resulta en un consumo de energía más alto del dispositivo completo... La solución perfecta sería que el microcontrolador saliera del modo de reposo periódicamente por si mismo, lo que no es imposible. El circuito que lo habilita se muestra en la figura a la izquierda. El principio de funcionamiento es simple: Un pin se configura como salida y se le lleva un uno lógico (1). Esto causa una carga del capacitor. Inmediatamente después, el mismo pin se configura como entrada. El cambio de estado lógico habilita una interrupción y el microcontrolador entra en modo de reposo. Sólo ha quedado esperar que se descargue el capacitor por la corriente de fuga fluyendo por el pin de entrada. Después de la descarga, se produce una interrupción y el microcontrolador continúa con la ejecución de programa en modo normal. Todo el procedimiento se repite.

 En teoría, esto es una solución perfecta. El problema es que todos los pines capaces de causar una interrupción son digitales y tienen una corriente de fuga relativamente alta cuando el voltaje sobre ellos no está cerca de los valores límites de Vdd (1) o VSS (0). En este caso, el condensador se descarga en poco tiempo ya que la corriente es de varias centenas de microamperios. Por esta razón se diseñó el circuito ULPWU, capaz de indicar una lenta caída de voltaje con un consumo de corriente mínimo.

La salida genera una interrupción, mientras que la entrada está conectada a uno de los pines del microcontrolador. Es el pin RA0. Refiriéndose a la Figura (R=200 ohms, C=1nF), el tiempo de descarga es aproximadamente 30mS, mientras que un consumo total de corriente del microcontrolador es 1000 veces más bajo (de varias centenas de nanoamperios).

%51% El puerto PORTB es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISB determinan la función de sus pines.

Similar al puerto PORTA, un uno lógico (1) en el registro TRISB configura el pin apropiado en el puerto PORTB y al revés. Los seis pines de este puerto se pueden comportar como las entradas analógicas (AN). Los bits del registro ANSELH determinan si estos pines serán configurados como entradas analógicas o entradas/salidas digitales: RB0 = AN12 (determinado por el bit ANS12 del registro ANSELH)

RB1 = AN10 (determinado por el bit ANS10 del registro ANSELH)

RB2 = AN8 (determinado por el bit ANS8 del registro ANSELH)

RB3 = AN9 (determinado por el bit ANS9 del registro ANSELH)

RB4 = AN11 (determinado por el bit ANS11del registro ANSELH)

RB4 = AN11 (determinado por el bit ANS11del registro ANSELH)

Cada bit de este puerto tiene una función adicional relacionada a algunas unidades periféricas integradas, que vamos a describir en los siguientes capítulos. Este puerto dispone de varias características por las que se distingue de otros puertos y por las que sus pines se utilizan con frecuencia: 

Todos los pines del puerto PORTB tienen las resistencias pull-up integradas, que los hacen perfectos para que se conecten con los botones de presión (con el teclado), interruptores y optoacopladores. Con el propósito de conectar las resisitencias a los puertos del microcontrolador, el bit apropiado del registro WPUB debe estar a uno.*

Al tener un alto nivel de resistencia (varias decenas de kiloohmios), estas resistencias "virtuales" no afectan a los pines configurados como salidas, sino que sirven de un complemento útil a las entradas. Estas resistencias están conectados a las entradas de los circuitos lógicos CMOS. De lo contrario, se comportarían como si fueran flotantes gracias a su alta resistencia de entrada.



Además de los bits del registro WPÑB, hay otro bit que afecta a la instalación de las resistencias pull-up. Es el bit RBPÑ del registro OPTION_REl.  Al estar habilitado, cada bit del puerto PORTB configurado como una entrada

puede causar una interrupción al cambiar su estado lógico. Con el propósito de habilitar que los termi nales causen una interrupción, e l bit apropiado del registro IOCB debe estar a uno.

Gracias a estas características, los pines del puerto PORTB se utilizan con frecuencia para comprobar los botones de presión en el teclado ya que detectan cada apretón de botón infaliblemente. Por eso, no es necesario examinar todas las entradas una y otra vez.

 Cuando los pines X,Y y Z se configuran como entradas de puesta a uno (1), sólo se necesita esperar una petición de interrupción que aparece al apretar un botón. Más tarde, se comprueba cuál botón fue activado al combinar ceros y unos en las entradas. (  6   Nc

ë + '  H0/;O (  *    *   # '    ' D        ( (  D*  ; P    ( (  '

' ; ( ( !( ' (  ' H0/;O (  ( *  ( ë     &  &; ëë ; ( ( ' (  +ë# (  *  *  ( +#" %3#;/:$$%B3 &Z >B@%$0&



+&=      AO%;# H#F H#F Z H# H03+3 +> ,">0/

%&4#  AH03+/ " $+/0 ;9/ Z H/++#$">"80/

+&=   A#+>+$$%03"/ >0# O%;# H#FH#FH# Z H03+/>0#

+=4+ # +  )A8+> 8%,%#0/ 8+ E/+$:+3$%"# " S



De manera similar, al cambiar de asignación del pre -escalador del WDT al Timer0, es necesario ejecutar la siguiente secuencia de instru cciones, también escritas en ensamblador:



0# " $+/0 H0/ >" %3#;/:$$%B3 &Z >B@%$0&



+&=      A,">0/ 8+> 8%,%#0/ 8+ E/+$:+3$%"# +# S 

+=4+ # +  )

Para utilizar el Timer0 apropiadamente, es necesario:        El modo de temporizador se selecciona por el bit TOSC del registro

OPTION_REG (TOSC: 0=temporizador, 1=contador).





Cuando se asigna el pre -escalador al temporizador/contador se debe poner a cero el bit PSA del registro OPTION_REG. El valor del divisor de frecuencias se configura al utilizar los bits PS2 -PS0 del mismo registro. Al utilizar una interrupción, los bits GIE y TMR0IE del registro INTCON deben estar a uno.

 "   5          Reiniciar el registro TMR0 o escribir un valor conocido en él.  El tiempo transcurrido(en microsegundos al utilizar el oscilador de 4MHz ) se 

mide al leer el registro TMR0. El bit de bandera TMR0IF del registro INTCON se pone a uno automáticamente siempre que ocurra el desbordamiento del registro TMR0. Si está habilitada, ocurre una interrupción.

      La polaridad de pulsos a contar en el pin RA4 se selecciona por el bit TOSE del 

registro OPTION_REG (T0SE: 0=pulsos positivos, 1=pulsos negativos). Varios pulsos se pueden leer del registro TMR0. El pre -escalador y la interrupción se utilizan de la misma forma que en el modo de t emporizador.

*G ;  El módulo del temporizador Timer1 es un temporizador/contador de 16 bits, lo que significa que consiste en dos registros (TMR1L y TMR1H). Puede contar hasta 65535 pulsos en un solo ciclo, o sea, antes de que el conteo se inicie desde cero.

 Similar al temporizador Timer0, estos registros se pueden leer o se puede escribir en ellos en cualquier momento. En caso de que ocurra un desbordamiento, se genera una interrupción si está habilitada. El módulo del temporizador Timer1 puede funcionar en uno o dos modos básicos, eso es como un temporizador o como un contador. A diferencia del temporizador Timer0, cada uno de estos dos modos tiene funciones adicionales. El temporizador Timer1 tiene las siguientes características:    

Temporizador/contador de 16 bits compuesto por un par de registros; Fuente de reloj interna o externa programable; Pre-escalador de 3 bits; Oscilador LP opcional;

    

Funcionamiento síncrono o asíncrono; Compuerta para controlar el temporizador Timer1 (conteo h abilitado) por medio del comparador o por el pin T1G; Interrupción por desbordamiento; "Despierta" al microcontrolador (salida del modo de reposo) por desbordamiento (reloj externo); y Fuente de reloj para la función de Captura/Comparación.

  cc -    °  ;  El bit TMR1CS del registro T1CON se utiliza para seleccionar la fuente de reloj para este temporizador: -     °



c 

Fosc/4

0

T1CKI pin

1

Al seleccionar la fuente de reloj interna, el par de registros TMR1H-TMR1L será incrementado con varios pulsos Fosc como es determinado por el pre-escalador. Al seleccionar la fuente de reloj externa, este temporizador puede funcionar como un temporizador o un contador. Los pulsos en el modo temporizador pueden estar sincronizados con el reloj interno del microcontrolador o funcionar asíncronamente. En caso de que se necesite un oscilador del reloj externo y el microcontrolador PIC16F887 utilice el oscilador interno INTOSC con el pin RA6/OSC2/CLIKOUT, el temporizador Timer1 puede utilizar el oscilador LP como una fuente de reloj.

 / c  ;  El temporizador Timer1 tiene un escalador completamente separado que permite dividir la frecuencia de entrada de reloj por 1,2,4 o 8. No es posible leer el pre-escalador o escribir en él directamente. De todas formas, el contador del pre-escalador se pone a 0 automáticamente después de escribir en los registros TMR1H o TMR1L.

c  ;  Los pines RC0/T1OSO y RC1/T1OSI se utilizan para registrar los pulsos que vienen de los dispositivos periféricos, pero también tienen una función adicional. Como se puede ver en la siguiente figura, se configuran simultáneamente como entrada (pin RC1) y salida (pin RC0) del oscilador de cuarzo LP (Low Power - de bajo consumo) adicional. Este circuito está principalmente diseñado para funcionar a bajas frecuencias (hasta 200 KHz), exactamente para el uso de cristal de cuarzo de 32.768 KHz. Este cristal se utiliza en los relojes de cristal puesto que es fácil de obtener un pulso de duración de un segundo al dividir esta frecuencia. Como el oscilador no depende del reloj interno, puede funcionar incluso en el modo de reposo. Se habilita al poner a uno el bit de control T1OSCEN del registro T1CON. El usuario debe proporcionar tiempo muerto por medio de software (unos pocos milisegundos) para habilitar que el oscilador se inicie apropiadamente.

 La siguiente tabla muestra los valores recomendados de los capacitores convenientes con el oscilador de cuarzo. No es necesario que estos valores sean exactos. De todas formas, la regla general es: cuánto más alta sea la capacidad, tanto más alta será la estabilidad, lo que a la vez prolonga el tiempo necesario para la estabilización del oscilador. c    

LP

- c c

c 

c" 

32 kHz

33 pF

33 pF

100 kHz

15 pF

15 pF

200 kHz

15 pF

15 pF

El consumo de corriente del microcontrolador se reduce a nivel más bajo en el modo de reposo ya que el consumidor de corriente principal - el oscilador - no funciona. Es fácil de poner al

microcontrolador en este modo - al ejecutar la instrucción SLEEP. El problema es cómo despertar al microcontrolador porque sólo una interrupción puede producirlo. Como el microcontrolador ³duerme´, se debe usar una interrupción causada por dispositivos periféricos para ³despertarlo´. Se pone muy complicado si es necesario despertar al microcontrolador a intervalos de tiempo regulares... Para resolver el problema, un oscilador de cuarzo LP (de bajo consumo de corriente) completamente independiente, capaz de funcionar en el modo de reposo, está integrado en el microcontrolador PIC16F887. Simplemente, un circuito anteriormente separado ahora está integrado en el microcontrolador y asignado al temporizador Timer1. El oscilador está habilitado al poner a 1 el bit T1OSCEN del registro T1CON. El bit TMR1CS del mismo registro se utiliza para habilitar que el temporizador Timer1 utilice secuencias de pulsos de ese oscilador.





Una señal generada por este oscilador de cuarzo está sincronizada con el reloj del microcontrolador al poner a 0 el bit T1SYNC. En este caso, el temporizador no puede funcionar en modo de reposo porque el circuito para sincronización utiliza el reloj del microcontrolador. La interrupción por desbordamiento en el registro del temporizador Timer1 puede estar habilitada. Si el bit T1SYNC se pone a 1, tales interrupc iones se producirán en el modo de reposo también.

c    ;  El pin TG1 o la salida del comparador C2 pueden ser una fuente de los pulsos que pasan por la compuerta del temporizador Timer1. Se configuran por software. Esta compuerta permite que el temporizador mida directamente la duración de los eventos externos al utilizar el estado lógico del pin T1G o los eventos analógicos al utilizar la salida del comparador C2. Refiérase a la Figura en la página anterior. Para medir duración de señal, basta con habilitar esta compuerta y contar los pulsos que pasan por ella.

     ; Para seleccionar este modo, es necesario poner a 0 el bit TMR1CS. Después de eso, el registro de 16 bits será incrementado con cada pulso generado por el oscilador interno. Si se utiliza el cristal de cuarzo de 4 MHZ, el registro será incrementado cada microsegundo. En este modo, el bit T1SYNC no afecta al temporizador porque cuenta los pulsos de reloj interno. Como todos los dispositivos utilizan estos pulsos, no hace falta sincronizarlos.

El oscilador de reloj del microcontrolador no funciona durante el modo de reposo así que el desbordamiento en el registro del temporizador no puede causar interrupción. (  6   Nc ëë + ( ?' F  ;9/ (!  *    ' 4      ëë  '(    SI $  4     (    ( * (( ;9/Y ëë ;9/>F ( ( !  ' D  ÊÊ (  #  4 ëë H          ;9/%E # ;  ëë H      '  ' 4  ;  # &     # % ëë ;' 4   ( ' ((  (    #%6 #%6  ëë +    '(    ( *  ( SI  #  ëë %' D    ' (    #%+   % ëë %' D    6 ( @%+ - H+%+7 # + ëë +    ' 4  ; 



    c El temporizador Timer1 se pone a funcionar como un contador al poner a 1 el bit TMR1CS. Este bit cuenta los pulsos llevados al pin PC0/T1CKI y se incrementa en el flanco ascendente de la entrada del reloj externo T1CKI. Si el bit de control T1SYNC del registro T1CON se pone a 0, las entradas del reloj externo se sincronizarán en su camino al temporizador Timer1. En otras palabras, el temporizador Timer1 se sincroniza con el reloj interno del microcontrolador y se le denomina contador síncrono. Al poner en modo de reposo el microcontrolador que funciona de esta manera, los registros del temporizador Timer1H y TMR1L no serán incrementados aunque los pulsos de reloj aparezcan en los pines de entrada. Como el reloj interno del microcontrolador no funciona en este modo, no hay entradas de reloj que se utilicen para la sincronización. De todas formas, el preescalador sigue funcionando siempre que haya pulsos de reloj en los pines, porque es un simple divisor de frecuencias.

Este contador detecta un uno lógico (1) en los pines de entrada. Cabe destacar que al menos un flanco ascendente debe ser detectado antes de empezar a contar los pulsos. Refiérase a la Figura a la izquierda. Las flechas en la figura indican los incrementos del contador.



1c

'( - Timer1 Gate Invert bit (Bit inversor de la compuerta del temporizador1) se comporta como un inversor del estado lógico en la compuerta formada por el pin T1G o la salida (C2OUT) del comparador C2. Este bit habilita al temporizador para con tar los pulsos cuando la compuerta esté a alto o a bajo.  1 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estén a 

alto (1). 0 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estén a bajo (0).

 ' - Timer1 Gate Enable bit (Bit de habilitación de la compuerta del temporizador1) determina si la compuerta formada por el pin T1G o salida del comparador C2 (C2OUT) estará activa o no. Este bit es funcional sólo en caso de que el temporizador Timer1 esté encendido (el bit TMR1ON = 1). De lo contrario, este bit se ignora.  1 - Temporizador Timer1 está encendido sólo si la compuerta no está activa. 

0 - Compuerta no afecta al temporizador Timer1.

cD$cDL - Timer1 Input Clock Prescale Select bits (Bits de selección del preescalador de señal de reloj del Temporizador1) determina el valor del divisor de frecuen cias asignada al temporizador Timer1.  cD 

 cDL 

(        /  c    

0

0

1:1

0

1

1:2

1

0

1:4

1

1

1:8

c  - LP Oscillator Enable Control bit (bit de habilitación del oscilador LP del Timer1)

 

1 - Oscilador LP está habilitado para el reloj del Timer1 (oscilador de bajo consumo y de frecuencia de 32.768 kHz) 0 - Oscilador LP está apagado.

)c - Timer1 External Clock Input Synchronization Control bit (Bit de control de sincronización de la señal de entrada) habilita la sincronización de la entrada del oscilador LP o de la entrada del pin T1CKI con el reloj interno del microcontrolador. Este bit se ignora al contar los pulsos desde el oscilador principal (el bit TMR1CS = 0).  1 - Entrada de reloj externa no está sincronizada. 

0 - Entrada de reloj externa está sincronizada.

 c - Timer TMR1 Clock Source Select bit (bit de selección de la fuente de reloj del temporizador Timer1)  1 - Cuenta los pulsos po r el pin T1CKI (por el flanco ascendente 0 -1)  0 - Cuenta los pulsos del reloj interno del microcontrolador   - Timer1 On bit (TMR activo, hace entrar o no en funcionamiento el Timer1).  1 - Habilita el temporizador Timer1. 

0 - Deshabilita el temporizador Timer1.

Para utilizar el Timer1 apropiadamente, es necesario hacer lo siguiente:  



 

Como no es posible apagar el pre -escalador, su valor debe estar ajustado a los bits T1CKPS1 y T1CKPS0 del registro T1CON (Refiérase a la tabla). Seleccionar el modo por el bit TMR1CS del registro T1CON. (TMR1CS: 0=la fuente de reloj es oscilador de cuarzo interno, 1= la fuente de reloj es oscilador de cuarzo externo). Al configurar el bit T1OSCEN del mismo registro, el oscilador está habilitado y los registros TMR1H y TMR1L se incrementan con cada pulso de reloj. Al poner este bit a 0, se detiene el conteo. Al reiniciar los registros del contador o al escribir en ellos, se reinicia el pre escalador. Al llenar ambos registros del temporizador, se configura la bandera TMR1IF y el conteo empieza desde cero.

*H ; " El módulo del temporizador Timer2 es un temporizador de 8 bits.

Los pulsos que vienen del oscilador de cuarzo primero pasan por el pre-escalador cuyo valor puede ser modificado al combinar los bits T2CKPS1 y T2CKPS0. La salida del preescalador se utiliza para incrementar el registro TMR2 empezando por 00h. Los valores del TMR2 y del PR2 se comparan constantemente y el registro TMR2 va incrementándose hasta alcanzar el valor del registro PR2. Cuando se igualan los valores de los registros, lo que será registrado por el comparador, el TMR2 se reinicia a 00h automáticamente. El postescalador del temporizador Timer2 se incrementa y su salida se utiliza para generar una interrupción si está habilitada. Los ambos registros TMR y PR2 son de lectura y escritura. El conteo se puede detener al poner a 0 el bit TMR2ON, lo que resulta en un ahorro de energía. El momento de reinicio del TMR2 se puede utilizar para determinar la velocidad de transmisión en baudios de la comunicación serie síncrona. Varios bits del registro T2CON están en control del temporizador Timer2.

1"c

*/L - Timer2 Output Postcaler Select bits (bits de selección del rango del divisor del post-escalador para el Timer2) se utilizan para determinar el valor del post-escalador según la siguiente tabla:   *

  "

  

  L

(          /  c    

0

0

0

0

1:1

0

0

0

1

1:2

0

0

1

0

1:3

0

0

1

1

1:4

0

1

0

0

1:5

0

1

0

1

1:6

0

1

1

0

1:7

0

1

1

1

1:8

1

0

0

0

1:9

1

0

0

1

1:10

1

0

1

0

1:11

1

0

1

1

1:12

1

1

0

0

1:13

1

1

0

1

1:14

1

1

1

0

1:15

1

1

1

1

1:16

 " " 2 - (bit de activación del TIMR2) hace entrar en funcionamiento el temporizador Timer2.  1 - Habilita el funcionamiento del Timer2.  0 - Deshabilita el funcionamiento del Timer2. "cD$"cDL - Timer2 Clock Prescaler bits (selección del rango del divisor del preescalador del Timer2) determina el valor del divisor de frecuencias:  "cD 

 "cDL 

(        /  c    

0

0

1:1

0

1

1:4

1

x

1:16

Al utilizar el temporizador Timer2 hay que saber varios detalles relacionados con sus registros:    

En el momento de encender una fuente de alimentación, el registro PR2 contiene el valor FFh. Tanto el pre-escalador como el post-escalador se borran al escribir en el registro TMR2. Tanto el pre-escalador como el post-escalador se borran al escribir en el registro T2CON. Al producirse cualquier reinicio, como puede anticiparse, tanto el pre -escalador como el post-escalador se borran.

Los módulos CCP pueden funcionar en muchos modos diferentes, por lo que se consideran los más complicados. Gi usted intenta analizar su funcionamiento a base de tablas que describen las funciones de bits, comprenderá mejor de lo qué le estamos hablando. Gi utiliza alguno de

los módulos CCP, primero seleccione el modo que necesita, analice la figura apropiada y entonces póngase a modificar los bits de registros. Gi no...

*I cc El módulo CCP (Captura/Comparación/PW) es un periférico que le permite medir y controlar diferentes eventos. El     proporciona el acceso al estado actual de un registro que cambia su valor constantemente. En este caso, es el registro del temporizador Timer1. El      9 compara constantemente valores de dos registros. Uno de ellos es el registro del temporizador Timer1. Este circuito también le permite al usuario activar un evento externo después de que haya expirado una cantidad de tiempo predeterminada. ?

(Pulse Width odulation - modulación por ancho de pulsos) puede generar señales de

frecuencia y de ciclo de trabajo variados por uno o más pines de salida. El microcontrolador PIC16F887 dispone de dos módulos CCP - CCP1 y CCP2. Ambos son idénticos en modo normal de funcionamiento, mientras que las características del PWM mejorado están disponibles sólo en el modo CCP1. Ésta es la razón por la que en este capítulo se describe detalladamente el funcionamiento del módulo CCP1. Con respecto al CCP2, se presentarán sólo las características que lo distinguen del CCP1.

cc Una parte central de este circuito es un registro CCPR1 de 16 bits que consiste en registros CCPR1L y CCOR1H. Se utiliza para capturar y comparar sus valores con los números almacenados en el registro del temporizador Timer1 (TMR1H y TMR1L).

 Si está habilitado por software, puede ocurrir el reinicio del temporizador Timer1 al igualarse los valores en modo de Comparación. Además, el módulo CCP1 puede generar señales PWM de frecuencia y de ciclo de trabajo variados. Los bits del registro CCP1CON están en control del módulo CCP1.

cc   c En este modo, el registro del temporizador Timer1 (que consiste en los TMR1H y TMR1L) se copia al registro CCP1 (que consiste en los CCPR1H y CCPR1L) en las siguientes situaciones: 

Cada flanco ascendente (1 -> 0) en el pin RC2/CCP;

  

Cada flanco descendente (0 -> 1) en el pin RC2/CCP1; Cada cuarto flanco ascendente (0 -> 1) en el pin RC2/CCP1; y Cada decimosexto flanco descendente (0 -> 1) en el pin RC2/CCP1.

Una combinación de cuatro bits (CCP1M3 - CCP1M0) del registro de control determina cuál de estos eventos causará transmisión de dato de 16 bits. Además, se deben cumplir los siguientes requisitos::  

El pin RC2/CCP1 debe estar configurado como entrada; y El Timer1 debe func ionar como temporizador o contador síncrono.

 El bit de bandera CCP1IF se pone a uno después de acabar la captura. Si se pone a 1 el bit CCP1IE del registro PIE1, se producirá una interrupción. En caso de que el módulo CCP1 esté en modo de captura, puede producirse una interrupción no deseada. Para evitarlo, antes de que ocurra un cambio en el registro de control se deben poner a 0 tanto el bit que habilita la interrupción CCP1IE, como el bit de bandera CCP1IF. Las interrupciones no deseadas pueden producirse al cambiar el valor del pre-escalador. Para evitarlo, el módulo CCP1 debe estar apagado temporalmente antes de cambiar el valor del preescalador. Se recomienda la siguiente secuencia de programa, escrita en ensamblador:

O0//"80

A9B8:>0 $$H +#;C "H"@"80 +&=$$A3:+,0 9080 8+> H/++#$">"80/ +#;C #+>+$$%03"80 +=4%% %+ A+3 +> /+@%#;/0 8+ $03;/0> #+ %3;/08:$+ :3 3:+,0 ,">0/ A9B8:>0 $$H #+ +3$%+38+ #%9:>;C3+"9+3;+

(  6   Nc



G (  O0//"80 ëë 9B8:>0 $$H +#;C "H"@"80  +&=$$ëë 3:+,0 9080 8+> H/++#$">"80/ +#;C #+>+$$%03"80  +=4%% %+ ëë +3 +> /+@%#;/0 8+ $03;/0> #+ %3;/08:$+ 3:+,0 ,">0/ ,ëë 9B8:>0 $$H #+ +3$%+38+ #%9:>;C3+"9+3;+ 

cc   c c En este modo, el valor almacenado en el registro CCP1 se compara constantemente al valor almacenado en el registro del temporizador Timer1. Al igualarse los valores, el estado lógico en el pin de salida puede ser cambiado, lo que depende del estado de bits en el registro de control (CCP1M3 - CCP1M0). El bit de bandera CCP1IF se pone a uno simultáneamente.

 Para poner el módulo CCP1 en este modo de funcionamiento, se deben cumplir dos condiciones:

 

El pin RC2/CCP1 debe estar configurado como salida; y El temporizador Timer1 debe estar sincronizado con el reloj interno.

cc  ?  Las señales de frecuencia y de ciclo de trabajo variados tienen una amplia gama de aplicaciones en automatización. Un ejemplo típico es un circuito de control de potencia. Refiérase a la siguiente figura. Si un cero lógico (0) indica un interruptor abierto y un uno lógico (1) indica un interruptor cerrado, la potencia eléctrica que se transmite a los consumidores será directamente proporcional a la duración del pulso. Esta relación se le denomina Ciclo de Trabajo.

 El otro ejemplo, común en la práctica, es el uso de señales PWM en un circuito para generar señales de forma de onda arbitraria como una onda sinusoidal. Vea la siguiente figura:

 Los dispositivos que funcionan según este principio se utilizan con frecuencia en la práctica como variadores de frecuencia ajustable que controlan motores eléctricos (velocidad, aceleración, desaceleración etc.)

 La Figura anterior muestra el diagrama de bloques del módulo CCP1 puesto en el modo PWM. Para generar un pulso de forma arbitraria en el pin de salida, es necesario ajustar el período de pulsos (frecuencia) y la duración de pulsos.

 +E;7   F     ëë   6/%@Y;7   F     ('  6;0H7 (   7  +#%4 ëë 8/%,+O   6      6O0;;097 (   7 ' 5  | '%  ëë      =  /"6O0;;097 ,  ëë >     Z | Ê Ê ) @( ëë>  Z  +#%4  ëë 8/%,+"   6    4   6>+E;7 (   F     ëë   6/%@Y;7 (   F     ('  6;0H7   7  +#%4ëë 8/%,+O   6      6O0;;097   7 ' 5  | '% ëë      Z  /" 6   P   4   >+E;7 ,  ÊÊ (  +#     #    ëë /" - /" (  (  D* (   &      &; ëë $ * ( ' ( "3  *  (  +ë#  +#% ëë ; ( ( ' (  ' H0/;$ (!   6  -  ( ëë ' ( /$ 





- /$7 

# % ëë H0/;$ (  (   ëë %  4 D  @>$8 ) Êëë @ $8S )   3! !  ! 3! )    3! ! ! 3! )