Upload
elzytacogelona
View
42
Download
4
Embed Size (px)
Citation preview
Capítulo 1: El Mundo de los Microcontroladores
La situación nos encontramos hoy en el campo de los microcontroladores tiene sus inicios en el desarrollo
de la tecnología de circuitos integrados. Esto nos permitió almacenar cientos de miles de transistores en
un chip, que era una condición previa para la fabricación de microprocesadores. Las primeras
computadoras se hicieron mediante la adición de periféricos, tales como las líneas de memoria, entrada /
salida, temporizadores y otros circuitos, a la misma. Mayor incremento en la densidad de paquete resultó
en el diseño de un circuito integrado que contenía tanto el procesador y los periféricos. Así es como el
primer chip con una microcomputadora integrada, más tarde conocido como el microcontrolador, se ha
desarrollado.
1.1 Introducción
1.2 NÚMEROS, NÚMEROS, NÚMEROS ...
1.3 debe conocer los detalles
1.4 Microcontroladores PIC
1.1 INTRODUCCIÓN
Novicios en electrónica piensa generalmente que el microcontrolador es el mismo que el
microprocesador. Eso no es cierto. Se diferencian unas de otras muchas maneras. La diferencia primera y
más importante a favor del microcontrolador es su funcionalidad. A fin de que el microprocesador para ser
utilizado, otros componentes, en primer lugar la memoria, se debe añadir a la misma. Aunque se
considera una máquina de computación potente, no es capaz de establecer una comunicación directa con
los periféricos. En su lugar, los circuitos especializados debe ser utilizado para este propósito. Esto es lo
que era en el principio y sigue siendo la misma hoy en día.
Por otro lado, el microcontrolador está diseñado para ser todo ello en una. No hay otros componentes
periféricos especializados son necesarios para su funcionamiento como todos los circuitos necesarios,
que de otra forma pertenecen a los periféricos, ya se han construido en él. Se ahorra tiempo y del espacio
necesario en el diseño de un dispositivo.
TODO EL MICROCONTROLADOR ES CAPAZ DE
Los microcontroladores son muy populares hoy en día. Solo presta atención al ejemplo de abajo y usted
entenderá las razones de su gran éxito. No va a tomar mucho de su tiempo, sólo un par de minutos.
Alrededor de hace diez años, el proceso de diseñar un dispositivo electrónico para controlar un ascensor
en un edificio de varios pisos fue extremadamente difícil, incluso para un equipo de expertos. ¿Alguna vez
has pensado en lo que los requisitos de un elevador normal tiene que cumplir? ¿Cómo lidiar con la
situación cuando dos o más personas lo llaman el mismo ascensor, al mismo tiempo? ¿Cuál llamada
tiene la prioridad? Cómo manejar las preguntas de seguridad? La pérdida de electricidad? Error en la
operación? El mal uso?Después de resolver estas cuestiones básicas, un proceso difícil de diseñar una
electrónica adecuada utilizando un gran número de chips de propósito especial que viene a
continuación. Dependiendo de la complejidad del dispositivo, dicho proceso puede tardar semanas,
incluso meses. Entonces es el momento para hacer una placa de circuito impreso y montaje del
dispositivo. Un dispositivo de enorme! Se trata de otra obra de larga duración y tratar. Por último, cuando
el dispositivo está terminado y probado muchas veces, el momento crucial viene. El momento en el que
tomar una respiración profunda y cambiar la fuente de alimentación. La fiesta ha terminado en este punto,
los dispositivos electrónicos casi nunca empiezan a operar de inmediato. Prepárese para muchas noches
sin dormir, correcciones, mejoras ... y no te olvides, todavía estamos hablando sobre la ejecución de un
elevador normal.
Cuando el dispositivo funciona perfectamente y por último todo el mundo está satisfecho y le pagan por el
trabajo que han hecho, otras empresas de la construcción se interesen en su trabajo. Por supuesto, si
tienes suerte, otro día le traerá una oferta de bloqueo de un nuevo inversor. Un nuevo edificio tiene cuatro
pisos más. ¿Sabes lo que es todo esto? ¿Crees que puedes controlar el destino? Usted va a hacer un
dispositivo universal que puede ser utilizado en edificios de 4 a 40 historias, una obra maestra de la
electrónica? Incluso si te las arreglas para hacer esa joya de la electrónica, el inversor va a esperar frente
a su puerta pidiendo una cámara en el ascensor. O para escuchar música relajante en caso de avería del
ascensor. O para un ascensor de dos puertas. De todos modos, la ley de Murphy es inexorable y que no
van a ser capaces de hacer provecho de todo el esfuerzo que han hecho. Por desgracia, todo lo dicho
hasta ahora es cierto. Esto es lo que el manejo de la electrónica "realmente significa. No, no, espera,
vamos a corregir, así es como fue sino hasta los primeros microcontroladores fueron diseñados -
pequeños dispositivos, potente y barata. Desde el momento en su programación dejó de ser una ciencia,
todo ha ido en otra dirección ...
Electrónica capaces de controlar un pequeño submarino, una grúa o un ascensor ahora se construyen en
un solo chip.Microcontroladores ofrecen una amplia gama de aplicaciones, pero sólo unos pocos de ellos
se utilizan normalmente. Depende de usted decidir lo que quieres de el microcontrolador y volcar un
programa de acuerdo con las instrucciones apropiadas en ella. Antes de encender el aparato, su
funcionamiento debe ser probado por simulación. Si todo funciona bien, la construcción del
microcontrolador en el dispositivo. Si alguna vez tiene que cambiar, mejorar o actualizar el programa,
simplemente lo hacemos. ¿Hasta cuándo? Hasta que usted se sienta satisfecho. Eso es todo.
¿Sabía usted que todas las personas se pueden clasificar en uno de los 10 grupos-aquellos que están
familiarizados con el sistema numérico binario y los que no están familiarizados con ella. Tú no lo
entiendes? A continuación, siguen perteneciendo a este último grupo. Si desea cambiar su estado de leer
el siguiente texto que describe brevemente algunos de los conceptos básicos que se utilizan más en este
libro (sólo para estar seguros de que estamos en la misma página).
1.2 NÚMEROS, NÚMEROS, NÚMEROS ...
La matemática es una ciencia tan buena! Todo es tan lógico ... Todo el universo puede ser descrito con
diez dígitos solamente. Pero, ¿realmente tiene que ser así? ¿Necesitamos exactamente diez dígitos? Por
supuesto que no, es sólo una cuestión de hábito. Recuerda las lecciones de la escuela. Por ejemplo,
¿qué significa el número 764 media: cuatro unidades, seis decenas y cientos siete. Es tan simple como
eso! ¿Podría ser descrito de una manera más complicada? Por supuesto: 4 + 60 + 700. Aún más
complicado? En definitiva: 4 * 1 + 6 + 7 * 10 * 100. ¿Podría este número parezca más científica? La
respuesta es sí otra vez: 4 * 10 0 + 6 * 10 *
1 + 7 10
2. ¿Qué significa realmente? ¿Por qué utilizamos
exactamente estos números: 10 0,
10 1 y 10
2? ¿Por qué siempre tiene que ver el número 10?La respuesta
es porque se utiliza diez dígitos diferentes (0, 1, 2, ... 8, 9). En otras palabras, se utiliza el sistema de base
10 el número, es decir, numérico decimal.
Sistema numérico BINARIO
¿Qué pasaría si sólo dos dígitos, se utilizaron-0 y 1? O si no, no sabe cómo determinar si algo es de 3 o 5
veces mayor que otra cosa? O si se restringe cuando se comparan dos tamaños, es decir, si tan sólo
pudiéramos decir que algo existe (1) o no existe (0)? La respuesta es 'nada especial', se seguiría
utilizando los números de la misma manera como lo hacemos ahora, pero sería un poco diferente. Por
ejemplo: 11011010. ¿Cuántas páginas de un libro es el número 11011010 se incluyen? Con el fin de
enterarse de que, sólo tienes que seguir la misma lógica que en el ejemplo anterior, pero en orden
inverso. Como se puede ver aquí, todo está basado en sólo dos dígitos, 0 y 1, es decir, en el sistema
base-2 numérico (sistema numérico binario).
Es claramente el mismo número representado en dos sistemas numéricos diferentes. La única diferencia
entre estos dos formatos es el número de dígitos que los componen. Un dígito (2) se utiliza para escribir el
número 2 en sistema decimal, mientras que dos dígitos (1 y 0) se utilizan para su escritura en sistema
binario. Actualmente, ¿de acuerdo en que hay 10 grupos de personas? Bienvenido al mundo de la
aritmética binaria! ¿Tiene usted alguna idea de dónde se utiliza?
Excepto en condiciones de laboratorio estrictamente controladas, incluso los circuitos electrónicos más
complejos no puede determinar con precisión la diferencia entre dos tamaños (dos valores de tensión, por
ejemplo) si son demasiado pequeños (inferiores a varios voltios). La razón para ello radica en el ruido y
algo que se conoce como un "entorno de trabajo real" (los cambios impredecibles de la tensión de
alimentación, cambios de temperatura, la tolerancia a los valores de los componentes integrados,
etc.) Imagine una computadora que opera en los números decimales mediante la interpretación de la
siguiente manera: 0 = 0V, 1 = 5V, 2 = 10 V, 3 = 15V, 20V = 4 ... 9 = 45V.
¿Alguien dijo baterías?
Una solución mucho más simple es la lógica binaria en la que 0 indica que no hay tensión y 1 indica que
hay una tensión. Es más fácil escribir 0 o 1 en lugar de oraciones completas "no hay tensión" o "hay una
tensión ', respectivamente. Se trata de un cero lógico (0) y un uno lógico (1) que hace frente a la
electrónica perfectamente, y fácilmente lleva a cabo todas las operaciones matemáticas infinitamente
complejas. Obviamente, la electrónica estamos hablando de matemáticas aplicadas en la que todos los
números están representados por dos dígitos solamente y donde sólo es importante saber si hay una
tensión o no. Por supuesto, estamos hablando de la electrónica digital.
SISTEMA hexadecimales
En el comienzo del desarrollo de la computadora había muchos problemas cuando se trabaja con
números binarios. Por esta razón, un nuevo sistema numérico, el uso de 16 símbolos diferentes y se
estableció un llamado sistema numérico hexadecimal. Se compone de diez dígitos que se usan para (0, 1,
2, 3, ... 9) y seis letras del alfabeto A, B, C, D, E y F. Usted probablemente se preguntará cuál es el
propósito de este aparente extraña combinación? Basta con mirar lo bien que encaja la historia de los
números binarios y lo comprenderás.
El mayor número que puede ser representado por 4 dígitos binarios es el número 1111. Se corresponde
con el número 15 en un sistema decimal, mientras que se representa por la letra F en sistema
hexadecimal. Es el mayor número de 1 dígito en el sistema hexadecimal.¿Ves cómo con habilidad se
utiliza? El mayor número escrito con ocho dígitos binarios es al mismo tiempo el más grande 2-dígitos
hexadecimales. Recuerde que utilizan los ordenadores de 8 dígitos binarios. ¿Coincidencia?
Código BCD
Un código BCD es un código binario de los números decimales (sólo previa ponga B-C Oded
ecimal D). Se compone de números binarios cuatro dígitos que representan los diez primeros dígitos (0, 1,
2, 3 ... 8, 9). A pesar de que cuatro bits pueden dar 16 combinaciones posibles en total, el código BCD
hace ventaja de los primeros diez solamente.
NÚMERO DE CONVERSIÓN DEL SISTEMA
El sistema numérico binario es el más comúnmente usado, el sistema decimal es el más comprensible,
mientras que el sistema hexadecimal es en algún punto intermedio. Por lo tanto, es muy importante para
aprender a convertir los números de un sistema numérico a otro, es decir, cómo convertir una secuencia
de ceros y unos en los valores comprensibles.
Conversión binario número decimal
Mismos dígitos en un número binario tienen valores diferentes en función de su posición en ese
número. Cada posición puede contener 1 o 0 y su valor puede ser fácilmente determinado por el recuento
de su posición desde la derecha. Para realizar una conversión binario número decimal es necesario
multiplicar dígitos (0 o 1) con su valor de posición (2 0, 2
1, 2 2, 2
3 etc) y añadir todos los resultados. La
magia de la conversión binario decimal funciona ... Mira el siguiente ejemplo:
Para que los números decimales de 0 a 3 para ser representados, lo que necesita sólo dos dígitos
binarios. Para un mayor número, los dígitos binarios adicionales deben ser utilizados. Así, a fin de que los
números decimales de 0 a 7 para ser representados, tres dígitos binarios son necesarios, de los números
del 0 al 15, cuatro dígitos etc En pocas palabras, el mayor número binario que consta de n dígitos se
obtiene cuando la base 2 se provoca por ny el resultado respectivo se resta por 1. Por ejemplo, si n = 4:
Febrero 4 a
1 = 16 - 1 = 15
En consecuencia, 4 dígitos binarios le permiten representar números decimales de 0 a 15, lo que equivale
a 16 valores diferentes en total.
PARA LA CONVERSIÓN HEXADECIMAL número decimal
Para realizar una conversión hexadecimal a decimal, cada dígito hexadecimal debe ser multiplicado por
16 planteada por su valor de posición y después de eso, los resultados obtenidos deben ser
agregados. Por ejemplo:
Hexadecimal a número binario CONVERSIÓN
No es necesario realizar ningún cálculo para convertir números hexadecimales en binario. Los dígitos
hexadecimales son simplemente reemplazados por dígitos binarios correspondientes. Puesto que el valor
máximo de un dígito hexadecimal es equivalente a número decimal 15, es necesario el uso de cuatro
dígitos binarios para representar un dígito hexadecimal. Por ejemplo:
Un cuadro comparativo de la izquierda muestra los valores de los números 0-255 representados en tres
diferentes sistemas numéricos.Esta es probablemente la forma más fácil de entender la lógica común
aplicado a todos los sistemas numéricos.
Números que marcan
El sistema de numeración hexadecimal es, junto con los sistemas numéricos binario y decimal,
considerado el más importante para nosotros. Es fácil convertir cualquier número hexadecimal a
binario. También es fácil de recordar. Sin embargo, este tipo de conversiones pueden confundirnos. Por
ejemplo, ¿qué significa la frase "Es necesario contar hasta 110 productos en la línea de ensamblaje"
significa realmente? Dependiendo de si se trata de sistema binario, decimal o hexadecimal, el resultado
podría ser de 6, 110 o 272 productos, respectivamente. Para evitar estas situaciones y otras similares,
diferentes prefijos y sufijos se agregan directamente a los números. Los prefijos $ y números
hexadecimales 0x marca. Por ejemplo, 10AF número hexadecimal se ve, ya sea como $ 10AF o
0x10AF. Del mismo modo, los números binarios generalmente obtiene el prefijo%. Si un número no tiene
ni sufijo ni prefijo se considera decimal.Desafortunadamente, esta forma de números que marcan no está
estandarizado, sin embargo, depende de la aplicación específica.
BIT
En teoría, un bit es la unidad básica de información ... Vamos a olvidar esto por un momento y echar un
vistazo a lo que es en la práctica.La respuesta es: nada especial, un poco es sólo un dígito binario. Al
igual que en el sistema de numeración decimal, donde los mismos dígitos de un número no tiene el
mismo valor (por ejemplo, los dígitos en el número decimal 444), la 'importancia' de bits depende de su
posición en el número binario. A diferencia del sistema numérico decimal, dígitos binarios que no se les
conoce como las unidades, decenas, etc, pero el bit cero (poco más a la derecha), primer bit (segundo
desde la derecha), etc Dado que el sistema binario utiliza sólo dos dígitos diferentes (0 y 1) , el valor de
un bit puede ser 0 o 1.
No se confunda si te encuentras con un poco tener un valor de 4, 16 o 64. Esto significa que su valor se
representa en el sistema decimal. Simplemente estamos tan acostumbrados a la utilización de números
decimales que tales expresiones son muy comunes.Sería correcto decir por ejemplo, "el valor del bit sexto
de cualquier número binario es equivalente a 64 número decimal". Pero somos humanos y los hábitos
viejos son duros de matar ... Además, ¿cómo sonaría 'número uno-uno-cero-uno-cero ...'?
BYTE
Un byte se compone de ocho bits se agrupan. Si un bit es un dígito, entonces bytes representan
números. Todas las operaciones matemáticas se puede realizar sobre ellos, al igual que al común de
números decimales. Al igual que los dígitos de cualquier número, los dígitos de bytes no tiene el mismo
significado que sea. El mayor valor tiene el bit de la izquierda llamado el bit más significativo (MSB).El bit
de la derecha tiene el menor valor y por eso se llama el bit menos significativo (LSB). Desde ocho ceros y
unos de un byte puede ser combinado en 256 formas diferentes, el número más grande decimal que
puede ser representado por un byte es 255 (una combinación representa un cero).
Un mordisco se conoce como medio de un byte. En función de la media del registro que estamos
hablando (a la izquierda oa la derecha), hay "alto" y "bajo" mordiscos, respectivamente.
¿Te has preguntado lo que la electrónica dentro de circuitos integrados digitales, microcontroladores o
procesadores parece? ¿Qué circuitos de realizar complicadas operaciones matemáticas y la toma de
decisiones parece? ¿Sabe usted que sus esquemas aparentemente complicadas comprenden sólo unos
pocos componentes diferentes llamados circuitos lógicos o compuertas lógicas?
1.3 debe conocer los detalles
El funcionamiento de circuitos lógicos se basa en los principios establecidos por un matemático
británico George Boole en el medio del siglo 19, incluso antes de la primera bombilla fue
inventada. Originalmente, la idea principal era expresar las formas lógicas a través de funciones
algebraicas. Pronto había lugar a un producto real que, mucho después, evaluados en lo que hoy se
conoce como AND, OR y NOT circuitos lógicos. El principio de la operación se conoce como álgebra de
Boole.
CIRCUITOS DE LÓGICA
Algunas de las instrucciones del programa dan los mismos resultados que las puertas lógicas. El principio
de su funcionamiento se discutirá más adelante.
Y la puerta
La puerta lógica "Y" tiene dos o más entradas y una salida. Vamos a suponer que la puerta
utilizado en este ejemplo sólo tiene dos entradas. Un uno lógico (1) aparecerá en su salida
solamente si ambas entradas (A y B) son impulsados alto (1). Tabla de la derecha muestra la
dependencia mutua entre los insumos y de la puerta y de salida.
El principio de funcionamiento es el mismo, incluso cuando la puerta tiene más de dos
entradas: una lógica de un (1) aparecerá en su salida solamente cuando todas las entradas son
impulsados alto (1).Cualquier otra combinación de tensiones de entrada dará como resultado
un cero lógico (0) en su salida.Cuando se utiliza en el programa, la lógica y es realizado por
una instrucción de programa que se discutirán más adelante. Sólo recuerde que la lógica y en
el programa se refiere a los bits correspondientes de dos registros. O PUERTA
Del mismo modo, las puertas OR también tienen dos o más entradas y una salida. Si la puerta
tiene sólo dos entradas se aplica lo siguiente. Un uno lógico (1) aparecerá en la salida si
cualquiera de las entradas (A o B) es excitada alta (1). Si la puerta O tiene más de dos
entradas a continuación, se aplica lo siguiente. Un uno lógico (1) aparece en su salida si al
menos una entrada es excitada alta (1). Si todas las entradas están a cero lógico (0), la salida
será a cero lógico (0) también.
En el programa, el peración se realiza de la misma manera como la lógica y funcionamiento. NO PUERTA
La puerta lógica NO tiene sólo una entrada y salida de un solo. Se opera de una manera extremadamente
sencilla. Cuando un cero lógico (0) aparece en su entrada, un uno lógico (1) aparece en su salida y
viceversa. Esto significa que esta puerta invierte la señal y por lo tanto, se llama a menudo inversor.
El NO lógica de funcionamiento en el programa se lleva a cabo en un byte. El resultado es un byte con los
bits invertidos. Si los bits de bytes se consideran un número, el valor invertido es en realidad un
complemento de los mismos. El complemento de un número es un valor que añade a ese número lo hace
llegar al mayor número de 8 dígitos binarios. En otras palabras, la suma de un número de 8 dígitos y su
complemento es siempre 255.
EXCLUSIVA O PUERTA
La puerta OR EXCLUSIVA (XOR) es un poco complicado en comparación con otras
puertas. Es una especie de combinación de todos ellos. Un uno lógico (1) aparece en su salida
sólo cuando sus entradas tienen diferentes estados lógicos.
En el programa, la instrucción apropiada se utiliza comúnmente para comparar dos bytes. La
resta tiene el mismo propósito (si el resultado es 0, los bytes son iguales), pero la ventaja de la
operación lógica OR EXCLUSIVA es que nunca da resultados negativos.
REGISTRO
En resumen, un registro o una célula de memoria es un circuito electrónico que puede memorizar el
estado de un byte.
SFR REGISTROS
Además de los registros que no tienen ninguna función especial y predefinida, cada microcontrolador
también tiene un número de registros especiales de función (SFR) la función de los cuales está
predefinida por el fabricante. Sus bits están conectados (literalmente) a los circuitos integrados dentro del
microcontrolador tales como temporizadores, convertidores A / D, osciladores etc Esto significa que son
directamente al mando de la operación de estos circuitos, es decir, el microcontrolador. Imagínese ocho
interruptores que controlan el funcionamiento de un pequeño circuito dentro del microcontrolador -
Registros de funciones especiales hacer exactamente eso.
En otras palabras, el estado de los bits de registro se cambia desde dentro del programa,
registros ejecutar pequeños circuitos integrados dentro del microcontrolador, estos circuitos son
a través de pines del microcontrolador conectados a los periféricos que se utilizan para
... Bueno, le toca a usted decidir para qué.
ENTRADA / SALIDA DE PUERTOS
A fin de que el microcontrolador para ser útil, tiene que estar conectada a la electrónica, periféricos
adicionales, es decir. Cada microcontrolador tiene una o más registros conectado al microcontrolador
pines I / O. Estas conexiones hacen los puertos de E / S. ¿Por qué de entrada / salida? Debido a que
usted puede cambiar una función del pin como desee. Por ejemplo, supongamos que usted quiere que su
dispositivo para activar / desactivar tres LED de señal y al mismo tiempo controlar el estado lógico de
cinco sensores o pulsadores. Algunos de los puertos necesitan ser configurado para tener tres salidas
(conectado a LED) y cinco entradas (conectado a los sensores). Se puede hacer fácilmente desde el
software, lo que significa que una función pasador se puede cambiar durante la operación.
Una de las características importantes de los pines de entrada / salida (I / O) es una corriente máxima que
pueden manejar. Para la mayoría de los microcontroladores, la corriente suministrada desde un pasador
es suficiente para activar un LED o algún otro dispositivo de bajo consumo (10-20 mA).
Otra característica importante es un pasador de resistencia ascendente puede ser proporcionado. La
resistencia de actuación conecta el pin apropiado a la tensión de alimentación positiva. También se puede
utilizar cuando el pasador está configurado como una entrada conectada a un interruptor o un botón
pulsador. Las versiones posteriores de microcontroladores disponen de resistencias pull-up configurables
por software.
Cada puerto de E / S es generalmente bajo el control de un SFR, lo que significa que cada bit de registro
que determina el estado del pin microcontrolador correspondiente. Por ejemplo, escribiendo un uno lógico
(1) a algunos de los bits de registro, el pin del microcontrolador apropiado es automáticamente
configurado como una entrada. La tensión suministrada al pasador que es visible en su puerto como 0 o
1. De lo contrario, por escrito un cero lógico a la SFR, el pasador de puerto correspondiente está
configurado como una salida. Tensión proporcionada en tales una patilla de salida (0V o 5V) refleja el
estado del bit de registro apropiado (lógica 0 o 1, respectivamente).
Unidad de memoria
El módulo de memoria es una parte del microcontrolador utilizado para el almacenamiento de datos. La
forma más sencilla de explicarlo es mediante la comparación con un armario con muchos
cajones. Supongamos, los cajones están claramente marcados para permitir que sus contenidos pueden
ser fácilmente disponibles mediante la lectura de las etiquetas en la parte frontal de los cajones. De la
misma manera, cada dirección de memoria corresponde a una posición de memoria. El contenido de
cualquier lugar se puede acceder y leer por su dirección. Memoria puede ser escrito o leer.
Hay varios tipos de memoria dentro del microcontrolador: Memoria de sólo lectura (ROM)
Memoria de sólo lectura (ROM) se utiliza para guardar de forma permanente el programa a ejecutar por el
microcontrolador. El tamaño de un programa se escriba depende del tamaño de esta
memoria. Microcontroladores actuales utilizan comúnmente de 16 bits de direccionamiento, lo que
significa que son capaces de hacer frente a un máximo de 64 Kb de memoria, es decir, 65.535 lugares. Si
usted es un principiante, el programa apenas se superan los cientos de instrucciones. Existen varios tipos
de ROM.
Masked ROM (MROM)
Enmascarado ROM es un tipo especial de ROM cuyo contenido está determinado por el
fabricante. 'Enmascarado' El término proviene del proceso de fabricación, donde partes del chip están
enmascarados antes de que el proceso de fotolitografía. En caso de una producción a gran escala, el
precio es muy bajo. Olvídalo ...
Una hora ROM programable (OTP ROM)
Una ROM de tiempo programable le permite descargar un programa en él, pero, como su nombre lo
indica, por una sola vez. Si se detecta un error después de que el proceso de carga de un programa, lo
único que puedes hacer es cargar el programa en otro chip.
UV ROM programable y borrable (EPROM UV)
Tanto el proceso de fabricación y características de la radiación UV memoria EPROM son
totalmente idénticos a OTP ROM. Sin embargo, el paquete del microcontrolador con esta
memoria tiene una reconocible "ventana" en su lado superior. Se permite que los datos se
borrarán bajo luz ultravioleta fuerte. Después de unos minutos de tal 'tomar el sol' es posible
cargar un nuevo programa en él. La instalación de esta ventana es complicado, que
normalmente afecta el precio. En nuestra opinión, por desgracia, negativo ... Memoria Flash
La memoria flash, conocida como la sucesora de la EPROM UV, se hizo en los años 80 en los
laboratorios de Intel. Dado que la memoria se puede escribir como un número prácticamente ilimitado de
veces, los microcontroladores con memoria Flash ROM son ideales para el aprendizaje, la
experimentación y la producción en pequeña escala. Debido a su gran popularidad, la mayoría de los
microcontroladores se fabrican en la actualidad la tecnología flash. Por lo tanto, si usted va a comprar un
microcontrolador, el tipo que buscar es definitivamente Flash!
Memoria de acceso aleatorio (RAM)
Una vez que la fuente de alimentación está apagado el contenido de la RAM se borra. Por consiguiente,
se utiliza para almacenar datos temporales y resultados intermedios creados y utilizados durante el
funcionamiento del microcontrolador. Por ejemplo, si el programa realiza una adición, es necesario
disponer de un registro que representa lo que en la vida cotidiana se llama la "suma". Por esta razón, uno
de los registros de la RAM se llama la "suma" y se utiliza para almacenar los resultados de adición.
ROM programable y borrable eléctricamente (EEPROM)
El contenido de la EEPROM se puede cambiar durante la operación (similar a la RAM), pero sigue siendo
guardan de forma permanente, incluso después de la pérdida de potencia (similar a la ROM). En
consecuencia, la EEPROM se utiliza a menudo para almacenar valores, creados durante la operación,
que deben ser permanentemente guardados. Por ejemplo, si se quiere diseñar una cerradura electrónica
o una alarma, que sería genial para permitir al usuario crear e introducir la contraseña, pero es inútil si se
pierde cada vez que la fuente de alimentación se apaga. La solución ideal es un microcontrolador con un
EEPROM integrado.
INTERRUMPIR
La mayoría de los programas utilizan interrupciones en su ejecución normal. El propósito del
microcontrolador es principalmente para responder a los cambios en su entorno. En otras palabras,
cuando una acción se lleva a cabo, el microcontrolador hace algo ... Por ejemplo, cuando se presiona un
botón en un control remoto de televisión, el microcontrolador que registrarlo y responder al cambiar de un
canal, subir el volumen o hacia abajo, etc Por lo tanto, el microcontrolador se pasan la mayor parte de su
tiempo sin fin comprobar un par de botones durante horas o días, lo cual no es práctico en absoluto.
Por ello, el microcontrolador se ha aprendido un truco durante su evolución. En lugar de constante control
de cada pin o bit, los delegados de microcontroladores de la "cuestión de espera" a un "especialista" que
responda sólo cuando la atención pasa algo digno.
Una señal que informa a la unidad central de proceso sobre dicha acción se llama una interrupción.
BUS
Un bus se compone de 8, 16 o más cables. Hay dos tipos de autobuses: el bus de direcciones y el bus de
datos. El bus de dirección consiste en tantas líneas como sea necesario para el direccionamiento de
memoria. Se utiliza para tranfer una dirección desde la CPU a la memoria. El bus de datos es tan ancha
como datos, en este caso es de 8 bits o alambres de ancho. Se utiliza para conectar todos los circuitos
dentro del microcontrolador.
Unidad de procesamiento central (CPU)
Como su nombre indica, la CPU es una unidad que monitorea y controla todos los procesos dentro del
microcontrolador. Se compone de varias subunidades, de las cuales las más importantes son:
Instrucciones de instrucciones del programa Decoder decodifica y ejecuta otros circuitos sobre la base de que;
Unidad aritmético lógica (ALU) realiza todas las operaciones matemáticas y lógicas en los datos. El 'conjunto de instrucciones' que es diferente para cada familia microcontrolador muestra las capacidades de este circuito, y
Acumulador es una SFR estrechamente relacionado con la operación de la ALU. Es una especie de mesa de trabajo se utiliza para almacenar todos los datos en los que alguna operación se va a realizar (suma, cambio / movimiento, etc.) También almacena los resultados para ser utilizados en el procesamiento adicional. Uno de los SFR, llamado unregistro de estado (PSW), está estrechamente relacionada con el acumulador. Se muestra, en cualquier momento dado, el "estado" de un número almacenado en el acumulador (número es mayor o menor que cero, etc.) El acumulador es también llamado el registro de trabajo y que se conoce como registro W o por lo tanto sólo W.
COMUNICACIÓN DE SERIE
Una conexión en paralelo entre el microcontrolador y los periféricos establecida a través de puertos de
entrada / salida es una solución ideal cuando la distancia entre ellos es de varios metros. De lo contrario,
cuando es necesario para establecer la comunicación en distancias más largas la conexión en paralelo
está fuera de cuestión. Comunicación serial se utiliza en su lugar.
Hoy en día, la mayoría de los microcontroladores disponen de varios módulos diferentes para la
comunicación serie integrados en ellos como equipo estándar. ¿Cuál de estos módulos se utilizará
depende de muchos factores de los cuales los más importantes son:
¿Cuántos dispositivos el microcontrolador tiene que intercambiar datos con?
¿Con qué rapidez el intercambio de datos tienen que ser?
¿Cuál es la distancia entre los dispositivos?
¿Es necesario para enviar y recibir datos al mismo tiempo?
Una de las cosas más importantes sobre la comunicación de serie es el protocolo que debe ser
estrictamente observados. Se trata de un conjunto de reglas que permite a los dispositivos para
interpretar correctamente los datos que intercambian. Afortunadamente, el propio microcontrolador se
encarga de esto, de modo que el trabajo de los furúnculos programador / usuario hasta la escritura simple
(que se envíen datos) y la lectura (los datos recibidos).
TRANSFERENCIA DE DATOS
La velocidad de datos se utiliza el término para designar el número de bits transferidos por segundo
[bps]. Tenga en cuenta que se refiere a los bits, no bytes. De acuerdo con el protocolo, cada byte es
transferido, junto con varios bits de control. Esto significa que un byte en la corriente de datos en serie
puede constar de 11 bits. Por ejemplo, si la velocidad de datos es de 300 bps entonces máximo de bytes
37 y mínimo 27 puede ser transferida por segundo.
Los módulos más utilizados de comunicación en serie son los siguientes:
I 2 C (INTER circuito integrado)
Un circuito inter-integrado es un módulo para el intercambio de datos serie entre microcontroladores y
circuitos integrados especializados de una nueva generación. Se utiliza cuando la distancia entre estos
dispositivos es corto (receptor y el transmisor están generalmente en la misma placa impresa). La
conexión se establece a través de dos conductores. Uno se utiliza para transferencia de datos, mientras
que el otro se utiliza para la sincronización (señal de reloj). Como puede verse en la figura a continuación,
un dispositivo siempre es un dispositivo maestro. Realiza el direccionamiento de un dispositivo esclavo
antes de la comunicación se inicia y controla el proceso de transferencia de datos. De esta manera un
microcontrolador puede comunicarse con 112 dispositivos diferentes utilizando I2C. La velocidad de datos
suele ser de 100 Kb / s (modo estándar) o 10 Kb / s (modo de cámara lenta velocidad de datos). Los
dispositivos con una velocidad de 3,4 Mb / s han aparecido recientemente. La distancia entre los
dispositivos que se comunican a través de un bus I2C se limita a varios metros.
SPI (Serial Bus Peripheral Interface)
Una serie de interfaz periférica (SPI) es un módulo de bus de comunicación serial que utiliza tres o cuatro
conductores. Un conductor se utiliza para recibir datos, uno para enviar datos, uno para la sincronización
y una alternativa para la selección de un dispositivo para comunicarse. Es una conexión dúplex
completo, lo que significa que los datos pueden ser enviados y recibidos simultáneamente.
La máxima velocidad de datos es mayor que en el módulo de comunicación I2C.
UART (Receptor asíncrono universal / EMISOR)
Como su nombre indica, la comunicación USART es asincrónica, lo que significa que no hay ninguna
línea especial para la transferencia de la señal del reloj se usa. En algunas aplicaciones, como la
conexión de radio o el control de las ondas a distancia por infrarrojos, esta característica es
fundamental. Dado que sólo una línea de comunicación se utiliza, tanto el receptor y el transmisor
funcionan a la velocidad predefinida mismo con el fin de mantener la sincronización necesaria. Esta es
una forma muy simple de transferencia de datos a medida que básicamente se reduce a la conversión de
datos de 8-bits de paralelo a formato serie. La velocidad de datos no es muy alta, de hasta 1 Mbit / seg.
OSCILADOR
Incluso impulsos generados por el oscilador habilitar una operación armónica y sincrónica de
todos los circuitos dentro del microcontrolador. El oscilador está configurada para utilizar un
cristal de cuarzo o resonador cerámico para la estabilización de la frecuencia, sino que también
puede funcionar como un circuito independiente (como oscilador RC). Es importante decir que
las instrucciones no se ejecutan a la velocidad impuesta por el propio oscilador, pero más lenta
varias veces. Esto sucede porque cada instrucción se ejecuta en varios pasos. En algunos
microcontroladores, el mismo número de ciclos se requiere para ejecutar todas las
instrucciones, mientras que en otros, el número de ciclos es diferente para diferentes
instrucciones. Por consiguiente, si el microcontrolador utiliza cristal de cuarzo con una
frecuencia de 20 Mhz, el tiempo de ejecución de una instrucción no es 50ns, pero 200, 400 o
800 nS, dependiendo del tipo de microcontrolador.
Circuito de alimentación
Hay dos cosas que vale la pena la atención cuando se habla del circuito microcontrolador fuente de
alimentación:
Brown a cabo es una condición potencialmente peligrosa que se produce en el momento en el microcontrolador está apagado o cuando la tensión de alimentación se reduce a su valor mínimo debido al ruido. Como el microcontrolador se compone de varios circuitos con diferentes niveles de voltaje de funcionamiento, tal condición puede causar su fuera de control de rendimiento. Con el fin de evitar que, el microcontrolador tiene generalmente un circuito integrado en reinicio que causa la condición de reposición que se produzca tan pronto como el microcontrolador entra en un estado de emergencia a cabo marrón.
Pin de reset se refiere generalmente como MCLR (Master Reset En abierto). Se utiliza para causar una reposición externa del microcontrolador mediante la aplicación de un cero lógico (0) o un uno lógico (1) a la misma, la cual depende del tipo del microcontrolador. En caso de que el circuito fuera marrón no está integrado en el microcontrolador, un circuito simple externo para restablecer marrón puede ser conectado a la patilla MCLR.
TIEMPOS / contadores
El oscilador del microcontrolador utiliza cristal de cuarzo para su funcionamiento. Aunque no es la mejor
solución, todavía hay muchas razones para utilizarlo. La frecuencia del oscilador como se define con
precisión y muy estable, de modo que los impulsos que genera son siempre la misma anchura, lo que les
hace ideales para la medición del tiempo. Tales osciladores se utilizan también en los relojes de
cuarzo. Si es necesario medir el tiempo entre dos eventos, es suficiente para contar hasta impulsos
generados por este oscilador.Esto es exactamente lo que hace que el temporizador.
La mayoría de los programas usan estos en miniatura de los cronómetros electrónicos. Su corazón hace 8
- o 16 - bit, SFR los contenidos de los cuales se incrementa automáticamente por cada pulso que
viene. Una vez que un registro está totalmente cargado, una interrupción puede ser generada.
Si el temporizador utiliza un oscilador de cuarzo interno para su funcionamiento, entonces se puede
utilizar para medir el tiempo entre dos eventos (si el valor almacenado en el registro del temporizador T1
es en el momento de la medición se inicia, y T2 en el momento en que termina, entonces el tiempo
transcurrido es igual al resultado de la resta T2-T1). Si los pulsos registros de uso suministrado desde una
fuente externa a continuación, tal temporizador se convierte en un mostrador.
Esto es sólo una explicación sencilla del funcionamiento del temporizador / contador. Como usted ya
sabe, es más complicado en la práctica.
¿CÓMO FUNCIONA EL RELOJ?
Así es como el reloj funciona en la práctica: los impulsos generados por el oscilador de cuarzo son
directamente, oa través de un pre-escalador, trajo al circuito que se incrementa el número almacenado en
el temporizador de registro. Al incorporar un cristal de cuarzo con una frecuencia de 4 MHz se aplica lo
siguiente: si una instrucción (un ciclo de máquina) tiene una duración de cuatro períodos de oscilador de
cuarzo a continuación, mediante la incorporación de un cristal de cuarzo con una frecuencia de 4 MHz
este número se incrementa un millón de veces por segundo ( cada microsegundo).
Es fácil de medir los intervalos de tiempo cortos, de hasta 256 microsegundos, en la forma descrita
anteriormente, ya que es el número más grande que un registro puede almacenar. Esta restricción puede
ser fácilmente integrado por utilizar un oscilador más lento, se registra con más bits, prescaler o
interrupciones. Las dos primeras soluciones tienen algunos inconvenientes por lo que es más conveniente
utilizar prescalers o interrumpe.
EL USO DE UN Prescaler EN FUNCIONAMIENTO DEL TEMPORIZADOR
Un pre-escalador es un dispositivo electrónico que se usa para reducir la frecuencia por una tasa de
división predefinido. Con el fin de generar un impulso en su salida, es necesario llevar a pulsos 1, 2, 4 o
más en su entrada. La mayoría de los microcontroladores disponen de uno o más bulit-en prescalers y su
tasa de división se puede cambiar desde dentro del programa. La pre-escalador se utiliza cuando es
necesario medir períodos más largos de tiempo.
USO DE INTERRUPCIÓN EN FUNCIONAMIENTO DEL TEMPORIZADOR
Si el registro contador de tiempo se compone de 8 bits, el número más grande que puede almacenar es
255. Para registros de 16 bits es el número 65.535. Si ese número se supera, el temporizador se reinicia
automáticamente y el conteo empezará desde cero otra vez. Esta condición se denomina
un desbordamiento. Si se activa desde el programa, el desbordamiento puede causar una interrupción, lo
que da unas posibilidades completamente nuevas. Por ejemplo, el estado de los registros utilizados para
segundo escrutinio, minutos o días se puede cambiar en una rutina de interrupción. Todo el proceso (a
excepción de la rutina de interrupción) se realiza automáticamente detrás de las escenas, lo que permite
que los circuitos principales del microcontrolador para funcionar normalmente.
La figura anterior ilustra el uso de una interrupción en el funcionamiento del temporizador. Los retrasos de
duración arbitraria, que tiene casi ninguna influencia en la ejecución del programa principal, se puede
obtener fácilmente mediante la asignación de un pre-escalador al temporizador.
CONTADORES
Si el temporizador se suministra con los pulsos de la patilla de entrada del microcontrolador, entonces se
convierte en un mostrador. Es evidente que el circuito electrónico mismo es capaz de funcionar en dos
modos diferentes. La única diferencia es que en este caso pulsos a ser contados llegan a través de la
patilla de entrada del microcontrolador y su duración (anchura) es generalmente indefinido.Esta es la
razón por que no se puede utilizar para medir el tiempo, pero puede ser utilizado para otros fines tales
como contar los productos en una línea de montaje, el número de eje de rotación, etc pasajeros
(dependiendo del sensor en uso).
Watchdog Timer
Un temporizador de vigilancia es un temporizador conectado a un oscilador RC independiente dentro del
microcontrolador.
Si el temporizador de vigilancia está habilitado, cada vez que se cuenta hasta el valor máximo, el
restablecimiento microcontrolador se produce y la ejecución del programa se inicia desde la primera
instrucción. El objetivo es evitar que esto ocurra mediante el uso de un comando específico.
De todos modos, la idea se basa en el hecho de que cada programa se ejecuta en varios bucles más
largos o más cortos. Si las instrucciones para el restablecimiento del temporizador de vigilancia se
establecen en los lugares apropiados del programa, además de comandos que se ejecutan con
regularidad, entonces el funcionamiento del temporizador de vigilancia no afectará a la ejecución del
programa. Si por cualquier razón, por lo general debido al ruido de fabricación, el contador de programa
"se atasca" en algún lugar de memoria de la que no hay vuelta atrás, el temporizador de vigilancia no se
borrará, por lo que el valor del registro de estar constantemente incrementa alcanzará el máximo et voila
! El relé se desexcita y el programa se ejecutará desde el principio.
.
Convertidor A / D
Las señales externas suelen ser fundamentalmente diferentes de los del microcontrolador
reconoce (0V y 5V solamente) y por lo tanto tienen que ser convertidos en valores
reconocibles. Un convertidor analógico a digital es un circuito electrónico que convierte las
señales continuas a discretas números digitales. En otras palabras, este circuito convierte un
valor analógico en un número binario y la envía a la CPU para su procesamiento posterior. Este
módulo se utiliza así para la tensión de entrada de PIN (valor analógico) de medición.
El resultado de la medición es un número (valor digital) utilizados y transformados luego en el programa.
Arquitectura interna
Todos los microcontroladores actualizados implementar uno de los dos modelos básicos de diseño y
arquitectura de la Universidad de Harvard llamado Von-Neumann.
Ellos representan dos formas diferentes de intercambio de datos entre la CPU y la memoria.
Von-Neumann ARQUITECTURA
Microcontroladores utilizando la arquitectura de von Neumann-sólo tiene un bloque de memoria
y un bus de 8 bits de datos. Como todos los datos se intercambian a través de estas 8 líneas,
el autobús se sobrecarga y la comunicación es lenta e ineficiente. La CPU puede leer una
instrucción o leer / escribir datos desde / hacia la memoria. Ambos procesos no puede
realizarse al mismo tiempo desde las instrucciones y datos utilizan el mismo bus. Por ejemplo,
si una línea de programa que lee una memoria RAM registro llamado "suma" debe ser
incrementado en uno (instrucción: incf SUM ), el microcontrolador hará lo siguiente:
1. Lea la parte de la instrucción de programa que especifique ¿Qué debe hacerse (en este
caso el ' incf"instrucción para el incremento se va a realizar).
2. Lea la otra parte de la misma instrucción que especifica en qué datos se deben realizar (en este caso es la "suma" de registro).
3. Después de haber sido incrementado, el contenido de este registro debe ser escrito en el registro de la que se leyó (la dirección de la "suma" de registro).
El bus de datos se utiliza el mismo para todas estas operaciones intermedias cuando se intercambian
datos entre la CPU y la memoria.
La arquitectura de Harvard
Microcontroladores que implementan la arquitectura Harvard dispone de dos buses de datos
diferentes. Uno es de 8 bits de ancho y se conecta a la CPU a la RAM. El otro consiste en 12,
14 o 16 líneas y se conecta a la CPU a ROM. En consecuencia, la CPU puede leer una
instrucción y memoria de acceso de datos al mismo tiempo. Puesto que todos los registros de
memoria RAM son 8 bits de ancho, todos los datos se intercambian es de la misma
anchura. Durante el proceso de escritura, sólo de 8 bits de datos se incluye. En otras palabras,
todo lo que puede cambiar desde el programa y todo lo que puede hacer frente es de 8 bits de
ancho. Todos los programas escritos para estos microcontroladores se almacena en la ROM
interna microcontrolador después de ser compilado en código máquina.Sin embargo, las
ubicaciones de memoria ROM no son 8, pero 12 de ancho, 14 o 16 bits. El resto de los bits 4, 6
u 8, respectivamente, representa la instrucción solo se especifique para la CPU qué hacer con
los datos de 8-bits.
Las ventajas de esta arquitectura son los siguientes:
Todos los datos en el programa es de un byte (8 bits) de ancho. A medida que el bus de datos utilizado para la lectura programa tiene 12, 14 o 16 líneas, tanto la instrucción y los datos se pueden leer simultáneamente el uso de estos bits de reserva. Por esta razón, todas las instrucciones son de un solo ciclo de instrucciones, excepto en la instrucción de salto que es de dos tiempos.
Debido al hecho de que el programa (ROM) y los datos temporales (RAM) utilizar buses separados, la CPU puede ejecutar dos instrucciones al mismo tiempo. En otras palabras, mientras que la RAM de lectura o escritura está en curso (el extremo de una instrucción), la instrucción siguiente programa es leído a través del bus otra.
Con microcontroladores con la arquitectura de von Neumann, uno nunca sabe la cantidad de memoria para ser ocupado por el programa. Básicamente, la mayoría de las instrucciones del programa ocupan dos posiciones de memoria (uno contiene información sobre lo que debe hacer, mientras que la otra contiene información sobre la cual los datos se debe hacer). Sin embargo, no es una regla dura y rápida, pero el caso más común. En la arquitectura de Harvard el bus programa es más ancho que un byte, que permite a cada palabra programa que consiste de instrucción y de datos, es decir, una posición de memoria - una instrucción de programa.
INSTRUCCIONES DE JUEGO
Todas las instrucciones reconocibles por el microcontrolador se colectivelly llamado el conjunto
de instrucciones. Cuando se escribe un programa en lenguaje ensamblador, en realidad se
especifican las instrucciones en el orden que deben ser ejecutados. La restricción principal es
el número de instrucciones disponibles. Los fabricantes suelen emplear una de las dos
soluciones opuestas y microcontroladores de diseño que implementan el número más pequeño
o más grande posible de instrucciones. En otras palabras - que escoger entre RISC y CISC
conjuntos de instrucciones, respectivamente. RISC (ORDENADOR conjunto reducido de instrucciones)
En este caso, el microcontrolador reconoce y ejecuta las operaciones básicas solamente (suma, resta,
copiado, etc.) Otras operaciones, más complicadas se realizan mediante la combinación de ellos. Por
ejemplo, la multiplicación en el programa debe ser realizado como una adición sucesiva. Es lo mismo que
si usted trata de explicar a alguien, utilizando sólo unas pocas palabras diferentes, la forma de llegar al
aeropuerto en una gran ciudad. Sin embargo, no es tan negro como lo ha pintado. Como cuestión de
hecho, no es tan difícil de explicar donde está el aeropuerto si usted usa las palabras correctas, como
izquierda, derecha, kilómetros, etc
CISC (informático complejo conjunto de instrucciones)
CISC es lo opuesto a RISC. Microcontroladores diseñados para reconocer a más de 200 instrucciones
diferentes pueden hacer un montón de cosas a gran velocidad. Sin embargo, es necesario comprender
cómo tomar todas las que tal oferta ricos conjunto de instrucciones, que no es nada fácil ...
CÓMO HACER LA ELECCIÓN CORRECTA?
Bueno, usted es un principiante y que ha tomado la decisión de ir a la aventura de trabajar con los
microcontroladores. Felicidades por su elección. Pero, no es tan fácil elegir el microcontrolador derecho
que pueda parecer. El problema no es una gama limitada de los dispositivos, sino todo lo contrario.
Antes de comenzar a diseñar un dispositivo basado en microcontrolador, piense en lo siguiente: el
número de entradas y salidas se requiere su proyecto? En caso de que realizar algunas operaciones que
no sean a su vez sólo relés de encendido / apagado? ¿Necesita algunos módulos especializados, tales
como la comunicación serie, A / D, etc convertidor? Cuando se crea una imagen clara de lo que usted
necesita, el rango de selección se reduce considerablemente y es tiempo de pensar en el precio. ¿Vas a
hacer que varios de estos dispositivos? Varios cientos de? ¿Un millón? De todos modos, usted consigue
el punto.
Si usted piensa en todas estas cosas por primera vez, entonces todo parece un poco complicado. Que
sea simple e ir paso a paso. En primer lugar, seleccione el fabricante, es decir, la familia de
microcontroladores usted puede conseguir fácilmente. Estudio de un modelo en particular. Aprenda todo
lo que necesita, no entrar en detalles. Resolver un problema específico y algo increíble va a suceder,
usted será capaz de manejar cualquier modelo perteneciente a la familia de microcontroladores.
Recuerde que aprender a andar en bicicleta. Después de varias contusiones que recibió cuando empezó,
que fueron capaces de mantener el equilibrio y entonces fácilmente montar cualquier otra bicicleta. Y, por
supuesto, que nunca olvidará la programación de la misma manera que nunca se olvidará en bicicleta!
1.4 Microcontroladores PIC
El nombre original de la PIC es un microcontrolador PIC (Controlador de Interfaz Periférico), pero es mejor
conocido como un PIC. Su antepasado, llamado el PIC1650, fue diseñado en 1975 por General
Instruments. Fue pensado para fines totalmente diferentes. Unos diez años más tarde, este circuito se
convirtió en un microcontrolador PIC real, mediante la adición de la memoria EEPROM.
Si desea obtener más información al respecto, sólo sigue leyendo.
El propósito principal de este libro es proporcionar al usuario información necesaria él / ella necesita saber
con el fin de ser capaz de utilizar los microcontroladores en la práctica. A fin de evitar largas explicaciones
e historias interminables sobre las características útiles de diferentes microcontroladores, este libro trata
del funcionamiento de un modelo particular que pertenece a la "clase media alta". Es el microcontrolador
PIC16F887 - lo suficientemente potente como para ser digno de atención y lo suficientemente simple para
ser aprendida fácilmente por todo el mundo. Por lo tanto, a pesar de que los capítulos siguientes se
describen con detalle este microcontrolador, que en realidad se refieren a la familia PIC conjunto.
Todos los microcontroladores PIC implementar la arquitectura de Harvard, lo que significa que su
memoria de programa se conecta a la CPU a través de más de 8 líneas. Dependiendo del ancho de bus,
hay 12 -, 14 - y los microcontroladores de 16 bits. Siguiente tabla muestra las principales características
de estas tres categorías de los microcontroladores PIC
Familia
ROM
[Kbytes
]
RAM
[bytes
]
Pines
Reloj Frecuencia.[MH
z]
Entradas A / D
Resolución del
convertid
or A / D
Compar-dor
es
08.16 -
Los temporizadore
s de bits
Co
mm de serie.
Salidas
PW
M
Otros
Base-Línea 8 - bits, 12 bits de longitud de palabra de instrucciones
PIC10FXXX
0,375 a 0,75
16 a 24
6 a 8
4 a 8 0 a 2
8 0 a 1
1 x 8 - - -
PIC12FXXX
0,75 a
1,5
25 a 38
8 4 a 8 0 a 3
8 0 a 1
1 x 8 - - EEPROM
PIC16FXXX
0,75 a 3
25 a
134
14 a 44
20 0 a 3
8 0 a 2
1 x 8 - - EEPROM
PIC16HVXX
X 1.5 25
18 a 20
20 - - - 1 x 8 - - Vdd =
15V
Mid-Range 8 - arquitectura de bits, 14 bits de instrucciones Largo del Mundo
PIC12FXXX
1,75
a 3,5
64
a 128
8 20 0 a 4
10 1 1 a 2 x 8 1 x 16
- 0 a 1
EEP
ROM
PIC12
HVXXX
1,75 64 8 20 0 a 4
10 1 1 a 2 x 8 1 x 16
- 0 a 1
-
PIC16FXXX
1,75 a 14
64 a
368
14 a 64
20 0 a 13
8 o 10
0 a 2
1 a 2 x 8 1 x 16
USART I2C SPI
0 a 3
-
PIC16HVXX
X
1,75 a
3,5
64 a
128
14 a
20
20 0 a 12
10 2 2 x 8 1 x 16
USART I2C SPI
- -
High-End 8 - la arquitectura bits, 16 bits de longitud de palabra de instrucciones
PIC18FXXX
4 a 128
256 -
3936
18
a 80
32 a 48 4 a 16
10 o 12
0 a 3
0 a 2 x agosto 2 a 3 x
16
2.0 CAN2.0
USART
I2C SPI
0 a 5
-
PIC18
FXXJX
X
8 a
128
1024 -
3936
28 a
100
40 a 48 10 a
16 10 2
0 a 2 x agosto
2 a 3 x 16
US
B 2.0 Ethern
et USART
I2C SPI
2 a
5 -
PIC18FXXKX
X
8 a 64
768
- 3936
28 a 44
64 10 a 13
10 2 1 x 8 3 x 16
US
ART I2C SPI
2 -
Todos los microcontroladores PIC uso arquitectura Harvard, lo que significa que su memoria de programa
se conecta a la CPU durante más de 8 líneas. Dependiendo del ancho de bus, hay 12 -, 14 - y los
microcontroladores de 16 bits. Tabla de arriba muestra las principales características de estas tres
categorías.
Como se puede observar en la tabla de la página anterior, si hacemos caso omiso de '16-bit monsters'-
PIC 24FXXX y 24HXXX PIC por un momento, todos los microcontroladores PIC de 8 bits arquitectura de
la Universidad de Harvard y pertenecen a una de cada tres grandes grupos. En consecuencia,
dependiendo del tamaño de la palabra programa hay la categoría microcontrolador primera, segunda y
tercera, es decir, 12 -, 14 - o microcontroladores de 16-bit. Tener similares de 8-bit del núcleo, todos ellos
utilizan el mismo conjunto de instrucciones y el «esqueleto» del hardware básico conectado a unidades
más o menos periférica.
Microcontroladores PIC con las palabras del programa de 14 bits son los más probable es que la mejor
opción para los principiantes. He aquí por qué ...
INSTRUCCIONES DE JUEGO
El conjunto de instrucciones para la 16F8XX incluye 35 instrucciones en total. La razón de un número tan
pequeño de instrucciones reside en la arquitectura RISC. Las instrucciones están bien optimizados desde
el punto de velocidad de funcionamiento, la sencillez en la arquitectura y la compacidad del código. El
inconveniente de la arquitectura RISC es que el usuario se espera para hacer frente a estas
instrucciones. Por supuesto, esto sólo es relevante si se utiliza el lenguaje ensamblador para la
programación. Este libro trata de la programación en un lenguaje de programación de alto nivel
denominado básico, lo que significa que la mayoría del trabajo ha sido ya realizada por otra persona. Sólo
tienes que usar las instrucciones relativamente simples.
Tiempo de ejecución de
Todas las instrucciones de los microcontroladores PIC son de un solo ciclo de instrucciones. La única
excepción son las instrucciones condicionales rama (si se cumple este requisito) y las instrucciones
llevados a cabo en el contador de programa. En ambos casos, dos ciclos son necesarios para la
ejecución de la instrucción, mientras que el segundo ciclo se ejecuta como un NOP (no operación). De
ciclo simple las instrucciones consisten en cuatro ciclos de reloj. Esto significa que si un oscilador 4MHz
se utiliza, se tardará 1μS para una instrucción a ejecutar. El tiempo de ejecución de la instrucción de
instrucciones de salto es 2μS.
Instrucción del programa conjunto de palabras de 14 bits microcontroladores PIC:
I N S T R U C C I Ó N D E S C R I P C I Ó N O P E R A C I Ó N B A N D E R A C L K *
Instrucciones de transferencia de datos
MOVLW k Mueva constante a W k -> w
1
MOVWF f Mover W a f W -> f
1
MOVF f, d Mover f para d f -> d Z 1 1, 2
CLRW Clear W 0 -> W Z 1
CLRF f F Clear 0 -> f Z 1 2
SWAPF f, d Intercambia nibbles de
f f (7:4), (3:0) -> f (3:0), (7:4)
1 1, 2
Lógica y aritmética-Instrucciones
ADDLW k Añadir W y constante W + K -> W C, DC, Z 1
ADDWF f, d Añadir W y F W + f -> d C, DC, Z 1 1, 2
SUBLW k Resta W de la
constante kW -> W C, DC, Z 1
SUBWF f, d Restar W de f FW -> d C, DC, Z 1 1, 2
Andlw k Y lógico con W con una
constante W y K -> W Z 1
ANDWF f, d Y lógico con W con f W y F -> d Z 1 1,
2
IORLW k OR lógico con W con
una constante W o K -> W Z 1
IORWF f, d OR lógico con W con f W o f -> d Z 1 1, 2
XORWF f, d Lógico OR exclusivo con W con constante
W XOR k -> W Z 1 1, 2
XORLW k Lógico OR exclusivo
con W con f W XOR f -> d Z 1
INCF f, d Incrementa f en 1 f 1 -> f Z 1 1, 2
DECF f, d Disminuir f por una F-1 -> f Z 1 1, 2
RLF f, d Gire f izquierdo a
través de bit de acarreo C 1
1, 2
RRF f, d Gire f derecha a través
de bit de acarreo C 1
1, 2
COMF f, d Complementar f f -> d Z 1 1,
2
Orientados a bits Instrucciones
BCF f, b B poco clara en la f 0 -> f (b)
1 1, 2
BSF f, b B poco clara en la f 1 -> f (b)
1 1, 2
Instrucciones de control del programa
BTFSC f, b Prueba bit b de f. Salta la siguiente instrucción,
si claro.
Salta si f (b) = 0
1 (2) 3
BTFSS F, B Prueba bit b de f. Salta la siguiente instrucción
Salta si f (b) = 1
1 (2) 3
si se establece.
DECFSZ f, d Disminuir f. Salta la
siguiente instrucción, si claro.
F-1 -> d salto si Z = 1
1 (2) 1, 2, 3
INCFSZ f, d Incrementar f. Salta la siguiente instrucción si
se establece.
f 1 -> d salto si Z = 0
1 (2) 1, 2, 3
GOTO k Ir a dirección k -> PC
2
CONVOCATORIA k Llame a subrutina PC -> TOS, k -
> PC 2
REGRESAR Retorno de la subrutina Archivo -> PC
2
RETLW k Volver con la constante
en la W k -> W, Archivo
-> PC 2
Retfie Retorno de interrupción Archivo -> PC,
1 -> GIE 2
Otras instrucciones
NOP No hay operación Archivo -> PC,
1 -> GIE 1
CLRWDT Borrar temporizador de
vigilancia
0 -> WDT, 1 ->
A, 1 -> EP A, PD 1
DORMIR Entra en el modo de
suspensión 0 -> WDT, 1 ->
A, 0 -> EP A, PD 1
* 1 Cuando un registro de E / S se modifica, el valor utilizado será el valor actual de los mismos pines.
* 2 Si se ejecuta la instrucción en el registro TMR y si d = 1, el pre-escalador se borrará.
* 3 Si el PC se modifica o resultado de la prueba es un uno lógico (1), la instrucción requiere dos ciclos. El
segundo ciclo se ejecuta como un NOP.
La arquitectura de los microcontroladores PIC de 8 bits. Which of these modules are to be built into the
microcontroller depends on the type thereof.
Capítulo 2: Programación de Microcontroladores
Usted sabe sin duda que no es suficiente para conectar simplemente el microcontrolador a otros
componentes y gire la fuente de alimentación para hacerlo funcionar, ¿no? Hay más por
hacer. Microcontroladores necesita ser programado para ser capaz de realizar algo útil. Este capítulo trata
de la programación en Basic y que vamos a describir sólo las cosas esenciales que hay que saber para
escribir un programa. Puede parecer complicado, especialmente si usted no tiene experiencia en este
campo. No te rindas, tomar una respiración profunda y comenzar a ...
2.1 LENGUAJES DE PROGRAMACIÓN
2.2 LAS BASES DEL lenguaje de programación BASIC
2.3 COMPILADOR mikroBasic PRO PARA PIC
2.1 LENGUAJES DE PROGRAMACIÓN
El microcontrolador ejecuta el programa cargado en la memoria Flash.Es un código ejecutable
llamado que consta de una secuencia aparentemente extraña de ceros y unos. Dependiendo
de la arquitectura del microcontrolador, este código binario está organizado en 12 -, 14 - o 16-
bit de las palabras de ancho. Cada palabra es considerada por la CPU como una instrucción a
ejecutar durante el funcionamiento del microcontrolador. Como es mucho más fácil para
nosotros tratar con el sistema numérico hexadecimal, el código ejecutable suele ser
representado como una secuencia de números hexadecimales denominada código
hexadecimal que, hace mucho tiempo, solía ser escrito por el programador. Todas las
instrucciones que el microcontrolador puede reconocer y ejecutar se conocen colectivamente
como el conjunto de instrucciones. Para los microcontroladores PIC de 14 bits con palabras de
programa de ancho, el conjunto de instrucciones incluye 35 instrucciones diferentes.
Como la escritura de código ejecutable fue infinitamente cansado, el primer lenguaje de alto
nivel de programación llamado lenguaje ensamblador fue creado. Esto hizo que el proceso de
programación de un poco más complicado, pero por otro lado el proceso de escribir el
programa dejó de ser una pesadilla. Instrucciones de montaje consisten en abreviaturas
significativas que se compilan en el código ejecutable por medio de un programa especial
instalado en un PC llamado ensamblador. Se compila la instrucción por instrucción sin
optimización. Las principales ventajas del lenguaje ensamblador son su simplicidad y el hecho
de que cada instrucción del programa coincide con una sola posición de memoria. En otras
palabras, el lenguaje ensamblador permite un control completo de todos los procesos que son
en curso dentro del microcontrolador, que todavía hace que sea popular hoy en día.
Por otro lado, los programas se ejecutan siempre a altas velocidades y en la mayoría de los casos no es
necesario conocer en detalle lo que está pasando dentro del microcontrolador. A pesar de todos los
buenos atributos del lenguaje ensamblador, los programadores siempre han necesitado un lenguaje de
programación similar al lenguaje que utilizan en el habla cotidiana. Por último, de alto nivel, incluyendo
lenguajes de programación Basic, se han creado. La principal ventaja de estos idiomas es una simplicidad
de la escritura del programa. Varias instrucciones de montaje se sustituyen ahora por una declaración en
la base. El programador no tiene que estar familiarizado con el conjunto de instrucciones del
microcontrolador en desuso. Ya no es posible saber cómo cada instrucción se ejecuta, pero no importa de
todos modos. En caso afirmativo, el problema se resuelve mediante la adición de una secuencia escrito
en lenguaje ensamblador para el programa.
Al igual que en lenguaje ensamblador, un programa especializado instalado en el PC es el encargado de
compilar el programa en código máquina. A diferencia de ensamblador, compiladores para lenguajes de
programación de alto nivel crear un código ejecutable que no siempre es el más corto posible.
La figura anterior muestra un ejemplo aproximado de lo que está sucediendo durante el proceso de
compilar un programa escrito en Basic en un código hexadecimal.
Aquí es un ejemplo de un sencillo programa escrito en Basic:
VENTAJAS DE LOS LENGUAJES DE PROGRAMACIÓN DE ALTO NIVEL
Si usted tiene alguna experiencia en la escritura de programas para microcontroladores PIC en lenguaje
ensamblador, entonces usted es probablemente familiar con el otro lado de la medalla de la arquitectura
RISC - la falta de instrucciones. Por ejemplo, no hay ninguna instrucción apropiada para la multiplicación
de dos números. Por supuesto, hay una manera de resolver este tema, debido a las matemáticas, que le
permite realizar operaciones complejas se hacía dividido en una serie de ideas simples. En consecuencia,
la multiplicación puede ser fácilmente sustituido por adición sucesiva (axb = a + a + un + ... + a). Y aquí
estamos, justo en el comienzo de una historia muy larga ... Todavía no hay ninguna razón para
preocuparse por lo que usted utilice uno de los lenguajes de programación de alto nivel, como Basic,
como el compilador de forma automática encontrar una solución a estas cuestiones y otras similares. Sólo
tienes que escribir a * b.
2.2 LAS BASES DEL lenguaje de programación BASIC
Similar a la utilización de cualquier lenguaje que no se limita a los libros y revistas solamente, el lenguaje
de programación Basic no está estrechamente relacionado con ningún tipo especial de sistema
informático, el procesador o de funcionamiento. Es un lenguaje de propósito general. Este hecho puede
hacer que algunos problemas como la lengua básica varía ligeramente dependiendo de su aplicación (por
ejemplo, diferentes dialectos de una lengua). Por lo tanto, no vamos a hacerle una descripción detallada
de todos los atributos de la base de este libro. En su lugar, vamos a describir una aplicación concreta del
lenguaje de programación Basic, es decir, básico utilizado por el PRO mikroBasic para PIC compilador.
El lenguaje de programación Basic es un lenguaje de programación sencillo y fácil de entender. Para
usarlo correctamente, es suficiente para conocer algunos de los elementos básicos que cada programa se
compone de. Estos son:
Identificadores
Comentarios
Operadores
Expresiones
Instrucciones
Constantes
Variables
Símbolos
Directivas
Etiquetas
Los procedimientos y funciones
Módulos
Aquí está un ejemplo de cómo no se debe escribir un programa.No hay comentarios están
incluidos, los nombres de las etiquetas de los no tienen sentido, las secciones de código no se
agrupan ... Este programa va a funcionar correctamente, pero su propósito y la forma de
ejecución será sólo conocido por el programador que lo ha escrito (al menos por un día o dos).
La siguiente figura ilustra la estructura de un programa simple escrito en Basic, señalando las partes que
la componen. Este es un ejemplo de cómo se debe escribir un programa. Las diferencias son más que
obvias ...
Estructura del Programa
Al igual que otros lenguajes de programación, Basic proporciona un conjunto de reglas estrictamente
definidas que deben observarse en la escritura de programas. Para que un programa se escribe en Basic,
es necesario instalar un software que proporciona el entorno de trabajo adecuado y comprenda estas
reglas en su PC ... Cuando usted escribe una carta, se necesita un programa de procesamiento de textos,
¿no? En este caso, usted necesita el PRO mikroBasic para PIC compilador.
A diferencia de la mayoría de los programas que ya se han acostumbrado a tratar con el proceso de la
escritura de programas en el compilador no se inicia seleccionando la opción Archivo> Nuevo, pero nuevo
proyecto>. ¿Por qué es eso? Bueno, usted escribe un programa en un documento con la extensión. Mbas
(mikroBasic). Usted diligencia escribir, escribir, escribir ... Cuando se compila en un código hexadecimal,
un nuevo documento con la extensión. Hex se creará. Al mismo tiempo, el compilador creará
automáticamente varios documentos en adición a la misma. El propósito de estos documentos no es
importante en este punto. Por supuesto, debe haber algo que conecte a todos. ¿Te das cuenta - estamos
hablando de un proyecto. El programa se escribe es sólo una parte de ella.
Sólo para estar seguros de que estamos en la misma página ... A partir de ahora el módulo de la palabra
refiere a un documento con la extensión. MBA. El texto que contiene se refiere como un programa. Cada
proyecto escrito en el PRO mikroBasic para PIC compilador tiene la extensión.
Mbppi (m ICRO B ASIC P royecto para PI C) y se compone de al menos un módulo (módulo principal).
Cada proyecto en mikroBasic PRO para PIC requiere un módulo principal único. Se identifica por
el programa y la palabra clave indica al compilador desde donde iniciar el proceso de compilación. Al
crear con éxito un proyecto vacío en el asistente de proyectos, el módulo principal se mostrarán
automáticamente en la ventana Editor de código:
MyProject ' The main module is called MyProject here
main: ' Main procedure
... '*
... '* Write program code here
... '*
end.
Nada puede preceder a la palabra clave del programa, a excepción de los comentarios. Como se
mencionó anteriormente, el proyecto también puede incluir otros módulos que, a diferencia de la principal,
comienzan con la palabra clave módulo.
module MyModule ' Auxiliary module is called MyModule ... '* ... '* Implements ... '* end.
Para hacer que el compilador de familiarizarse con todos los módulos que forman parte de un proyecto,
es necesario especificar en el módulo principal utilizando la palabra clave incluyen seguido de un nombre
de módulo citado. La extensión de estos archivos no deben ser incluidos. Sólo un módulo por la
cláusula de inclusión está permitida. El número de incluir cláusulas no es limitado, pero todos ellos deben
ser especificados inmediatamente después del nombre del programa (módulo principal). He aquí un
ejemplo:
principal program MyProgram ' Start of program (main module
named ‘MyProgram’)
' Other modules included are:
include "utils" ' Module "utils"
include "strings" ' Module "strings"
include "MyUnit" ' Module "MyUnit"
...
ORGANIZACIÓN DEL MÓDULO PRINCIPAL
Básicamente, el módulo principal se puede dividir en dos secciones: declaraciones y el cuerpo del
programa. ¿Qué es una declaración en la programación? Una declaración es un proceso de definición de
las propiedades de los identificadores para ser utilizados en el programa. Como la mayoría de otros
lenguajes de programación, básico también requiere que todos los identificadores que se declaró antes de
ser utilizado en el programa. De lo contrario, el compilador puede no ser capaz de interpretar
correctamente. Así es como una declaración de una distancia variable llamada se ve así:
dim distance as float ' Declare variable distance
Como puede verse, es una variable de punto flotante, es decir, un número con decimales
opcionales. Otras dos variables se declaran y el nombre de velocidad y el tiempo. Ahora, pueden ser
utilizados en el programa de la siguiente manera:
Este es un ejemplo de cómo escribir el módulo principal correctamente:
ORGANIZACIÓN DE LOS MÓDULOS DE OTROS
Otros módulos comenzar con la palabra clave módulo. Cada módulo consta de tres secciones: incluyen,
la interfaz y la implementación.Sólo la sección de implementación es obligatoria. Se inicia con
la palabra clave implements. Siga el ejemplo siguiente:
IDENTIFICADORES
Los identificadores son nombres arbitrarios asignados a los objetos de lenguaje básicas, tales como
constantes, variables, funciones, procedimientos, etc Alguien acaba de llegar a una idea de usar el
identificador de la palabra en lugar del nombre. Tan simple como eso.Aquí hay algunas reglas que deben
observarse en la utilización de identificadores:
Los identificadores pueden contener todas las letras del alfabeto (mayúsculas y minúsculas), números (0-9) y el carácter guión bajo (_).
El primer carácter de un identificador no debe ser un dígito.
Ningún identificador puede contener caracteres especiales como! [{# $% &, Etc
Basic no distingue entre mayúsculas y minúsculas, lo que significa que primero, primer y la primera se consideran idénticos.
La ^ (acento circunflejo) símbolo se utiliza para referirse a un operador de exponenciación, el * (asterisco) símbolo se utiliza para denotar la multiplicación, mientras que los otros símbolos tienen sus significados habituales.
Palabras clave está ya utilizados por el compilador no debe utilizarse como identificadores de las palabras clave mikroBasic enumerados en la siguiente tabla:
Resumen
Abstract
And
Array
As
At
Asm
Assembler
Automated
Bdata
Begin
Bit
Case
Cdecl
Class
Code
Compact
Const
Constructor
Contains
Data
Default
Deprecated
Destructor
Dispid
Dispinterface
Div
Do
Downto
Dynamic
Else
End
Except
Export
Exports
External
Far
File
Finalization
Finally
For
Forward
Function
Goto
Idata
If
Ilevel
Implementation
In
Index
Inherited
Initialization
Inline
Interface
Io
Is
Label
Large
Library
Message
Mod
Name
Near
Nil
Not
Object
Of
On
Or
Org
Out
Overload
Override
Package
Packed
Pascal
Pdata
Platform
Private
Procedure
Program
Property
Protected
Public
Published
Raise
Read
Readonly
Record
Register
Reintroduce
Repeat
Requires
Resourcestring
Rx
Safecall
Sbit
Set
Sfr
Shl
Shr
Small
Stdcall
Stored
String
Stringresource
Then
Threadvar
To
Try
Type
Unit
Until
Uses
Var
Virtual
Volatile
While
With
Write
Writeonly
Xdata
Xor
Una lista de identificadores que no deben ser utilizados en el programa.
COMENTARIOS
Los comentarios son partes del programa que sirve para proporcionar más información sobre el programa
y que quede claro para el usuario. En Basic, cualquier texto que sigue a una comilla simple (') se
considera un comentario. Los comentarios no se compila en código ejecutable. El compilador es capaz de
reconocer los caracteres especiales utilizados para marcar el lugar donde comienzan los comentarios e
ignora por completo el texto siguiente durante la compilación. A pesar de que los comentarios no pueden
afectar a la ejecución del programa, que son tan importantes como cualquier otra parte del programa,
porque casi todos los programas hay que mejorar, modificar, actualizar o simplificado en algún
momento. Sin comentarios, es casi imposible de entender, incluso los programas más simples.
ETIQUETAS
Las etiquetas proporcionan la manera más fácil de controlar el flujo del programa. Se utilizan para marcar
las líneas particulares en el programa de instrucción de salto y en su caso son subrutina que se
jecutará. Todas las etiquetas deben ser denunciado por ':' para que el compilador puede reconocer.
CONSTANTES
Una constante es un número o un carácter cuyo valor no se puede cambiar durante la ejecución del
programa. A diferencia de las variables, las constantes se almacenan en la memoria ROM del
microcontrolador con el fin de ahorrar espacio de memoria como mucho de RAM como sea posible. El
compilador reconoce constantes por sus nombres y const prefijo. Cada constante se declara bajo un
nombre único que debe ser un identificador válido. Las constantes están disponibles en formatos decimal,
hexadecimal y binario. El compilador distingue entre ellos de acuerdo con sus prefijos. Si una constante
no tiene prefijo, se considera decimal por defecto.
F O R M A T O P R E F I J O E J E M P L O
Decimal
const MAX = 100
Hexadecimal 0x o $ const MAX = 0xFF
Binario De punto flotante const MAX =% 11011101
Las constantes se declaran en la parte de declaración del programa o rutina. La sintaxis de las constantes
es la siguiente:
const constant_name [as type] = value
Los nombres de constantes se suelen escribir en mayúsculas. El tipo de una constante es
automáticamente reconocido por su tamaño.En el ejemplo siguiente, el mínimo constante se considera un
entero con signo y se almacena dentro de dos bytes de memoria flash (16 bits):
const MINIMUM = -1000 ' Declare constant MINIMUM
Tipo de constante se especifica opcionalmente. En ausencia de tipo, el compilador asume que el
"pequeño" tipo que se puede acomodar el valor constante.
const MAX as longint = 10000
const MIN = 1000 ' Compiler will assume word type
const SWITCH = "n" ' Compiler will assume char type
En el siguiente ejemplo, un T_MAX constante llamada se declara a fin de tener un valor fraccionario
32,60. Ahora, el programa se puede comparar la temperatura medida a la constante con un nombre
significativo en su lugar el número 32.60.
const T_MAX = 32.60 ' Declare temperature T_MAX
const T_MAX = 3.260E1 ' Another way of declaring constant T_MAX
Una constante de cadena se compone de una secuencia de caracteres. Ellos están encerrados entre
comillas dobles. Un espacio en blanco puede ser incluido también en la constante de cadena como un
carácter. Las constantes de cadena se utilizan para representar cantidades no numéricos, tales como
nombres, direcciones, mensajes, etc
const Message_1 = "Press the START button" ' Message 1 for LCD
const Message_2 = "Press the RIGHT button" ' Message 2 for LCD
const Message_3 = "Press the LEFT button" ' Message 3 for LCD
En este ejemplo, el envío de la constante Message_1 a un LCD hará que 'presione el botón START' el
mensaje que se mostrará.
VARIABLES
Una variable es un objeto con nombre capaz de contener un conjunto de datos que pueden ser
modificados durante la ejecución del programa. Cada variable se declara con un nombre único que debe
ser un identificador válido. Por ejemplo, para sumar dos números(numero1 + numero2) en el programa, es
necesario tener una variable para representar lo que en la vida cotidiana llame a la suma. En
este número1 caso, el número y la suma son variables. La sintaxis de una declaración única variable es la
siguiente:
dim variable_name as type
Las variables en Basic se escriben, lo que significa que es necesario especificar el tipo de datos es una
variable a recibir. Las variables se almacenan en la memoria RAM y el espacio de memoria ocupado (en
bytes) depende de su tipo. Además de las declaraciones individuales, las variables del mismo tipo puede
ser declarada como una lista. En este caso, identifier_list es una lista separada por comas de
identificadores válidos, mientras que el tipo puede ser cualquier tipo de datos.
dim i, j, k as byte 'Define variables i, j, k
dim counter, temp as word 'Define variables counter and temp
SÍMBOLOS
Los símbolos en Basic permiten crear macros simples sin parámetros. Esto significa que cualquier línea
de código puede ser reemplazado con un identificador único. Los símbolos, cuando se utiliza
correctamente, puede aumentar la legibilidad del código y la reutilización.
Los símbolos se declaró al principio del módulo, justo después del nombre del módulo y
opcionales incluyen directiva. El alcance de un símbolo es siempre limitado al módulo en el que ha sido
declarada.
symbol symbol_name = code
En este caso, symbol_name debe ser un identificador válido para ser utilizado en todo el código. El
especificador de código puede ser cualquier línea de código (literales, tareas, llamadas a funciones, etc.)
symbol MAXALLOWED = 216 ' Symbol MAXALLOWED for numeric
value
symbol OUT = PORTA ' Symbol OUT for SFR
symbol MYDELAY = Delay_ms(762) ' Symbol MYDELAY for procedure
call
dim cnt as byte ' Variable cnt
main:
if cnt > MAXALLOWED then ' Program checks whether cnt >
216
cnt = 0 ' If yes,
OUT.1 = 0 ' the following three commands
MYDELAY ' are to be executed
end if
... ' If not, program continues here
No hay espacio en la memoria RAM se utiliza para el almacenamiento de símbolos que se utilizan en el
programa. El compilador simplemente reemplazará todos los símbolos con líneas de código
correspondientes a ellas cuando se declaran.
TIPOS DE DATOS BÁSICOS DEL LENGUAJE
Hay varios tipos de datos que pueden ser utilizados en el lenguaje de programación de base. Tabla a
continuación muestra el rango de valores de estos datos puede tener cuando se utiliza en su forma
básica.
T I P O D E D A T O S
D E S C R I P C I Ó N T A M A Ñ O
( N Ú M E R O D E B I T S )
R A N G O D E V A L O R E S
poco Un bit 1 0 o 1
sbit Un bit 1 0 o 1
byte, char Carácter 8 0 ... 255
corto Entero con signo de
corto 8 -127 ... 128
palabra Entero sin signo 16 0 ... 65535
entero Entero con signo 16 -32768 ... 32767
LongWord Palabra de 32 bits 32 0 ... 4294967295
Entero Palabra de 32 bits
firmado 32 -2147483648 ... 2147483647
flotar De punto flotante 32 ± 1.17549435082 * 10 -38 ... ± 6.80564774407 *
10 38
Automatic Data Conversión de tipos
El compilador realiza automáticamente la conversión implícita en las siguientes situaciones:
si una instrucción requiere una expresión de tipo particular, pero la expresión de tipo diferente se utiliza;
si un operador requiere un operando de tipo particular, pero operando de diferente tipo se utiliza;
si una función requiere un parámetro formal de tipo particular, pero se le asigna un objeto de tipo diferente, y
si el resultado de la función no coincide con el retorno declarado función del tipo de datos.
PROMOCIÓN
Cuando operandos son de tipos diferentes, conversión implícita promueve un complejo menos a un tipo
más complejo como sigue:
bit → byte
short, byte/char → integer, word, longint, longword
integer, word → longint, longword
short, byte/char, integer, word, longint, longword → float DATOS DE RECORTES
En instrucciones de asignación y estados que requieren una expresión de tipo particular, el valor correcto
se almacena en destino sólo si el resultado de la expresión no exceda el rango de destino. De lo contrario,
si la expresión se evalúa como un tipo más complejo de lo esperado, los datos de exceso simplemente se
recorta, es decir, los bytes más altos se perderá.
dim i as byte ' Variable i occupies one byte of RAM
dim j as word ' Variable j occupies two bytes of RAM
...
j = $FF0F
i = j ' i becomes $0F, higher byte $FF is lost
EXPLÍCITA Conversiones de tipos
La conversión explícita se puede ejecutar sobre cualquier expresión en cualquier momento al escribir la
palabra clave deseada tipo (float byte, una palabra corta, entero, entero largo, ...) antes de la
expresión que se va a convertir. La expresión debe ir entre paréntesis. La conversión explícita no se
puede realizar sobre el operando a la izquierda del operador de asignación.
a = word(b) ' Explicit conversion of expression b
word(b) = a ' Compiler will report an error
Un caso especial de la conversión es una conversión explícita entre tipos de datos y sin signo, ya que no
afecta a la representación binaria de los datos.
dim a as byte
dim b as short
'...
b = -1
a = byte(b) ' a is 255, not -1
' Data doesn’t change its binary representation %11111111
' it is just interpreted differently by the compiler
OPERADORES
Un operador es un símbolo que se utiliza para denotar aritmética en particular, la lógica o alguna otra
operación. Cada operación se lleva a cabo en una o más operandos (variables o constantes) en una
expresión. Además, cada operador cuenta con la ejecución de la prioridad y la asociatividad. Si una
expresión contiene más de un operando, el orden de su ejecución se determina por el nivel de
prioridad. Hay cuatro categorías prioritarias en Basic. Los operadores que pertenecen a la misma
categoría tienen la misma prioridad. Si dos o más operadores tienen el mismo nivel de prioridad, las
operaciones se realizan de izquierda a derecha. Paréntesis se puede utilizar para definir la prioridad de la
operación dentro de una expresión. Cada categoría tiene asignado ya sea de izquierda a derecha o
izquierda Derechapara regla de la asociatividad. Consulte la tabla a continuación.
P R I O R I D A D O P E R A D O R E S A S O C I A T I V I D A D
Alto @ No + - de derecha a izquierda
* / Div mod y >> << de izquierda a derecha
+ - O XOR de izquierda a derecha
Bajo = <> <> <=> = de izquierda a derecha
Operadores aritméticos
Los operadores aritméticos se utilizan para realizar operaciones aritméticas. Estas operaciones se
realizan sobre los operandos numéricos y siempre devuelven resultados numéricos. Las operaciones
binarias se realizan sobre dos operandos, mientras que las operaciones se llevan a cabo en unarios un
operando. Todos los operadores aritméticos se asocian de izquierda a derecha.
O P E R A D O R O P E R A C I Ó N
+ Adición
- Sustracción
* Multiplicación
/ División - de punto flotante
div División - redondear hacia abajo
mod Recordatorio
División por cero
Si un cero (0) se utiliza de forma explícita como el segundo operando en la operación de división (x div 0),
el compilador informará de un error y no generará un código. En el caso de la división implícita en donde
el segundo operando es un objeto cuyo valor es 0 (x div y, donde y = 0), el resultado será indefinido.
OPERADORES RELACIONALES
Los operadores relacionales se utilizan para comparar dos variables y determinar la validez de su
relación. En mikroBasic, todos los operadores relacionales volver 255 si la expresión es verdadera, o cero
(0) si es falso. Lo mismo se aplica en expresiones tales como "si la expresión es verdadera, entonces ..."
O P E R A D O R S E N T I D O E J E M P L O V E R D A D C O N D I C I O N E S
> es mayor que b> a si b es mayor que un
> = es mayor que o igual a un> = 5 Si uno es mayor que o igual a 5
< es menor que a <b si a es menor que b
<= es menor o igual a a <= b si a es menor o igual a b
= es igual a un 6 = si A es igual a 6
<> no es igual a A <> B si uno no es igual a b
LÓGICA operadores bit a bit
Lógica operadores bit a bit se llevan a cabo en los bits de un operando. Se asocian de izquierda a
derecha. La única excepción es el operador de complemento bit a bit, no que se asocia de derecha a
izquierda. Los operadores bit a bit se enumeran en la tabla de la derecha:
Los operadores bit a bit y, OR y XOR realizar operaciones lógicas sobre los pares apropiados de bits de
los operandos. El operador nocomplementa cada bit de un operando solo.
O P E R A N D O S E N T I D O E J E M P L O R E S U L T A D O
<< Mover a la izquierda A = B 2 << B =
11110011 A =
11001100
>> Desplazamiento a la
derecha A = B >> 3
B = 11110011
A = 00011110
y AND bit a bit C = A y B
A = 11100011
B = 11001100
C = 11000000
o OR bit a bit C = A o B A =
11100011 C =
11101111
B =
11001100
no NOT bit a bit A = B que
no B =
11001100 A =
00110011
xor EXOR bit a bit C = A xor B
A = 11100011
B = 11001100
C = 00101111
Los operadores bit a bit y, OR y XOR realizar operaciones lógicas sobre los pares apropiados de bits de
los operandos. El operador nocomplementa cada bit de un operando solo.
$1234 and $5678 ' result is $1230 because:
' $1234 : 0001 0010 0011 0100
' $5678 : 0101 0110 0111 1000
' ----------------------------
' and : 0001 0010 0011 0000 ... that is, $1230
$1234 or $5678 ' equals $567C
$1234 xor $5678 ' equals $444C
not $1234 ' equals $EDCB
Bit a bit Operadores de desplazamiento
Hay dos operadores de desplazamiento en mikroBasic. Estos son el operador << que se mueve bits a la
izquierda y el operador >> que se mueve bits a la derecha. Ambos operadores tienen dos operandos cada
uno. El operando de la izquierda es un objeto de mover, mientras que el operando de la derecha es un
número de posiciones para mover el objeto. Ambos operandos deben ser del tipo integral.El operando de
la derecha debe ser un valor positivo.
Al cambiar un operando izquierdo (<<), los bits de la izquierda se descartan, mientras que los 'nuevos' bits
a la derecha se asignan ceros.Cambiando operando sin signo a la izquierda por n posiciones es
equivalente a multiplicar con 2 n.
Lo mismo se aplica a operandos firmados si todos los bits son iguales
desechados para el bit de signo.
dim num as word ' declare variable num as word
num = 1 ' asign it decimal value 1 (00000000 00000001 bin.)
num << 5 ' equals 32 (00000000 00100000 bin.)
Al cambiar operando de la derecha (>>), los bits de la derecha se descartan, mientras que los 'nuevos'
bits a la izquierda son ceros asignados (en caso de firmar operando) o el bit de signo (en el caso de la
firma operando). El cambio operando a la derecha por n posiciones es equivalente a dividiéndolo por 2 n.
dim num as integer ' declare variable num as signed integer
num = 0xFF56 ' asign it hex value FF56 (11111111 01010110 bin.)
num >> 4 ' equals 0xFFF5 (11111111 11110101 bin.)
Sentencias condicionales
Las condiciones son ingredientes comunes de un programa. Permiten que uno o una serie de sentencias
que se ejecutarán en función de la validez de una expresión. En otras palabras: 'Si se cumple la condición
(...), hacer (...). De lo contrario, hacer (...) ". Una sentencia condicional se puede seguir, ya sea por una
sola declaración o por un bloque de instrucciones a ejecutar.
Declaración condicional IF
La sintaxis de una forma simple de la sentencia if es la siguiente:
if expression then
operations
end if
Si el resultado de la expresión es verdadera (no 0), las operaciones se llevan a cabo, a continuación, el
programa continúa con la ejecución. Si el resultado de la expresión es falsa (0), las operaciones no se
llevan a cabo y el programa continúa inmediatamente con la ejecución.
El operador si también se puede utilizar en combinación con los operadores else:
if expression then
operations1
else
other operations2
end if
Si el resultado de la expresión es verdadero (no 0), operaciones1 se llevan a cabo, de lo contrario
operaciones2 se realizan. El programa continúa con la ejecución después de estas operaciones se llevan
a cabo.
IF anidadas
SI anidada necesitan atención adicional. Una sentencia if anidada es una frase que se utiliza dentro de la
otra sentencia if. Como regla general, que se analizan a partir de la ifstatement más anidada, mientras
que cada sentencia else se une a la más cercana disponible si a su izquierda:
Instrucción Select Case
La instrucción Select Case es una sentencia condicional con múltiples ramificaciones. Se compone de un
selector de expresión (condición) y una lista de valores posibles de la expresión. La sintaxis de la
instrucción Select Case es:
El especificador selector es una expresión que debe evaluar como un valor integral.
Especificadores valor_1 ... value_n representan valores posibles selectores y puede ser literales,
constantes o expresiones constantes.Los especificadores statements_1 ... statements_n puede ser
ninguna de las declaraciones.
La cláusula más caso es opcional.
En primer lugar, la expresión del selector se evalúa. A continuación, se compara con todos los valores
disponibles. Si el partido se encuentra, las declaraciones después de la evaluación de partido y termina la
instrucción Select Case. Si hay varias coincidencias, tras las declaraciones del primer partido será
ejecutado. Si ninguno de los valores coincide con el selector, luego default_statements en la cláusula else
caso (si lo hay) se ejecutan.
Aquí está un ejemplo de la instrucción Select Case:
select case decimal_digit ' Decimal-digit value is being
checked
case 0
mask = %01111110 ' Display "0"
case 1
mask = %00110000 ' Display "1"
case 2
mask = %01101101
case 3
mask = %01111001
case 4
mask = %00110011
case 5
mask = %01011011
case 6
mask = %01011111
case 7
mask = %01110000
case 8
mask = %01111111
case 9
mask = %01111011
end select
Esta rutina de programa convierte los dígitos decimales en combinación binaria adecuada en el puerto
con el fin de mostrar en una pantalla de LED.
Bucles de programa
Algunas instrucciones (operaciones) se tienen que ejecutar más de una vez en el programa. Un conjunto
de comandos que se repiten hace un bucle de programa. ¿Cuántas veces se ejecutará, es decir, la
duración del programa se mantendrá dentro de un bucle, depende de las condiciones para salir del bucle.
Bucle WHILE
El bucle mientras se lleva a cabo cuando el número de iteraciones no se especifica. Es necesario
comprobar la condición de iteración antes de la ejecución de un bucle. En pocas palabras, el bucle while
se ejecuta mientras que todas las condiciones necesarias para su ejecución se cumplen ... La sintaxis del
bucle while es el siguiente:
while expression
statements
wend
Las declaraciones especificador representa un grupo de instrucciones que se ejecutan repetidamente
siempre que el valor del especificador de expresión que representa una expresión es verdadera. En otras
palabras, el programa permanece en el bucle hasta que la expresión se convierte en falsa. El valor de
expresión se comprueba antes de la siguiente iteración se ejecuta. En consecuencia, si es falsa antes de
entrar en el bucle, no ejecuta iteraciones, es decir, los estados nunca será ejecutado. El programa
procederá a la ejecución desde el final del bucle, mientras que (a partir de las instrucciones siguientes de
la instrucción Wend).
Un tipo especial del bucle de programa es un bucle sin fin. Se crea si la condición para salir de bucle se
mantiene sin cambios dentro del bucle.
En este caso, la ejecución es simple como el resultado entre paréntesis es siempre cierto (1 se Allways
ser diferente de 0), lo que significa que el programa permanece en el bucle.
while 1 ' ‘true’ can be written instead of ‘1’
... ' Expressions will be unceasingly executed (endless
loop)
...
wend
DE LOOP
El bucle se ejecuta cuando el número de iteraciones se especifica. La sintaxis del bucle for es el siguiente:
for counter = initial_value to final_value [step step_value]
statements
next counter
En este caso, con cada iteración del bucle, la variable contador se incrementa en step_value. El
parámetro step_value es un valor opcional entero, considerado uno si se omite. Antes de la primera
iteración, el contador (contador) se ajusta a su valor inicial (initial_value) y se incrementará hasta que se
alcanza o supera el valor final (final_value). Las declaraciones se realizarán con cada
iteración. Iinitial_value y final_value deben ser compatibles con las expresiones del mostrador, mientras
que el especificador de declaraciones puede ser cualquier sentencia que no cambia el valor del
contador. Tenga en cuenta que el parámetro step_value puede ser negativo, lo que permite una cuenta
regresiva.
for k=1 to 5 ' Increase variable k five times (from 1 to 5) and
operation ' keep on executing "operation" every time
...
next k
Un conjunto de instrucciones (funcionamiento) se ejecutará cinco veces. Después de eso, se determinó
que la k <5 es falsa (después de 5 iteraciones k = 5) y el programa saldrá del bucle for.
Do Loop
El bucle do se lleva a cabo cuando el número de iteraciones no se especifica. El bucle se ejecuta
repetidamente hasta que la expresión se evalúa como verdadera. La sintaxis del bucle do es la siguiente:
do
statements
loop until expression
En este caso, el especificador de estados representa un grupo de instrucciones que se ejecutan siempre
que la expresión (expresión) es verdadera. Las condiciones de bucle se comprueban al final del bucle, por
lo que el bucle se ejecuta al menos una vez, independientemente de si la condición es verdadera o
falsa. En el ejemplo siguiente, el programa permanece en el bucle do hasta una variable alcanza 1E06 (un
millón de iteraciones).
a = 0 ' Set initial value
do
a = a+1 ' Operation in progress
loop until a <= 1E06 ' Check condition
Escribir código en lenguaje ensamblador
A veces un programa en Basic requiere que partes del código que se escriben en lenguaje
ensamblador. De este modo algunas partes del programa puede ser ejecutado en una forma
definida con precisión por el período exacto de tiempo. Por ejemplo, cuando es necesario para
proporcionar impulsos muy cortos (de unos pocos microsegundos) para aparecer
periódicamente en un pin del microcontrolador, la mejor solución es escribir un código de
montaje para el control de duración del impulso. El comando ASM se utiliza para introducir una
o más instrucciones de montaje para el programa escrito en Basic:
asm
Assembly language instructions
...
end asm
Instrucciones de montaje puede utilizar objetos (constantes, variables, rutinas, etc) que deben ser
previamente declaradas en el lenguaje Basic. No hace falta decir que estos objetos se declaran de
acuerdo con las reglas del lenguaje Visual Basic. Consulte el siguiente ejemplo:
ARRAYS
Una matriz es una lista finita y dispuesto de las variables del mismo tipo, llamados elementos. Este tipo se
llama el tipo base. Cada elemento se le asigna un índice único modo que los elementos diferentes pueden
tener el mismo valor. Un arreglo se declara especificando el tipo de sus elementos (llamado tipo de
matriz), su nombre y el número de sus elementos encerrados entre corchetes:
dim array_name as component_type [number_of_components]
Los elementos de un array se identifican por su posición. Los índices van de 0 (el primer elemento de una
matriz) a N-1 (N es el número de elementos incluidos en una matriz). El compilador debe saber cuántas
posiciones de memoria para asignar, cuando se declara una matriz y debido a que el tamaño de la matriz
no puede ser variable.
E L E M E N T S O F A R R A Y C O N T E N T S O F E L E M E N T
shelf[0] 7
shelf[1] 23
shelf[2] 34
shelf[3] 0
shelf[4] 0
shelf[5] 12
shelf[6] 9
... ...
... ...
shelf [99] 23
Para ilustrarlo, una matriz puede ser considerado como una lista más corta o más larga de las variables
del mismo tipo, donde cada una de ellas se le asigna un número ordinal siempre a partir de cero. Esta
matriz se llama un vector. Tabla de la derecha muestra una matriz denominada plataforma que consta de
100 elementos.
En este caso, el contenido de una variable (elemento) representa una serie de productos de la plataforma
contiene. Los elementos se accede por la indexación, es decir, mediante la especificación de sus índices
entre corchetes:
dim shelf as byte [100] ' Declare the array "shelf" with 100
elements
shelf [4] = 12 ' 12 items are ‘placed’ on shelf [4]
temp = shelf [1] ' Variable shelf [1] is copied to
' variable temp
En las matrices constantes, los elementos pueden ser asignados a sus contenidos durante la declaración
de matriz. En el siguiente ejemplo, un calendario constante de matriz se ha declarado el nombre y cada
elemento se le asigna un número específico de días:
const CALENDAR as byte [12]=
(31,28,31,30,31,30,31,31,30,31,30,31)
El número de valores asignados no debe exceder la longitud de la matriz especificada, pero puede ser
menor. En este caso, los finales de los elementos exceso será asignado ceros.
GoTo
La sentencia goto le permite hacer un salto absoluto a otro punto en el programa. Tenga cuidado al usar
esta declaración ya que su ejecución provoca un salto incondicional haciendo caso omiso de cualquier
tipo de limitaciones de anidación. El punto de destino es identificado por una etiqueta, que se utiliza como
un argumento para la instrucción goto. Una etiqueta consiste en un identificador válido seguido por dos
puntos (:) La sintaxis de la sentencia goto es.:
goto: label_name
Esta sentencia se ejecuta un salto al especificador LABEL_NAME lo que representa una etiqueta. La
sentencia goto puede preceder o seguir a la etiqueta. Por lo tanto, no es posible saltar dentro o fuera de
un procedimiento o función. La sentencia goto se puede utilizar para salir de cualquier nivel de las
estructuras anidadas. No es recomendable para ir en un bucle u otra sentencia estructurada, ya que
puede dar resultados inesperados.
GOSUB DECLARACIÓN
Una subrutina es una porción de código dentro de un programa más amplio ejecutado sobre la
demanda. Se realiza una tarea específica y es relativamente independiente del resto del código. El
intérprete saltar a la subrutina, ejecutarlo, y volver al programa principal.Palabras clave GOSUB y el
retorno se utilizan en el lenguaje Basic para indicar comienzo y final de la subrutina.
gosub label_name
...
...
...
label_name:
...
return
Las subrutinas son considerados por muchos a ser difícil de mantener, difícil de leer y digerir, al igual que
la sentencia goto. Úsalos sólo si usted no tiene una solución mejor.
Acceder a los BITS INDIVIDUALES
Compilador mikroBasic PRO para PIC, instalado en su PC, incluye una lista de los microcontroladores PIC
soportados con todos los registros, sus direcciones exactas y los nombres de bits. El compilador le
permite acceder a los bits individuales de estos registros por sus nombres, sin especificar sus posiciones
(el compilador ya se "sabe" ellos). Hay un número de formas de acceder y modificar un bit individual
dentro de un registro. Vamos a tener acceso a el bit GIE (Global Interrupt Enable bit), por ejemplo. Es el
séptimo bit del registro INTCON. Una forma de acceder a este bit por su nombre es para escribir lo
siguiente:
INTCON.GIE = 0 ' Clear Global Interrupt Enable Bit (GIE)
En lugar de un nombre poco, una variable, llamada constante, la función o una expresión encerrada entre
paréntesis se pueden utilizar para denotar la posición de bit en un registro. Además, para el acceso a bit
individual no son constantes globales predefinidas B0, B1, ..., B7, o 0, 1, ... 7, donde 7 se considera el bit
más significativo.
INTCON.B0 = 0 ' Clear bit 0 of the INTCON register
ADCON0.5 = 1 ' Set bit 5 of the ADCON0 register
i = 5
STATUS.(i+1) = 1 ' Set bit 6 of the STATUS register
Por último, un poco deseada se puede acceder mediante su nombre de alias. En este caso es el GIE_bit:
GIE_bit = 1 ' Set Global Interrupt Enable Bit (GIE)
SBIT TIPO
El PRO mikroBasic para PIC compilador tiene el tipo de datos sbit. Este es el menor tipo de datos se
refiere a un solo bit. Si sbit tipo se asigna a una variable, el bit apropiado de algún registro será cambiado
por cambiar esa variable sin specyfing el nombre del registro y la ubicación. La variable sbit se
comportará como un puntero. Con el fin de declarar la variable sbit, basta con escribir:
dim Bit_name as sbit at Register_name.Bit_position
program MyProgram ' Main module
...
dim Output1 as sbit at PORTB.0 ' Variable Output1 is of sbit
type
...
Output1 = 1 ' Pin PORTB.0 is set (5V)
BIT TIPO
El PRO mikroBasic para PIC compilador proporciona el tipo de datos de bits que pueden ser utilizados
para las declaraciones de variables.
dim bf as bit
A diferencia de las variables de tipo sbit, sólo el nombre de bit se declaró aquí, mientras que el compilador
almacena bits variable en algunos de los registros libres de RAM. Como puede verse, no es necesario
especificar un poco de algún registro específico. La ubicación exacta de la variable de tipo bit es
desconocido para el usuario.
Tipos de bit y sbit llevan a cabo con las siguientes limitaciones:
No se puede utilizar las listas de argumentos y como valores de retorno de la función
No se puede utilizar como un miembro de las estructuras
No se puede utilizar como elementos de matriz
No se puede inicializar
No se puede ser señalado
Sus direcciones no puede ser de color rojo, por lo tanto, el operador unitario @ no se puede utilizar con variable de este tipo
dim ptr as ^bit ' invalid
dim arr as array[5] of bit ' invalid
PROCEDIMIENTOS Y FUNCIONES
Las funciones y procedimientos, que se conocen como rutinas, son subprogramas (bloques portaválvulas
declaración) que realizan una tarea determinada sobre la base de una serie de parámetros de
entrada. Las funciones devuelven un valor después de la ejecución, mientras que los procedimientos no lo
hacen.
PROCEDIMIENTOS
Un procedimiento es un bloque con nombre de código, es decir, una subrutina con algunas características
adicionales. Por ejemplo, se puede aceptar parámetros. Los procedimientos se declaran de la siguiente
manera:
sub procedure procedure_name(parameter_list)
[ local declarations ]
procedure body
end sub
El especificador procedure_name representa un nombre de procedimiento y puede ser cualquier identificador válido.
El especificador parameter_list entre paréntesis representa una lista de parámetros
formales declarados similares a las variables. En mikroBasic PRO para PIC, los parámetros se pasan a un procedimiento por valor. Para pasar parámetros por dirección, es necesario añadir la palabra clave ByRef al comienzo de la declaración de parámetros.
Local declarations son declaraciones opcionales de variables y constantes que se
refieren al procedimiento que se indica solamente.
Procedure body es una secuencia de sentencias que se ejecutarán después de
llamar al procedimiento.
Los procedimientos son llamados por su nombre seguido de los parámetros reales colocados en el mismo
orden que los parámetros formales a juego. Tras una llamada a procedimiento, todos los parámetros
formales se crean como objetos locales inicializadas por valores de los argumentos reales.
'Add two numbers
sub procedure add (dim byref sum as word, dim x, y as byte)
sum = x + y ' add numbers x and y and store result into sum
variable
end sub ' end of subprocedure
Ahora, podemos llamar al procedimiento complemento para calcular el peso total de una carga, por
ejemplo: add (gross_weight, net_weight, tare_weight)
FUNCIONES
Las funciones deben ser debidamente declarado con el fin de interpretar correctamente durante el
proceso de compilación.
sub function function_name(parameter_list) as return_type
[ local declarations ]
function body
end sub
Cada declaración contiene los siguientes elementos:
Nombre de la función es un identificador por el cual será posible llamar a una función (function_name en el ejemplo).
Tipo de resultado (valor devuelto) es el tipo de datos de los datos devueltos (return_type en el ejemplo).
Declaración de los parámetros: cada parámetro consiste en una variable, un puntero constante, o una matriz precedido por su especificador de tipo de datos similar a cualquier declaración periódica variable (lista_de_parametros en el ejemplo). Se utilizan para transmitir información a la función cuando se le llama.
Declaraciones locales son declaraciones opcionales de variables y constantes que sólo se refieren a la función dada.
Cuerpo de la función es una secuencia de sentencias que se ejecutarán después de llamar a la función.
Aquí está un ejemplo de cómo definir y utilizar la función de potencia:
'function which calculates xn based on input parameters x and n
(n > 0)
sub function power(dim x, n as byte) as longint ' x and n are
bytes, result is longint
dim i as byte ' i is a byte
result = 1 ' result = 1 if n = 0
if n > 0 then
for i = 1 to n
result = result*x
next i
end if
end sub
Ahora, podemos llamar a la función de potencia para el cálculo de 3 12,
por ejemplo:
tmp = power(3, 12) ' Calculate 312
Funciones y procedimientos BIBLIOTECAS
Las declaraciones de todas las funciones y procedimientos que se utilizan en Basic se suelen almacenar
en los archivos de bibliotecas de módulos especiales llamados. Antes de utilizar cualquiera de ellos en el
programa, es necesario especificar el módulo apropiado por medio de la cláusula de incluir al comienzo
del programa. Es sólo una regla general. Pero si usted escribe un programa en el compilador mikroBasic
PRO para PIC es suficiente para comprobar la biblioteca que desee en la lista y el módulo
correspondiente se incluirá automáticamente en el proyecto. Este compilador ya tiene un número de esas
bibliotecas. Si el compilador encuentra una función desconocida o procedimiento durante la ejecución del
programa, primero se buscará su declaración en las bibliotecas de préstamo anteriormente.
Rutinas incorporadas EN mikroBasic PRO PARA PIC
Además de librerías de funciones y el procedimiento, el PRO mikroBasic para PIC compilador proporciona
un conjunto de útiles funciones integradas:
Helo
Hola
Mayor
La más alta
Inc
Diciembre
Chr.
Ord
SETBIT
ClearBit
TestBit
Delay_us
Delay_ms
Vdelay_Advanded_ms
Vdelay_ms
Delay_Cyc
Clock_KHz
Clock_MHz
Reajustar
CLRWDT
DisableContextSaving
SetFuncCall
SetOrg
GetDateTime
GetVersion
Los delay_us y rutinas Delay_ms se generan en el lugar de llamada.
Los Vdelay_ms, Delay_Cyc y Get_Fosc_kHz son reales rutinas básicas. Sus fuentes se pueden encontrar
en el archivo Delays.mbas encuentra en la carpeta usos del compilador.
PREPROCESSOR
Un preprocesador es una parte integral de cada compilador. Su función es reconocer y ejecutar las
instrucciones del preprocesador.¿Cuáles son las instrucciones del preprocesador? Estas son las
instrucciones especiales que no pertenecen al lenguaje Basic, pero se integran en el compilador. Antes de
la compilación, el compilador activa el preprocesador que pasa por el programa en la búsqueda de estas
instrucciones. Si alguno encuentra, el preprocesador simplemente reemplazarlos por otro texto que,
dependiendo del tipo de comando, puede ser un archivo (comando incluyen) o simplemente una corta
secuencia de caracteres (comando definir). Entonces, el proceso de recopilación se inicia. Las
instrucciones del preprocesador pueden estar en cualquier lugar en el programa de origen y se refieren
únicamente a la parte del programa después de su aparición hasta el final del programa.
Directiva de preprocesador INCLUYEN
Muchos programas suelen repetir el mismo conjunto de comandos en varias ocasiones. Con el fin de
acelerar el proceso de escribir un programa, estos comandos y declaraciones suelen agruparse en
módulos específicos que pueden ser fácilmente incluidas en el programa usando la directiva include. Para
ser más precisos, la directiva include texto de las importaciones procedentes de otro documento, no
importa si se trata de un conjunto de comandos, comentarios, etc, en el programa.
Compilación condicional
Directivas de compilación condicional se utilizan normalmente para hacer que los programas de código
fácil de modificar y compilar para microcontroladores diferentes. mikroBasic PRO para PIC compatible con
la compilación condicional. Todas las directivas de compilación condicional debe ser completado dentro
del módulo en el que han comenzado.
Directivas # if, # elif, # else y # endif
Directivas condicionales # if, # elif, # else y # endif se ejecutan similares a las sentencias condicionales
básicas comunes. Si una expresión se escribe después de # si tiene un valor distinto de cero, entonces
las líneas de programa a raíz de la directiva # if será tratado como un código de programa válido y se
compila en un código hexadecimal. La sintaxis del mismo es:
#if constant_expression_1 'If constant_expression_1 is
not zero,
<section_1> 'section_1 will be compiled
[#elif constant_expression_2 'If constant_expression_2 is
not zero,
<section_2>] 'section_2 will be compiled
...
[#elif constant_expression_n 'If constant_expression_n is
not zero,
<section_n>] 'section_n will be compiled
[#else 'If none of previous sections
are compiled
<final_section>] 'final_section will be
compiled
#endif
Cada directiva # if en un archivo de origen debe ir acompañada de un cierre directiva # endif. Cualquier número de directivas # elif pueden aparecer entre las directivas # if y # endif, pero sólo una directiva # else está permitido. La directiva # else, si existe, debe ser la última directiva antes de # endif.
Sección puede ser cualquier código de programa que puede ser reconocido por el compilador o preprocesador. El preprocesador selecciona una sola sección, mediante la evaluación después de cada constant_expression # si o directiva # elif hasta que encuentra un verdadero (no cero) constant_expression.
Si todas las expresiones constantes de evaluar a falso o sin directivas # elif aparecen, el preprocesador selecciona el final_section después de la cláusula # else. Si la cláusula # else se omite y todas las instancias de constant_expression en el bloque # if se evalúe como falsa, ninguna sección serán seleccionados para su posterior procesamiento.
Finalmente, el resultado es que sólo una sección de código, incluso el vacío una, será compilado.
PUNTEROS
Como usted sabe, todos los objetos en el programa (variable, procedimiento, subrutina, etc) se le asigna
una dirección de memoria específica. Cuando se declara una variable en el programa, el compilador
automáticamente le asigna un lugar libre de memoria RAM.Durante la programación, estas direcciones se
mantienen ocultos a los programadores. En otras palabras - Las direcciones son "secreto" usado ... La
posibilidad de acceder a diferentes objetos por sus nombres (identificadores) en lugar de direcciones es
una de las principales ventajas de los lenguajes de programación de alto nivel. Como una cuestión de
hecho es mucho más fácil tratar con palabras (nombres) que con números. Además, el compilador se
encarga de asociar los objetos y sus adresses. Direccionamiento de los objetos mediante la
especificación de sus nombres se llama direccionamiento directo.
Sin embargo, a veces tienes que lidiar con las direcciones de las localizaciones de memoria. A
continuación, se utilizan los punteros - las variables que sostienen la dirección de memoria de un
objeto. En este caso, es posible acceder a los objetos que utilizan punteros sólo.Esta manera de abordar
por eso se llama direccionamiento indirecto.
Antes de utilizar un puntero, es necesario para declarar su tipo de datos. Simplemente, añadir un prefijo
intercalación (^) antes de que el tipo.
dim pointer_p as ^word ' pointer_p points to data of word
type
Si se requiere para almacenar una variable en algún lugar específico de memoria RAM, entonces la
directiva absoluta debe ser utilizado en el programa de la siguiente manera:
dim variable_a as word absolute 12 ' variable_a will occupy 1
word
' (16 bits) at address 12
Ahora bien, si desea acceder a los datos de ubicación de la memoria del puntero, es necesario agregar un
símbolo de intercalación después del nombre del puntero. Por ejemplo, vamos a declarar el puntero del
pointer_p mencionado que apunta a una palabra (en este caso, se ha definido previamente variable_a
almacenado en la dirección 12 en la memoria RAM). El variable_a puntas se le asignará el valor 26:
dim pointer_p as ^word 'Pointer_p points to data of word type
...
...
pointer_p = 12 'Pointer_p points to memory adress 12
...
pointer_p^ = 26 'Variable a at memory address 12 has
value 26
'Similar to the absolute directive that is used for variables,
the org
'directive specifies the starting address of a routine in ROM.
It is
'appended to the routine declaration. For example:
sub procedure proc(dim par as word) org 0x200 ' Procedure will
start at
... ' the address
0x200
end sub
En este caso, el puntero pointer_p se asigna el valor 12 (pointer_p = 12), lo que significa que la dirección
de memoria 12 se especifica por la presente.
Si desea cambiar el valor de una variable en punta, es suficiente para cambiar el valor del puntero y
añadir un símbolo de intercalación (^) como un sufijo a la misma. Refiérase a la figura en el variable_a
derecha, variable en la dirección 12 se asigna el valor 26 por medio del puntero pointer_p.
Los punteros pueden apuntar a los datos almacenados en cualquier espacio de memoria disponible y
puede residir en cualquier espacio de memoria disponible, salvo en el espacio de memoria de programa
(ROM).
@ OPERADOR
El operador @ devuelve la dirección de un objeto, es decir, crea un puntero a su operando. Las siguientes
reglas se aplican aquí:
Si X es una variable, @ X devuelve la dirección de X.
Si F es una rutina (función o procedimiento), @ F crea un puntero a F.
dim temp as word
ptr_b as ^byte
ptr_arr as ^byte[10]
arr as byte[10]
main:
ptr_b = @arr ' @ operator will return ^byte
temp = @arr ' @ operator will return ^byte
ptr_arr = @arr ' @ operator will return ^byte[10]
end.
Si la variable X es de tipo de matriz, el operador @ volverá puntero a su elemento de base primera,
excepto cuando el lado izquierdo de la instrucción en la que X se utiliza es un puntero de matriz. En este
caso, el operador @ volverá puntero a la matriz, no para el elemento de base primera.
Estructura de un programa en mikroBasic PRO para PIC:
1. Cada programa comienza normalmente con un comentario que proporciona información sobre el propósito del programa, la fecha de la escritura del programa, programador, la versión, los cambios realizados en relación con la versión previa, etc estos comentarios (cabecera) no son obligatorias, pero es una buena costumbre escribirlos y tenerlos en el programa.
2. El código de cada programa se inicia con una directiva del programa seguido por el nombre del programa.
3. Si el programa, aparte del módulo principal, contiene otros módulos, así, sus nombres deben ser especificados usando la directiva include (un include por cada módulo). En consecuencia, si el compilador, al compilar el módulo principal, llega a un objeto no declarado (función, variable, etc), primero tratar de encontrar su declaración dentro de los módulos declarados. Si no hay ninguna declaración al respecto se encuentra, el compilador informará de un error.
4. La directiva include (si hay alguna) es seguido por una porción de código de la intención de declarar las variables, constantes, procedimientos, subprogramas, funciones y otros objetos para ser usados más tarde en el programa.Estas declaraciones se utilizan para reservar memoria RAM para almacenar datos registra así como para indicar al compilador la forma de ejecutar alguna función o procedimiento. Por ejemplo, un dato de tipo byte, ocupa sólo un registro, mientras que una de datos de tipo flotador ocupa cuatro registros.
5. El programa principal se inicia con la principal: la Directiva (siempre seguido de dos puntos). También se le llama un "cuerpo del programa.
6. Cada programa termina con el final. Directiva (siempre seguido de un período).
2.3 COMPILADOR mikroBasic PRO PARA PIC
Todo lo que has leído hasta ahora acerca de la programación en Basic es sólo una teoría. Es útil saber,
por supuesto, pero no hay que olvidar que este lenguaje de programación no es mucho en relación con
algo concreto y tangible. Usted experimentará muchos problemas con los nombres exactos de los
registros, sus direcciones, nombres de los bits de control especiales y muchos otros cuando empieza a
escribir su primer programa en Basic. El punto es que se necesita más que una teoría para hacer que el
microcontrolador hacer algo útil.
Teniendo en cuenta un dicho «más vale prevenir que curar", tenemos que recordar todas las cosas que
deben se han establecido antes de comenzar a escribir un programa para el microcontrolador. En primer
lugar, usted necesita un programa instalado en su PC que entiende el lenguaje de programación que se
va a utilizar y que proporciona un entorno de trabajo adecuado para ello. No hay tal compilador sutable
para un solo tipo de microcontroladores ni para todos los microcontroladores. Se trata de software que se
utiliza para la programación de microcontroladores similares de un fabricante. Ya hemos introducido el
lenguaje mikroBasic que ha sido especialmente diseñado para la programación de microcontroladores
PIC. Ahora, cuando usted sabe lo suficiente sobre él, es el momento de presentar el software que se va a
utilizar para el desarrollo y edición de sus proyectos. Este software se llama el mikroBasic PRO para PIC
compilador. Es IDE (Integrated Development Environment) incluye todas las herramientas que necesita
para desarrollar sus proyectos (editor, compilador de depuración, etc)
Como su nombre lo indica, el PRO mikroBasic para PIC compilador está pensado para escribir programas
para microcontroladores PIC en el lenguaje Basic. Contiene información sobre la arquitectura de los
microcontroladores PIC (registros, sus direcciones exactas, módulos de memoria, el funcionamiento de
sus módulos, conjunto de instrucciones, etc pinout). Además, incluye herramientas específicas para la
programación de microcontroladores PIC. Por lo tanto, lo primero que tienes que hacer cuando se inicia el
compilador para seleccionar el chip y la frecuencia de funcionamiento de la lista. Este no es el final. Este
es el beginnig. Usted puede finalmente empezar a escribir el programa en Basic.
El proceso de creación y ejecución de un proyecto se puede dividir en varias partes:
1. Creación del proyecto (nombre del proyecto, la configuración del proyecto, las dependencias de archivos);
2. Edición del programa; 3. Compilación del programa y corrección de errores; 4. Depuración (ejecutar el programa paso a paso para asegurarse de que realiza las
operaciones que se pueden esperar); 5. Programación de microcontroladores (cargar el archivo. Hex genertaed por el compilador
en el microcontrolador utilizando el programador PICFlash).
INSTALACIÓN mikroBasic PRO PARA PIC
La instalación de mikroBasic PRO para PIC es similar a la instalación de cualquier otro programa de
Windows y todo el procedimiento se lleva a cabo a través de mago:
Sólo tienes que seguir las instrucciones y haga clic en Siguiente, Aceptar, Siguiente, Siguiente ... La
misma historia de siempre a excepción de la última opción "¿Desea instalar PICFlash V7.11
programador? '. ¿Te hace la pregunta ¿qué hacer? Como ustedes saben, el compilador traduce un
programa escrito en Basic en un código hexadecimal. El siguiente paso consiste en cargar el código en el
microcontrolador. Es por eso que necesita el programador PICFlash. Instalarlo!
Después de completar la instalación PICFlash, se le pedirá para la instalación de otro programa
similar. Se trata de un software para la programación de un especial de la familia de microcontroladores
PIC que funcionan en el modo de bajo consumo (3,3 V). Salta es ...
El último paso - la instalación del controlador!
Un controlador es un programa que permite al sistema operativo para comunicarse con un dispositivo
periférico. En nuestro caso, este dispositivo es el programador del hardware de su sistema de
desarrollo. Definitivamente, usted lo necesite. Haga clic en Sí.
Un tipo de controlador que desea instalar depende del sistema operativo en uso. En este caso, el PC se
ejecuta un sistema operativo de 32 bits de Windows XP. Seleccione el Win 2000, XP, 2003 32-bit carpeta
que contiene el controlador apropiado y puesta en marcha de su instalación.
Ahora estás a salvo, sólo sigue haciendo clic en Siguiente, Aceptar, Siguiente, Siguiente ...
IDE DE mikroBasic PRO PARA PIC
Esto es lo que aparece en la pantalla cuando se inicia mikroBasic PRO para PIC, por vez primera:
Por desgracia, una descripción detallada de todas las opciones disponibles en este IDE tomaría
demasiado tiempo, por lo que no vamos en el mismo. Vamos a describir solamente las características
más importantes de la mikroBasic PRO para PIC compilador, en su lugar.Por supuesto, siempre se puede
obtener más información pulsando el botón de Ayuda [F1]. Una explicación detallada sobre cómo crear un
nuevo proyecto y escribir un programa se da en varios ejemplos prácticos en el capítulo 4 de este libro.
JEFE DE PROYECTO
Un programa escrito en el PRO mikroBasic para PIC compilador no es un documento
independiente, sino una parte de un proyecto que también incluye el código hexadecimal, el
código ensamblador, y otros archivos. Algunos de ellos son creados durante el funcionamiento
del compilador, mientras que algunos son importados de otros programas. Sin embargo, la
ventana Project Manager le permite manejar todos los archivos del proyecto. Simplemente
haga clic derecho en cualquier carpeta y seleccione la opción que necesita para su proyecto.
Administrador de Biblioteca
Las librerías contienen un gran número de listas para utilizar las funciones y proporcionan una
gran cantidad de instalaciones al escribir programas para microcontroladores PIC. El
compilador debe conocer todas las dependencias de su archivo de origen mikroBasic con el fin
de compilar correctamente. Usted debe abrir la ventana del Administrador de bibliotecas y las
bibliotecas de verificación que desee utilizar en su programa. Cuando una biblioteca está
marcada, se agrega automáticamente al proyecto y vinculadas durante el proceso de
compilación. Por lo tanto, usted no tiene que incluir manualmente en los archivos de código
fuente utilizando la directiva # include. Por ejemplo, si el programa utiliza una pantalla LCD,
entonces no hay necesidad de escribir nuevas funciones, porque mediante la selección de la
Biblioteca de LCD que será capaz de utilizar listo para utilizar las funciones de LCD en su
programa. Si esta biblioteca no está seleccionado en el Administrador de bibliotecas, cada vez
que intenta utilizar cualquiera de sus funciones, el compilador informará de un error. Una
descripción de cada biblioteca está disponible haciendo clic derecho sobre su nombre y
seleccionando la opción de ayuda. Explorador de código
La ventana de explorador del código que permite localizar fácilmente los objetos (funciones,
constantes, procedimientos, etc) dentro de los programas largos. Por ejemplo, si usted busca
una función que se utiliza en el programa, simplemente haga doble clic en su nombre en esta
ventana, y el cursor se coloca automáticamente en la línea apropiada en el programa. Configuración del proyecto
Al compilar un proyecto, el compilador genera archivos a cargar en el microcontrolador. Estos
archivos será diferente dependiendo del tipo del microcontrolador y el propósito de la
compilación.Por lo tanto, a fin de que el compilador pueda funcionar correctamente, es
necesario establecer algunos parámetros del proyecto en la ventana Configuración del
proyecto:
Dispositivo: La selección del microcontrolador a utilizar permite que el compilador para
recuperar el archivo de definición de asociada. El archivo de definición de un microcontrolador
contienen información específica sobre sus registros SFR, sus direcciones de memoria y
algunas variables específicas para que el microcontrolador. Es todo obligatoria para la creación
de una compatible. Hexagonal archivo.
Oscilador: Esta opción se utiliza para especificar la velocidad de funcionamiento del
microcontrolador. Por supuesto, este valor depende del oscilador en uso. Se recupera por el
compilador para compilar las rutinas que requieren información en tiempo (Delay_ms function ()
por ejemplo). Posteriormente, esta información también será utilizada por el programador. La
velocidad de funcionamiento se ajusta a fin de permitir oscilador interno del microcontrolador
para funcionar a la frecuencia seleccionada.
Construir / Tipo de depurador: Todo el proceso se llama compilación incluye la construcción y analizar,
compilar, enlazar y la generación de archivos hexagonales. El tipo de construcción le permite configurar el
modo de construcción. Dependiendo de la elección del modo, el archivo generado para ser cargado en el
microcontrolador será diferente.
Tipo de generación - la liberación: El programa que se cargará en el microcontrolador no contendrá
ninguna información complementaria para ser depurado más tarde. Después de completar el proceso de
compilación, el compilador no tiene más influencia en la ejecución del programa.
Tipo de generación - de depuración ICD: Parte de la información se agrega a la hex con el fin de
permitirle llevar a cabo la depuración de hardware.. Cuando el proceso de compilación se ha completado
y el microcontrolador programado está, el compilador permanece conectada al microcontrolador y todavía
puede afectar su funcionamiento. Una herramienta llamada mikroICD (depurador en circuito) permite que
el programa a ser ejecutado paso a paso y proporciona un acceso al contenido actual de todos los
registros del microcontrolador.
A los efectos de la depuración, un simulador de software se puede utilizar en ambos modos de tipo de
generación. Se le permite simular el programa mediante la reproducción de la conducta
microcontrolador. El simulador no utiliza dispositivos reales para su funcionamiento, de modo que algunas
operaciones no pueden ser reproducidas (interrumpir, por ejemplo). Sin embargo, es más rápido para
depurar un programa mediante el uso de simulador y no requiere ningún dispositivo taget.
Tenga en cuenta que alguna de estas opciones pueden ser modificadas en cualquier momento durante la
edición del programa. No te olvides de volver a construir y volver a programar el dispositivo después de
modificar cualquiera de esas opciones.
EDICIÓN y compilar programas Editor de código
Editor de código es una parte central de la ventana del compilador usado para escribir y editar
programas. Un gran número de opciones que se utilizan para establecer sus funciones y el diseño se
pueden encontrar en las herramientas y el menú Opciones [F12]. Cuando se escribe un programa, no se
olvide de los comentarios. Los comentarios son muy importantes para el programa de depuración y
actualización. Por otra parte, aunque el compilador no tiene restricción de formato, siempre debe seguir
las reglas de edición mismos (como en los ejemplos proporcionados en este libro). Como no hay límite de
longitud de línea, no dude en utilizar los espacios en blanco con el fin de hacer que su código sea más
legible.
Cuando se escribe un programa, recopilar con regularidad a fin de corregir errores de sintaxis que viene
usted. También puede compilar su programa cada vez que la redacción de una nueva función se ha
completado y probar su comportamiento mediante el modo de depuración. De esta manera, es mucho
más fácil de corregir los errores de compilación. De lo contrario, se verá obligado a modificar el programa.
COMPILACIÓN y corrección de errores
Para compilar el código, sólo tienes que hacer clic en la opción Generar en el menú Proyecto. De hecho,
todo el proyecto se compila y, en caso de que la compilación es exitosa, los archivos de salida se generan
(asm,. Hexagonal, etc.) Una compilación es exitosa si no hay error se encontró. La compilación genera
muchos mensajes que se muestran en la ventana de mensajes. Estos mensajes consisten en la
información, advertencias y errores. Cada error encontrado está asociado con su línea de programa y la
descripción. Como un error en su código puede generar muchos otros errores, siempre se debe tratar de
corregir el error por primera vez en la lista y luego volver a compilar el programa. En otras palabras, es
aconsejable para corregir los errores de uno por uno.
En el ejemplo anterior, el programa informa de un error de sintaxis en la línea 80a. La compilación le
permite corregir su programa mediante la fijación de todos los errores mikroBasic. Cuando todos los
errores son fijos, el programa está listo para ser descargado en el microcontrolador. Sin embargo, su
trabajo no ha terminado todavía, porque todavía no sabe si su programa se comporta como se espera o
no.
Depuración del programa
Como pudimos ver anteriormente, hay dos modos de depuración: un depurador de software que simula
las acciones del microcontrolador (modo predeterminado) y un depurador de hardware (mikroICD), que
lee directamente el contenido de la memoria del microcontrolador. Sea cual sea el modo que elija, el
proceso de depuración es el mismo. En el caso de que usted elija CIE depuración asegúrese de cargar el
programa en el microcontrolador. La depuración es un paso muy importante, ya que le permite probar el
programa después de una compilación exitosa, o para corregir errores descubiertos en un programa en
ejecución.
Para iniciar el depurador, haga clic en la opción de depurador de inicio en el menú Ejecutar. El editor de
código de forma automática será ligeramente modificado y una ventana llamada Valores Mira
aparecerá. El principio de depuración se basa en el funcionamiento de un programa paso a paso y
siguiendo la evolución del contenido de los registros y valores variables. De esta manera, usted será
capaz de verificar el cálculo y para ver si algo inesperado ha ocurrido. Al ejecutar el programa paso a
paso, usted será capaz de localizar fácilmente dónde ocurren los problemas. Como la depuración puede
conducir a la modificación del programa, siempre se debe volver a compilar el programa después de cada
corrección y reiniciar el depurador con el fin de verificar lo que han cambiado.
Software del simulador
Si usted desea ser un programador y dedícate a microcontroladores de programación, entonces usted
tiene que acostumbrarse al hecho de que los programas casi nunca funcionan al primer intento o empezar
a utilizar un simulador. El simulador es una parte integral del compilador usado para simular el
funcionamiento del microcontrolador.
Antes de la puesta en marcha del simulador, seleccione el modo de funcionamiento en la
ventana Configuración del proyecto (tipo de construcción - la liberación), compilar el programa
y haga clic en la opción Run / Start del depurador.
El compilador se ajusta automáticamente al modo de simulación. Como tal, se vigila el estado
de todos los bits del registro y le permite ejecutar el programa paso a paso mientras se controla
el funcionamiento del microcontrolador en la pantalla.
Unos cuantos iconos, utilizados exclusivamente para el funcionamiento de este simulador,
aparecerá en la barra de herramientas cuando el compilador está configurado en este modo.
Estos iconos tienen los siguientes significados:
Paso a paso: Ejecutar el programa de línea actual, y luego se detiene. Si la línea de programa ejecutado llama a una subrutina, el depurador se mete en la subrutina y se detiene después de ejecutar la primera instrucción dentro de ella.
Paso a paso: Ejecutar el programa de línea actual, y luego se detiene. Si la línea de programa ejecutado llama a una subrutina, el depurador no entrar en ella. El subprograma se ejecutará todo y se detiene el depurador a la primera instrucción después de la llamada. Parece que una línea de programa se omite aunque toda la subrutina se ejecuta.Como resultado, el estado de los registros se cambia. Este comando se utiliza normalmente cuando es necesario para acelerar la ejecución de bucles de programa de largo.
Ejecutar hasta el cursor: Ejecutar todas las líneas del programa hasta la posición del cursor se alcanza.
Al salir: Ejecutar todas las líneas del programa restantes dentro de la rutina. El depurador se detiene inmediatamente después de salir de la subrutina.
Los puntos de interrupción que el proceso de depuración de los programas más eficientes, lo que le
permite detener la ejecución del programa en alguna línea específica. Esto es muy útil ya que será capaz
de ver sólo las partes críticas del programa, no pierden su tiempo poniendo a prueba la línea de todo el
programa por línea. Para agregar o quitar un punto de interrupción sólo tienes que hacer clic en el lado
izquierdo de su editor de código en la línea correspondiente o presione [F5]. Una pequeña ventana
llamada puntos de interrupción que indica dónde se encuentran los puntos de interrupción. Tenga en
cuenta que las líneas marcadas por los puntos de interrupción se destacan en rojo.
La línea que se está ejecutando actualmente está resaltada en azul. Usted puede leer el contenido de los
registros y las variables que ha seleccionado en Valores ver en cualquier momento. Si desea ir
directamente a los puntos de interrupción, utilice el comando Ejecutar del depurador / Pausa.
Ventana Inspección VALORES
Los depuradores de software y hardware tienen la misma función para controlar el estado de
los registros durante la ejecución del programa. La diferencia es que el depurador software
simula la ejecución del programa en un PC, mientras que el depurador ICD utiliza el
microcontrolador. Cualquier cambio de un estado lógico pin se refleja en el registro
correspondiente (puerto). Como la ventana Inspección Valores le permite supervisar el estado
de todos los registros, es fácil comprobar si un alfiler se activa o se desactiva. Las últimas
modificaciones aparece en rojo en esta ventana.Esto le permite localizar fácilmente las
modificaciones en el archivo de lista durante la depuración. Seleccione Vista / Windows y haga
clic en la opción Ver valores para activar esta ventana. Usted puede hacer una lista de los
registros y variables del estado de los que desea monitorear.
CRONÓMETRO
Si desea saber el tiempo que tarda el microcontrolador para ejecutar una parte del programa,
seleccione Ejecutar / Ver opción de Cronómetro. Una ventana, como se muestra en la figura a
la derecha, aparecerá. ¿Sabe usted cómo funciona el cronómetro? Bueno, es tan simple como
eso. Los tiempos (momento en que el programa se ha iniciado, el tiempo de la ejecución del
último paso, etc) se mide automáticamente para cada acción de la depuración (paso en, pasar
por encima, ejecute / pausa, etc) y se muestran en la ventana del cronómetro.
Depurador en circuito
Otra forma de comprobar la ejecución de un programa es mediante el uso de mikroICD debugger
(depurador en circuito). El mikroICD es una parte integral del programador PICFlash. Se utiliza para
probar y depurar programas. El proceso de pruebas y la depuración se realiza mediante el seguimiento
del estado de todos los registros dentro del microcontrolador que opera en tiempo real. Con el fin de
habilitar la depuración, es necesario seleccionar las opciones de tipo de generación-ICD de depuración y
depuración-mikroICD antes de que el programa está cargado en el microcontrolador. Tan pronto como el
depurador mikroICD se inicia, una ventana, como se muestra en la figura a continuación, aparece. El
depurador mikroICD se comunica con el PIC a través de sus pines utilizados para la programación. Por lo
tanto, estos pernos no pueden ser utilizados como pines de E / S, mientras que el proceso de depuración
está en curso. Durante la operación depurador mikroICD, programador y el ordenador tiene que estar
conectado mediante un cable USB.
mikroICD depurador opciones:
Iniciar depurador [F9]
Ejecutar / Pausa depurador [F6]
Detener depuración [Ctrl + F2]
Paso a paso [F7]
Paso a paso [F8]
Step Out [Ctrl + F8]
Alternar punto de interrupción [F5]
Mostrar / Ocultar puntos de interrupción [Shift + F4]
Borrar puntos de interrupción [Ctrl + Shift + F4]
Cada uno de estos comandos se activa a través de atajos de teclado o haciendo clic en el icono apropiado en la ventana
Inspección Valores.
El depurador mikroICD también ofrece opciones tales como ejecutar un programa paso a paso (paso a
paso), haciendo una pausa la ejecución del programa para examinar el estado de los registros
actualmente activos con puntos de interrupción, el seguimiento de los valores de algunas variables, etc El
siguiente ejemplo ilustra un paso a intensificar la ejecución del programa utilizando el comando Paso a
paso.
Paso 1:
En este ejemplo la línea de programa 31a está resaltada en azul, lo que significa que se
ejecutará a continuación. El estado actual de todos los registros de la microontroller se pueden
ver en el reloj mikroICD ventana de Valores. Paso 2:
Después de que el Paso a paso por el comando [F8] se ejecuta, el microcontrolador se
ejecutará la línea de programa 31. La primera línea la próxima (32 ª) para ser ejecutado se
resalta en azul. El estado de los registros que se cambian durante la ejecución de esta
instrucción puede ser visto ahora en la ventana Inspección Valores.
Carga del programa en el microcontrolador
Si usted ha solucionado todos los errores en el código y cree que el programa está listo para su uso,
entonces usted debe cargar en el microcontrolador. Utilizar el programador PICFlash para este
propósito. PICFlash es una herramienta diseñada para programar todo tipo de microcontroladores PIC. Se
compone de dos partes:
La parte de hardware almacena un archivo hexadecimal (el programa que se carga) y los programas del microcontrolador con niveles específicos de tensión. Durante el proceso de programación, un nuevo programa está escrito en la memoria flash del microcontrolador. El programa anterior se borrarán automáticamente de la memoria flash.
La parte del software es el encargado de enviar el programa (. Hex) para la parte de hardware del programador sobre un cable USB. Se activa pulsando mE_Programmer en el menú Herramientas, o pulsando la tecla [F11]. Como resultado, puede modificar algunos parámetros de programación y también controlar el funcionamiento del hardware del programador (de carga, escribir, verificar ...).
Tenga en cuenta que puede volver a programar el microcontrolador tantas veces como desee.
HERRAMIENTAS compilador
Este compilador proporciona herramientas especiales que simplifican considerablemente el proceso de
escritura del programa. Todas estas herramientas están disponibles en el menú Herramientas. Aquí está
una breve descripción de todos ellos.
TERMINAL USART
El terminal USART es un reemplazo para el estándar de Windows Terminal Server Hyper. Se
puede utilizar para comprobar el funcionamiento del microcontrolador que utiliza la
comunicación USART. Estos microcontroladores están integrados en el dispositivo de destino y
se conecta al conector RS-232 de la PC mediante un cable serie. La ventana de terminal
USART contiene opciones para configurar la comunicación serie y mostrar los datos enviados /
recibidos. EEPROM EDITOR
Al seleccionar la opción Editor de EEPROM desde el menú Herramientas, una ventana, como
se muestra en la figura a continuación, aparecerá.Aquí se puede ver cómo la memoria
EEPROM del microcontrolador parece. Si desea cambiar su contenido después de cargar el
programa en el microcontrolador esta es la forma correcta de hacerlo. Si un nuevo contenido es
un dato de tipo específico (char, int o double), entonces usted debe seleccionar, introduzca el
valor en el campo Valor de edición y haga clic en Editar. A continuación, haga clic en el botón
Guardar para guardarlo como un documento con la extensión. Hexagonal. Si el uso de
EEPROM en la opción Proyecto está activo, los datos se cargarán automáticamente en el
microcontrolador durante el proceso de programación. TABLA ASCII
Si usted necesita la representación numérica de cualquier carácter ASCII, sólo tienes que seleccionar la
opción de tabla ASCII en el menú Herramientas y la mesa, como se muestra en la figura a continuación,
aparecerá.
Usted probablemente sabe que todas las teclas de su teclado está asociado con un código (ASCII). Los
números tienen equivalentes extraños. Por esta razón, la instrucción de programa para visualizar el
número 7 en un LCD no se muestran, pero el equivalente de la instrucción BEL. Si envía el mismo
número que un personaje, obtendrá el resultado esperado - el número 7. En consecuencia, si desea
mostrar un número sin antes convertirlo en el personaje adecuado, entonces es necesario añadir el
número 48 a cada dígito del número que se muestra se compone de.
SIETE SEGMENTOS DEL EDITOR
Un editor de siete segmentos le permite encontrar fácilmente a qué número hay que fijarse en un puerto
de salida con el fin de mostrar un símbolo que desea. Por supuesto, no hace falta decir que los pines del
puerto debe estar conectado correctamente para mostrar los segmentos. Sólo tienes que colocar el cursor
en cualquier segmento de la pantalla y haga clic en él. El número que usted debe entrar en el programa
aparecerá de inmediato. Eso es todo.
LCD de caracteres personalizados
Además de los caracteres estándar, la pantalla LCD también puede mostrar los caracteres creados por el
programador. Al seleccionar la herramienta de LCD de caracteres personalizados usted se librará de
tedioso trabajo de la escritura de funciones para el envío de código correspondiente a una pantalla. Basta
con crear un símbolo, haga clic en pequeños cuadrados en la ventana del LCD del carácter
personalizado, seleccione la posición y la fila y haga clic en el botón Generar. El código correspondiente
aparece en otra ventana. No hay clics no son suficientes. Copiar al Portapapeles - Pegar ...
GRÁFICO LCD GENERADOR de mapa de bits
Esta es otra herramienta necesaria en caso de que el microcontrolador que está escribiendo programas
para usos pantalla LCD gráfica (GLCD). Esta herramienta le permite visualizar cualquier mapa de bits con
facilidad. Con el fin de tomar ventaja de ello, seleccione Herramientas / Editor de mapa de bits GLCD y
aparece la ventana correspondiente. Seleccione el tipo de visualización que se utilizará y cargar un mapa
de bits. El mapa de bits debe ser monocromático y en la resolución especificada (128 x 64 píxeles en este
caso).Además procedimiento es el mismo que en el ejemplo anterior. Copiar al portapapeles ...
Cada código generado el uso de herramientas para el control de LCD y GLCD contiene funciones de la
biblioteca Lcd. Si usted los utiliza en el programa, no se olvide de marcar la casilla junto a esta biblioteca
en la ventana del Administrador de la Biblioteca a fin de que el compilador para reconocer estas funciones
correctamente.
BIBLIOTECAS
Una de las características más útiles de la mikroBasic PRO para PIC compilador es el
Administrador de la Biblioteca y sin duda merece nuestra atención.
Si necesita una función o un procedimiento para realizar determinada tarea, mientras que
escribir un programa, sólo hay que encontrarlo en una de las bibliotecas incluidas en el
compilador y lo utilizan. Una biblioteca es en realidad un archivo llamado cabecera. Contiene
un conjunto de variables y funciones escritas en mikroBasic. Cada biblioteca tiene un propósito
específico. Por ejemplo, si usted necesita un procedimiento para generar una señal de audio en
algunos pines, abra la biblioteca de sonido en la ventana Library Manager y haga doble clic en
el sound_play procedimiento adecuado. Una descripción detallada de este procedimiento
aparece en la pantalla. Copia este archivo en su programa y establecer los parámetros
adecuados. Si esta biblioteca está marcada, sus funciones serán recuperados durante el
proceso de compilación y no será necesario el uso de la directiva include.
El PRO mikroBasic para PIC incluye librerías específicas diversas y hardware. BIBLIOTECAS DIVERSOS
Diversas bibliotecas contienen algunas de las funciones de propósito general:
B I B L I O T E C A D E S C R I P C I Ó N
Botón de la Biblioteca
Función elimina la influencia de botón de contacto parpadeo
Conversiones de Biblioteca
Rutinas de biblioteca para los números a cadenas y BCD / conversiones decimales
C de la biblioteca Funciones de biblioteca para analizar y mapear caracteres
Cadena de la Biblioteca
Biblioteca, que automatiza las tareas relacionadas con cadena
Biblioteca de tiempo
de
Biblioteca de rutinas de tiempo de uso de cálculos de tiempo en
formato de tiempo UNIX
Trigon Biblioteca Funciones de biblioteca para la manipulación aritmética de punto
flotante
Hardware específicos BIBLIOTECAS
Bibliotecas de hardware específicos incluyen funciones usadas para controlar el funcionamiento de los
módulos de hardware:
B I B L I O T E C A D E S C R I P C I Ó N
ADC Biblioteca Se utiliza para una operación de convertidor A / D
CAN Biblioteca Se utiliza para el funcionamiento con módulo CAN
CANSPI Biblioteca Se utiliza para el funcionamiento con el módulo CAN externo
(MCP2515 o MCP2510)
Compacto Biblioteca de Flash
Se utiliza para la operación con tarjetas Compact Flash de memoria
EEPROM Biblioteca Se utiliza para la operación con una función de memoria
EEPROM
Ethernet PIC18FxxJ60 Biblioteca
Se utiliza para la operación con el incorporado en el módulo Ethernet
Biblioteca de memoria flash
Se utiliza para la operación con una función de memoria Flash
Pantalla gráfica LCD
Biblioteca
Se utiliza para la operación con el gráfico del módulo LCD con
una resolución de 128x64
I ² C Library Se utiliza para la operación con una función de módulo de
comunicación serial I2C
Teclado Biblioteca Se utiliza para la operación con el teclado (botones pulsadores
4x4)
Lcd Biblioteca Se utiliza para la operación con pantalla LCD (2x16 caracteres)
Manchester Code Library Se utiliza para la comunicación mediante el código Manchester
Multi Media Card biblioteca
Se utiliza para la operación con multimedia MMC tarjetas de memoria flash
OneWire Biblioteca Se utiliza para la operación con circuitos utilizando un cable de
comunicación serie
Expansión del puerto de la
Biblioteca Se utiliza para la operación con el expansor de puerto MCP23S17
PS / 2 Biblioteca Se utiliza para la operación con el teclado PS / 2 estándar
PWM Biblioteca Se utiliza para la operación con una función de módulo PWM
RS-485 Biblioteca Se utiliza para el funcionamiento con módulos que utilizan la
comunicación serie RS485
Software I ² C Library Se utiliza para el software de simulación de I2C
Software SPI Library Se utiliza para la simulación de software de SPI
Software UART Library Se utiliza para el software de simulación UART
Biblioteca de sonidos Se utiliza para la generación de señales de audio
SPI Biblioteca Se utiliza para la operación con una función de módulo SPI
SPI Ethernet Library Se utiliza para la comunicación SPI con el módulo Ethernet
(ENC28J60)
SPI LCD gráfico Biblioteca Se utiliza para 4-bit SPI comunicación con pantalla LCD gráfica
SPI LCD Biblioteca Se utiliza para 4-bit comunicación SPI con pantalla LCD (2x16
caracteres)
SPI LCD8 Biblioteca Se utiliza para 8-bit comunicación SPI con pantalla LCD
SPI T6963C LCD gráfico Biblioteca
Se utiliza para la comunicación SPI con el gráfico de la pantalla LCD
UART Biblioteca Se utiliza para la operación con una función de módulo UART
USB HID biblioteca Se utiliza para la operación con una función de módulo USB
Capítulo 3: PIC16F887 Microcontrolador
El PIC16F887 es un producto de Microchip ®.
Cuenta con todos los módulos que los microcontroladores
modernos normalmente tienen.Por su bajo precio, amplia gama de aplicaciones, de alta calidad y fácil
acceso, es una solución ideal en aplicaciones como el control de diferentes procesos en la industria, la
medición de diferentes valores, etc Una lista a continuación incluye solamente algunos de sus principales
características.
3.1 LAS FUNCIONES BÁSICAS PIC16F887
3.2 SFRS FUNDAMENTALES
3.3 Entrada / Salida
3,4 TIMER0
3,5 TIMER1
3,6 Timer2
3.7 módulos CCP
3.8 MÓDULOS DE COMUNICACIÓN DE SERIE
3.9 Módulos analógicos
3,10 reloj oscilador
3,11 memoria EEPROM
3.12 REINICIAR! NEGRO-OUT, Brown-out o ruidos?
3.1 LAS FUNCIONES BÁSICAS PIC16F887
Arquitectura RISC
o A tan sólo 35 instrucciones para aprender
o Un ciclo en todas las instrucciones de una sola, excepto las ramas
Frecuencia de trabajo 0-20 MHz
Oscilador interno de precisión
o Calibrado de fábrica
o Software gama de frecuencias seleccionable de 8 MHz a 31kHz
Voltaje de alimentación 2.0-5.5V
o Consumo: 220uA (2,0 V, 4 MHz), 11uA (2,0 V, 32 kHz) 50nA (modo stand-by)
En ahorro de energía Modo de espera
Brown-out Reset (BOR) con la opción de software de control
35 de entrada / salida de pines
o Fuente de alta corriente / sumidero de accionamiento directo de LED
o software y resistencia de pull-up programable de forma individual
o Interrupción-on-Cambiar el PIN
La memoria ROM de 8K en tecnología flash
o Chip puede ser reprogramado hasta 100.000 veces
In-Circuit Serial Programming Opción
o Chip se puede programar incluso incorporado en el dispositivo de destino
256 bytes de memoria EEPROM
o Los datos se pueden escribir más de 1.000.000 veces
368 bytes de memoria RAM
Convertidor A / D:
o 14 canales
o 10-bits de resolución
3 temporizadores independientes y contadores
Watch-dog temporizador
Módulo comparador analógico con
o Dos comparadores analógicos
o Tensión de referencia fija (0,6 V)
o Programable en el chip de voltaje de referencia
Salida PWM de control de dirección
Mejorado el módulo USART
o Compatible con RS-485, RS-232 y LIN2.0
o Auto-detección de baudios
Maestro en serie síncrona Puerto (MSSP)
o soportes SPI y modo I2C
DESCRIPCIÓN Pinout
La mayoría de los pines del microcontrolador PIC16F887 son multi-funcionales. Por ejemplo, el pasador
de la quinta parte del microcontrolador está marcado como RA3/AN3/Vref + / + C1IN lo que indica que
tiene las funciones siguientes:
RA3 del puerto PORTA tercera entrada / salida digital
AN3 tercera entrada analógica
Vref + tensión de referencia positiva
C1IN comparador C1 + entrada positiva
Este principio de la multifuncionalidad se aplica comúnmente en el diseño de los microcontroladores, ya
que permite el paquete microcontrolador a ser mucho más compacta y no afecte al funcionamiento del
microcontrolador. Varias funciones pasador no puede ser utilizado simultáneamente, pero se puede
cambiar en cualquier momento durante el funcionamiento.
En las siguientes tablas se refieren a la DIP40 PIC16F887 microcontrolador.
Unidad de procesamiento central (CPU)
Como cualquier intento de explicar el funcionamiento de la CPU en detalle nos llevaría demasiado lejos,
no vamos a hacerlo en esta etapa. De todos modos, es importante señalar que la CPU se fabrica en la
tecnología RISC como este hecho puede ser crucial cuando se decide que microcontrolador a utilizar.
RISC significa Reduced Instruction Set Computer, que da a los PIC16F877 dos grandes ventajas:
La CPU es capaz de reconocer y ejecutar solamente 35 instrucciones simples. Por cierto, para programar otros microcontroladores en lenguaje ensamblador, es necesario conocer más de 200 instrucciones de memoria.
El tiempo de ejecución es el mismo para casi todas las instrucciones, y dura 4 ciclos de reloj. La frecuencia de reloj es estabilizado por un cristal de cuarzo. Las excepciones a la regla son las instrucciones de salto y sucursales el tiempo de ejecución de los cuales es de 2 ciclos de reloj. Esto significa que si la frecuencia de operación del microcontrolador es 20 MHz, el tiempo de ejecución de cada instrucción será 200ns, es decir, el programa se ejecutará 5 millones de instrucciones por segundo!
MEMORIA
El PIC16F887 dispone de tres tipos de memoria: ROM, RAM y EEPROM. Cada uno merece ser discutido
por separado aquí, debido a sus funciones específicas, funciones y organización.
ROM
ROM se utiliza para guardar de forma permanente el programa que se ejecuta actualmente. Es por esto
que a menudo se llama una "memoria de programa". El PIC16F887 tiene 8Kb de ROM (8192 localidades
en total). Desde ROM está fabricada con tecnología FLASH, su contenido puede ser cambiado fácilmente,
proporcionando una tensión de programación especial (13V).
No se requieren más explicaciones, como todo el proceso se realiza automáticamente por medio de un
programa especial instalado en el PC y un dispositivo electrónico simple llamada el programador.
EEPROM
Al igual que en la memoria del programa, el contenido de la EEPROM se guardan de forma permanente,
incluso cuando se desconecta la alimentación. Por otro lado, a diferencia de ROM, el contenido de la
EEPROM se puede cambiar durante la operación de microcontrolador. Esta es la razón de esta memoria
(que contiene 256 lugares) es perfecto como un dispositivo de almacenamiento permanente de algunos
de los resultados creados y utilizados durante la operación.
RAM
Este es el tercer y el tipo más complejo de todos los módulos de memoria del microcontrolador. Se
compone de dos partes: registros de propósito general y funciones especiales (SFR registros). Todos
ellos están divididos en cuatro bancos de memoria que se explica más adelante en este capítulo.
Aunque ambos grupos de registros se borran cuando se va la luz y ambos se fabrican en el mismo y
actuar de una manera similar, no tienen muchas cosas en común cuando se trata de sus funciones.
Registros de propósito general
Registros de propósito general se utilizan para almacenar datos temporales y los resultados creados
durante la operación. Por ejemplo, si el propósito del programa es contar algo (productos de la línea de
montaje, por ejemplo), es necesario contar con un registro que representa lo que en la vida cotidiana se
llama "suma". Dado que el microcontrolador no es creativo en absoluto, es necesario especificar la
dirección exacta de algunas registro de propósito general y asignarle esa función. Asegurarse de que el
valor de este registro se incrementa en 1 después de cada producto pasa a través de un sensor. Así es
como un simple programa se ha creado.
"En esta sección del programa, la variable de registro
almacenado en suma se incrementa cada
"Tiempo de la RB0 pin de entrada es excitada alta (1)
...
if PORTB.0 = 1 ' Check whether the RB0 pin is driven high
sum = sum + 1 ' If true, the variable value is incremented by
1
end if ' If false, the program exits the if statement
...
El microcontrolador es capaz de ejecutar este programa, ya que sabe cuál es la cantidad que se
incrementa es y dónde se almacena. De manera similar, cada variable de programa debe ser preasignado
algunos de los registros de propósito general.
REGISTROS DE FUNCIONES ESPECIALES (SFRS)
Especial-función registra también ocupan lugares de memoria RAM, pero a diferencia de registros de
propósito general, su función está predeterminada durante el proceso de fabricación y no se puede
cambiar más adelante. Desde sus bits están conectados a unos módulos en el chip, tales como un
convertidor A / D, el módulo de comunicaciones en serie, etc, cualquier cambio de su contenido afectará
directamente a la operación del microcontrolador o al menos algunos de sus módulos. Por ejemplo, el
registro ADCON0 controla el funcionamiento del convertidor A / D. Al cambiar sus bits se determina que
pin del puerto es que se configura como una entrada del convertidor, el tiempo de inicio y la velocidad de
conversión. Además, cada registro SFR tiene su propio nombre (ambos registros y sus bits), lo que
simplifica considerablemente el proceso de escritura del programa. Como lenguajes de alto nivel de
programación contiene una lista de todos los registros SFR con sus direcciones exactas, es suficiente
para especificar el nombre de un registro con el fin de leer o modificar su contenido.
Otra característica de estos lugares de memoria es que tienen sus nombres (ambos registros y sus bits),
lo que simplifica considerablemente el proceso de escribir un programa. Como lenguajes de alto nivel de
programación puede utilizar la lista de todos los registros con sus direcciones exactas, basta con
especificar el nombre de un registro con el fin de leer o modificar su contenido.
"En esta sección del programa, registra TRISC y PORTC se cambian
...
TRISC = 0x00 ' a logic zero (0) is written to register
TRISC (all port
' PORTC pins are configured as outputs)
PORTC = %01100011 ' Logic states on all port PORTC pins are
being changed
...
RAM BANCOS
La memoria RAM se divide en cuatro bancos. Antes de acceder a cualquier registro durante la escritura
del programa (ya sea para leer o modificar su contenido), es necesario seleccionar el banco que lo
contiene. Dos bits del registro de estado se utilizan para la selección de banco, que se discutirá más
adelante. Para hacer frente a SFR tan simples como sea posible, los registros más utilizados tienen la
misma dirección en todos los bancos y por lo tanto puede ser de fácil acceso.
Puede ser difícil de tratar con los bancos cuando se escribe un programa en lenguaje ensamblador. Por el
contrario, cuando se escribe un programa en lenguajes de programación más altos, tales como Basic, y
los compiladores de uso, tales como mikroBasic PRO para PIC, basta con especificar el nombre de un
Ayer re que usted necesita. Contar con esta información, el compilador es capaz de seleccionar el banco
adecuado, así como para incluir instrucciones apropiadas en el código durante el proceso de
compilación. Usted ha estado utilizando el lenguaje ensamblador sólo en la medida y esta es la primera
vez que utilice el PRO mikroBasic para PIC compilador, ¿no? Esto debe ser una maravillosa noticia a
continuación.
STACK
Una parte de memoria RAM utilizada como pila consta de ocho 13-bits registros. Antes de que el
microcontrolador comienza a ejecutar una subrutina (instrucción GOSUB) o cuando se produce una
interrupción, la dirección de la instrucción a ejecutar siguiente se inserta en la pila, es decir, una de sus
registros. Como resultado, el microcontrolador sabe desde donde continuar la ejecución del programa
regular cuando una subrutina o una interrupción de ejecución es completa. La dirección se borra después
de la vuelta al programa y un nivel de la pila es, pues, automáticamente disponible para su uso posterior.
Nótese que los datos siempre circularmente inserta en la pila. Esto significa que después de que la pila se
ha llevado ocho veces, el empuje noveno sobrescribe el valor que se almacena con el primer impulso. El
impulso décimo sobrescribe el empuje segundo y así sucesivamente. Los datos sobrescritos de esta
manera no es recuperable. Dado que el programador no puede acceder a estos registros para escribir o
leer y no hay ningún bit para indicar desbordamiento de pila o condición de desbordamiento, es necesario
prestar especial atención a que durante la escritura del programa.
Vamos a hacerlo en mikroBasic ...
"Al entrar en una sección de código en ensamblador inserta en el
programa, el compilador
'Almacena los datos en el banco RAM actualmente activo. Esto
significa que en este programa
"La sección, la selección del banco depende de las SFR en uso.
Después del retorno al programa
'Sección escrita en mikroBasic, los bits de control seleccionar el
banco activo
(RP0 y RP1) debe devolver el estado que tenían antes del código de
la asamblea
saveBank = STATUS and %01100000 ' Save the state of bits RP0
and RP1
' (bits 5 and 6 of the STATUS register)
asm ' Start of assembly sequence
...
... ' Assembly code
...
end asm ' End of assembly sequence
STATUS = STATUS and %10011111 ' Bits RP0 and RP1 return their
original state
STATUS = STATUS or saveBank
...
...
Interrupción del sistema
Lo primero que debe hacerse por el microcontrolador, cuando llega una solicitud de interrupción, es la
ejecución de la instrucción en curso, a continuación, para detener la ejecución del programa regular. La
dirección del programa actual de la memoria automáticamente se inserta en la pila y la dirección por
defecto (predefinidos por el fabricante) se escribe en el contador de programa. El lugar desde donde el
programa continúa con la ejecución se llama un vector de interrupción. Para el microcontrolador
PIC16F887, la dirección es 0004h. Como se ve en la siguiente figura, el vector de interrupción se debe
omitir durante la ejecución del programa regular.
Una parte del programa que se ejecuta cuando una petición de interrupción llega se llama una rutina de
interrupción (que es una subrutina de hecho). La primera instrucción de la rutina de interrupción se
encuentra en el vector de interrupción. ¿Cuánto tiempo se tarda en ejecutar la subrutina y lo que será,
depende de las habilidades del programador, así como en la fuente de interrupción en sí. Algunos
microcontroladores tienen un par de vectores de interrupción (cada solicitud de interrupción tiene su
vector), mientras que esto sólo tiene un microcontrolador. Esta es la razón por la primera parte de cada
rutina de interrupción debe ser la detección de fuente de interrupción.Cuando la fuente de interrupción se
conoce y se ejecuta la rutina de interrupción, el microcontrolador alcanza la RETFIE instrucción, aparece
la dirección de la pila y permite continuar con la ejecución del programa desde donde lo dejó.
MikroBasic reconoce una rutina de interrupción para ser ejecutado por medio de la palabra de
interrupción. La rutina de interrupción debe ser escrito por el usuario.
sub procedure interrupt ' Interrupt routine
cnt = cnt + 1 ; ' Interrupt causes variable cnt to be
incremented by 1
end sub
Cómo utilizar SFR
Si usted ha comprado el microcontrolador y tiene una gran idea de cómo hacer uso de ella ... Hay una
larga lista de SFR y sus bits. Cada uno de ellos controla un proceso dentro del
microcontrolador. Realmente se parece a una tabla de control grande con un montón de instrumentos e
interruptores. Ahora usted está preocupado acerca de si será capaz de aprender a usar a todos
ellos? Probablemente no, pero no se preocupe porque usted no tiene que hacerlo. Unos dispositivos muy
potentes, tales como microcontroladores son similares a los supermercados: ofrecen muchas cosas a
precios bajos y es hasta que usted pueda elegir lo que usted necesita. Por lo tanto, elegir la zona que más
le interesa y aprender sólo lo que tiene que hacerlo. Cuando usted consigue una plena comprensión del
funcionamiento del hardware, SFR de estudio que están en control de la misma (por lo general hay
algunos de ellos).
El rendimiento de todos los dispositivos se controla mediante un sistema de control apropiado y el
microcontrolador no es una excepción a la regla. Uno tiene que estar familiarizado con dichos sistemas
con el fin de ser capaz de utilizar los dispositivos adecuadamente. Por supuesto, estamos hablando de
SFR en toda la historia acerca de programación se inicia y termina.
3.2 SFR FUNDAMENTALES
El siguiente texto describe los principales SFR del microcontrolador PIC16F887. Sus bits de control de los
diferentes módulos dentro del chip y por lo tanto se describen junto con los procesos que están en control
de.
STATUS Register
ESTADO Registrarse
El registro STATUS contiene el estado de la aritmética de los datos en el registro W, restablecer los bits
de estado y de selección de banco de la memoria de datos.
IRP - bit se utiliza para seleccionar el banco en el registro de direccionamiento indirecto.
o 1 - Bancos 0 y 1 están activos (posiciones de memoria 00h-FFh), y
o 0 - Bancos 2 y 3 están activos (posiciones de memoria 100h-1FFh).
RP1, RP0 - Los bits se utilizan para seleccionar el banco en el registro de direccionamiento directo.
R P 1 R P 0 A C T I V O D E L B A N C O
0 0 Bank0
0 1 Bank1
1 0 BANK2
1 1 BANK3
A - Tiempo fuera poco. o 1 - Tras el encendido, la ejecución de la CLRWDT instrucción que restablece el temporizador perro
guardián o de la instrucción SLEEP que establece el microcontrolador en el modo de bajo consumo.
o 0 - Después de que el temporizador perro guardián de tiempo de espera.
PD - al apagar poco. o 1 - Después de encendido o la ejecución de la CLRWDT instrucción que restablece el temporizador
perro guardián.
o 0 - Después de la ejecución de la SLEEP instrucción que establece el microcontrolador en el modo
de bajo consumo.
Z - Zero bits o 1 - El resultado de una operación aritmética o lógica es cero.
o 0 - El resultado de una operación aritmética o lógica es diferente de cero.
DC - Dígito llevar / tomar prestado algo ha cambiado en la suma y resta, si un "desbordamiento" o "tomar prestado" del resultado se produce.
o 1 - A llevar a cabo, desde el cuarto bit de orden inferior del resultado se ha producido.
o 0 - No llevar a cabo, desde el cuarto bit de orden inferior del resultado se ha producido.
C - Carry / Borrow poco ha cambiado en la suma y resta, si un "desbordamiento" o "tomar prestado" del resultado se produce, es decir, si el resultado es mayor que 255 o inferior a 0.
o 1 - Un acarreo de salida desde el bit más significativo (MSB) del resultado se ha producido.
o 0 - n llevar a cabo, desde el bit más significativo (MSB) del resultado se ha producido.
OPTION_REG Register
Leyenda: R / W - Legible / escritura de bits, (1) Después del reinicio, el bit se establece
El registro contiene varios bits OPTION_REG de control que se utilizan para configurar Timer0/WDT
prescaler, Timer0, la interrupción externa y pull-ups en PORTB.
RBPU - Puerto B Levante Bit de habilitación
o 1 - PORTB pull-ups están desactivados.
o 0 - PORTB pull-ups están habilitadas.
INTEDG - bits Edge Select interrupción
o 1 - Interrupción en flanco ascendente del pin RB0/INT.
o 0 - Interrumpir el flanco descendente del pasador RB0/INT.
T0CS - TMR0 Clock Source Select bit.
o 1 - Transición en el pin T0CKI.
o 0 - Reloj interno ciclo de instrucción (Fosc / 4).
T0SE - TMR0 poco el borde de selección de fuente selecciona el pulso de
borde (ascendente o descendente) contados por el Timer0 por el pin
RA4/T0CKI.
o 1 - Incremento de alta a baja transición en el pin TOCKI.
o 0 - Incremento de alta a baja transición en el pin TOCKI.
PSA - poco Prescaler asignación asigna el prescaler (sólo uno está
disponible) para el temporizador temporizador o de vigilancia.
o 1 - Prescaler se asigna al WDT.
o 0 - Prescaler se asigna al Timer0.
PS2, PS1, PS0 precontador Tasa de bits de selección de
Una tasa de pre-escalador se selecciona mediante la combinación de estos bits. Como se muestra en la
siguiente tabla, la tasa de pre-escalador depende de si se le asigna al temporizador Timer0 o reloj perro-
(WDT).
P S 2 P S 1 P S 0 T M R 0 W D T
0 0 0 01:02 01:01
0 0 1 01:04 01:02
0 1 0 01:08 01:04
0 1 1 01:16 01:08
1 0 1 1:64 01:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128
A fin de lograr 01:01 tasa precontador cuando los recuentos de hasta Timer0 impulsos, el pre-escalador
debe ser asignado al WDT.Como resultado, el Timer0 no utiliza el pre-escalador, pero directamente
cuenta impulsos generados por el oscilador, que en realidad era el objetivo.
Let's do it in mikroBasic...
' If the CLRWDT command is not executed, WDT will reset the
microcontroller every 32.768 uS
' (f=4 MHz)
OPTION_REG = %00001111 ' Prescaler is assigned to WDT (1:128)
asm
CLRWDT ' Assembly command to reset WDT
end asm
... ' Time between these two CLRWDT commands must not exceed
32.768 microseconds (128x256)
CLRWDT ' Assembly command to reset WDT
...
... ' Time between these two CLRWDT commands must not exceed
32.768 microseconds (128x256)
CLRWDT ' Assembly command to reset WDT
...
INTERRUPCIÓN DEL SISTEMA DE REGISTROS
A la recepción de una solicitud de interrupción no significa que automáticamente se producirá, ya que
también debe ser habilitada por el usuario (desde el programa). Por esta razón, hay bits especiales que
se utilizan para habilitar o deshabilitar las interrupciones. Es fácil reconocerlos por las letras IE (las siglas
de habilitación de interrupción) que figuran en sus nombres. Además, cada interrupción se asocia con otro
bit llamado una bandera que indica que una petición de interrupción ha llegado independientemente de si
está activado o no. Del mismo modo, sus nombres son seguidos por IF (bandera de interrupción).
Como puedes ver, todo se basa en un principio simple y eficaz. Cuando llega una solicitud de
interrupción, el bit de bandera se estableció por primera vez. Si el bit es decir, adecuada no se ha
establecido (0), la condición de interrupción será completamente ignorado. De lo contrario, se produce
una interrupción. Si varias fuentes de interrupción están habilitadas, es necesario detectar la una activa
antes de una rutina de interrupción comienza la ejecución. Fuente de detección se realiza mediante la
comprobación bits de la bandera.
Es importante saber que bits de la bandera no se borran automáticamente, pero por software, mientras
que la ejecución de la rutina de interrupción está en marcha. Si descuidamos este detalle, otra
interrupción se producirá inmediatamente después de regresar al programa principal, a pesar de que hay
solicitudes no más para su ejecución. En pocas palabras, la bandera, así como el bit de IE, siendo
establecido.
Todas las fuentes de interrupción típicos del microcontrolador PIC16F887 se muestran en la página
siguiente. Tenga en cuenta varias cosas:
El bit GIE habilita todas las interrupciones no enmascaradas y deshabilita todas las interrupciones de
forma simultánea.
El bit PEIE permite todas las interrupciones periféricas no enmascaradas y deshabilita todas las
interrupciones periféricas. Esto no se refiere al Timer0 y el PORTB fuentes de interrupción.
Para permitir que se produzca una interrupción al cambiar el estado lógico PORTB, es necesario que le
permita para cada bit por separado. En este caso, los bits del acto IOCB registro como bits de control de
IE.
Registro INTCON
El registro INTCON incluye habilitar varias y trozos de la bandera de desbordamiento del registro TMR0,
cambio de PORTB y las interrupciones externas pin INT.
Leyenda: R / W - Legible / escritura de bits, (0) Después de reiniciar, se restablece, (X) Después del
reinicio, poco se sabe
GIE - Global Interrupt Enable bit - controla todas las fuentes posibles de interrupción al mismo tiempo.
o 1 - Todas las interrupciones no enmascaradas habilitado.
o 0 - Todas las interrupciones deshabilitadas.
PEIE - Interrupción periférico, permiten poco funciona de manera similar al bit GIE, pero controla las interrupciones habilitadas por los módulos periféricos. Por lo tanto, no tiene impacto en las interrupciones provocadas por Timer0 o al cambiar el estado del puerto PORTB o RB0/INT alfiler.
o 1 - Todas las interrupciones periféricas no enmascaradas habilitado.
o 0 - Todas las interrupciones de periféricos inhabilitado.
T0IE - TMR0 Overflow Interrupt Enable controles bits interrupciones provocadas por el desbordamiento de TMR0.
o 1 - TMR0 desbordamiento interrumpir habilitado.
o 0 - TMR0 desbordamiento de interrupción deshabilitado.
INTE - Interrupción RB0/INT externa Activa los controles bit de interrupción causada por cambiar el estado lógico de la patilla de entrada RB0/INT (interrupción externa).
o 1 - interrupción externa INT habilitado.
o 0 - interrupción externa INT inhabilitado.
RBIE - RB Cambio Puerto habilitación de interrupción bits. Cuando se configura como entradas, los pins PORTB puede provocar una interrupción al cambiar su estado lógico (no importa si es alto-a-bajo transición o viceversa, el hecho de que su estado lógico se cambia únicamente asuntos). El bit RBIE determina si una interrupción es que se produzca o no.
o 1 - cambio de PORTB interrumpir habilitado.
o 0 - interrupción cambio PORTB desactivado.
T0IF - TMR0 interrupción de desbordamiento del bit indicador registra el desbordamiento del Timer0 registro, cuando el conteo comienza en cero.
o 1 - TMR0 se ha desbordado registro (bit debe ser limpiado desde el software).
o 0 - TMR0 registro no se ha desbordado.
INTF - RB0/INT bits externa bandera de interrupción registra el cambio del estado de la lógica RB0/INT pin.
o 1 - interrupción externa INT ha ocurrido (debe ser limpiado desde el software).
o 0 - interrupción externa INT no ha ocurrido.
RBIF - RB Cambio Puerto bits bandera de interrupción registra cualquier cambio del estado lógico de algunos pines de entrada PORTB.
o 1 - Al menos uno de los fines generales PORTB pines I / O ha cambiado su estado lógico. Después de puerto PORTB lectura es completa, el bit RBIF debe ser limpiado desde el software.
o 0 - Ninguno de los efectos PORTB general de pines I / O ha cambiado su estado lógico.
Let's do it in mikroBasic...
' The PORTB.4 pin is configured as an input sensitive to logic
state change
ANSEL, ANSELH = 0 ' All I/O pins are configured as digital
PORTB = 0 ' All PORTB pins are cleared
TRISB = %00010000 ' All PORTB pins except PORTB.4 are
configured as outputs
INTCON.RBIE = 1 ' Interrupts on PORTB change are enabled
IOCB.IOCB4 = 1 ' Interrupt on PORTB pin4 change is enabled
INTCON.GIE = 1 ' Global interrupt is enabled
...
...
'From this point, any change of the PORTB.4 pin logic state
will cause an interrupt
PIE1 Registro
El registro contiene PIE1 interrupción periférica bits de habilitación.
Leyenda: (-) poco no implementada, (R / W) - Legible / escritura de bits, (0) Después de reiniciar, se
restablece
ADIE - Un convertidor A / D habilitación de interrupción bits. o 1 - interrupción ADC habilitado.
o 0 - ADC interrupción deshabilitada.
RCIE - EUSART Recibe habilitación de interrupción bits. o 1 - Habilita la interrupción de recepción EUSART.
o 0 - Deshabilita la interrupción de recepción EUSART.
TXIE - EUSART interrupción de la transmisión Bit de habilitación. o 1 - EUSART recibir interrumpir habilitado.
o 0 - EUSART interrupción de recepción desactivado.
SSPIE - Maestro del puerto en serie síncrona (MSSP) habilitación de interrupción bits - permite a una solicitud de interrupción que se genera cada vez que una transferencia de datos a través del módulo de comunicación síncrona en serie (SPI o el modo I2C) se ha completado.
o 1 - interrupción del MSSP habilitado.
o 0 - interrupción del MSSP desactivado.
CCP1IE - CCP1 habilitación de interrupción bits permite una petición de interrupción que se genera en CCP1 módulo utilizado para el procesamiento de señal PWM.
o 1 - CCP1 interrupción habilitada.
o 0 - CCP1 interrupción deshabilitada.
TMR2IE - TMR2 a PR2 interrupción del partido Bit de habilitación o 1 - TMR2 a PR2 interrupción partido habilitado.
o 0 - TMR2 a PR2 interrupción partido desactivado.
TMR1IE - TMR1 interrupción de desbordamiento Habilitar bits permite una petición de interrupción que se genera en cada registro de desbordamiento del temporizador TMR1, es decir, cuando el recuento se inicia desde cero.
o 1 - TMR1 desbordamiento interrumpir habilitado.
o 0 - TMR1 desbordamiento de interrupción deshabilitado.
Let's do it in mikroBasic...
'Each Timer1 register (TMR1H and TMR1L) overflow causes an
interrupt to occur. In every
'interrupt rutine, variable cnt will be incremented by 1.
dim unsigned short cnt ' Define variable cnt
sub procedure interrupt
cnt = cnt + 1 ' Interrupt causes cnt to
be incremented by 1
PIR1.TMR1IF = 0 ' Reset bit TMR1IF
TMR1H = 0x80 ' TMR1H and TMR1L timer
registers return
TMR1L = 0x00 ' their initial values
end sub
main:
ANSEL, ANSELH = 0 ' All I/O pins are
configured as digital
T1CON = 1 ' Turn on Timer1
PIR1.TMR1IF = 0 ' Reset the TMR1IF bit
TMR1H = 0x80 ' Set initial value for
Timer1
TMR1L = 0x00
PIE1.TMR1IE = 1 ' Enable an interrupt on
overflow
cnt = 0 ' Reset variable cnt
INTCON = 0xC0 ' Enable interrupt (bits
GIE and PEIE)
...
PIE2 Registro
El registro PIE2 también contiene varios bits de habilitación de interrupción.
Leyenda: (-) poco no implementada, (R / W) - Legible / escritura de bits, (0) Después de reiniciar, se
restablece
OSFIE - Oscilador Fail Interrupt Enable bit. o 1 - fallo oscilador interrumpir habilitado.
o 0 - fallo del oscilador interrupción deshabilitada.
C2IE - Comparador C2 habilitación de interrupción bits. o 1 - comparador C2 interrupción habilitada.
o 0 - Comparador C2 interrupción deshabilitada.
C1IE - comparador C1 habilitación de interrupción bits. o 1 - comparador C1 interrumpir habilitado.
o 0 - comparador C1 interrupción deshabilitada.
EEIE - escritura de EEPROM interrumpir la operación Habilitar poco. o 1 - EEPROM operación de escritura interrumpir habilitado.
o 0 - EEPROM operación de escritura interrupción deshabilitada.
BCLIE - Interrupción del bus de colisión Bit de habilitación. o 1 - interrupción colisión de bus habilitado.
o 0 - interrupción de colisión de bus desactivado.
ULPWUIE - Ultra Low-Power despertador habilitación de interrupción bits. o 1 - Ultra bajo consumo de energía llamada de interrupción habilitada.
o 0 - Ultra bajo consumo de energía llamada de interrupción deshabilitado.
CCP2IE - CCP2 Interrupt Enable bit. o 1 - CCP2 interrupción habilitada.
o 0 - CCP2 interrupción deshabilitada.
Let's do it in mikroBasic...
' Comparator C2 is configured to use pins RA0 and RA2 as
inputs. Every change on
' the comparator's output will cause the PORTB.1 output pin to
change its logic
' state in interrupt routine.
sub procedure interrupt
PORTB.F1 = not PORTB.F1 ' Interrupt will invert logic state of
the PORTB.1 pin
PIR2.C2IF = 0 ' Interrupt flag bit C2IF is cleared
end sub
main:
TRISB = 0 ' All PORTB pins are configured as
outputs
PORTB.1 = 1 ' Pin PORTB.1 is set
ANSEL = %00000101 ' RA0/C12IN0- and RA2/C2IN+ pins are
analog inputs
ANSELH = 0 ' All other I/O pins are configured as
digital
CM2CON0.C2CH0 = 0 ' The RA0 pin is selected to be C2
inverting input
CM2CON0.C2CH1 = 0
PIE2.C2IE = 1 ' Enables comparator C2 interrupt
INTCON.GIE = 1 ' Global interrupt is enabled
CM2CON0.C2ON = 1 ' Comparator C2 is enabled
...
...
PIR1 Registrarse
El registro PIR1 contiene los bits de la bandera de interrupción.
Leyenda: (-) poco no implementada, (R / W) - Legible / escritura de bits, (R) - Poco legible, (0)
Después de reiniciar, se restablece
ADIF - convertidor A / D de interrupción bit de bandera. o 1 - la conversión A / D se ha completado (el bit debe ser limpiado desde el software).
o 0 - la conversión A / D no se ha completado o no ha comenzado.
RCIF - EUSART Recibe bits bandera de interrupción. o 1 - EUSART búfer de recepción está lleno. El bit se borra leyendo el registro RCREG.
o 0 - EUSART buffer de recepción no está lleno.
TXIF - EUSART de transmisión poco bandera de interrupción. o 1 - búfer EUSART de transmisión está vacía. El bit se borra en cualquier escritura en el registro
TXREG.
o 0 - EUSART búfer de transmisión está llena.
SSPIF - Master Synchronous Serial Port (MSSP) bit bandera de interrupción. o 1 - Todas las condiciones de interrupción durante el MSSP de datos de transmisión / recepción que
se cumplan. Ellos varían en función del modo de operación MSSP (SPI o I2C). Este bit debe ser limpiado desde el software antes de salir de la rutina de servicio de interrupción.
o 0 - No hay condición de interrupción MSSP se reunió.
CCP1IF - CCP1 bits bandera de interrupción. o 1 - CCP1 condición de interrupción se cumple (CCP1 es una unidad para captar, comparar y
generar una señal PWM). Modo de operación indica si la captura o comparar partido se ha producido. En ambos casos, el bit debe ser limpiado desde el software. Este bit no se utiliza en modo PWM.
o 0 - No hay condición de interrupción CCP1 se reunió.
TMR2IF - Timer2 al PR2 bit bandera de interrupción o 1 - TMR2 (8-bit del registro) a PR2 partido se ha producido. Este bit debe ser limpiado desde el
software antes de salir de la rutina de servicio de interrupción.
o 0 - No a la PR2 TMR2 partido se ha producido.
TMR1IF - Timer1 desbordamiento del bit de bandera de interrupción o 1 - registro TMR1 se ha desbordado. El bit debe ser limpiado desde el software.
o 0 - TMR1 registro no se ha desbordado.
PIR2 Registrarse
El registro contiene los bits de interrupción PIR2 bandera.
Leyenda: (-) poco no implementada, (R / W) - Legible / escritura de bits, (0) Después de reiniciar, se
restablece
OSFIF - Oscilador Fail bits bandera de interrupción. o 1 - oscilador de cuarzo fallado y entrada de reloj se ha convertido en INTOSC oscilador
interno. Este bit debe ser limpiado desde el software.
o 0 - oscilador de cuarzo funciona con normalidad.
C2IF - Comparador de bits C2 bandera de interrupción. o 1 - salida del comparador C2 ha cambiado (C2OUT bits). Este bit debe ser limpiado desde el
software.
o 0 - comparador la salida C2 no ha cambiado.
C1IF - Comparador de bits C1 bandera de interrupción. o 1 - Salida del comparador C1 ha cambiado (C1OUT bits). Este bit debe ser limpiado desde el
software.
o 0 - Salida del comparador C1 no ha cambiado.
EEIF - EE Escribir bits, bandera de interrupción. o 1 - EEPROM escritura completa. Este bit debe ser limpiado desde el software.
o 0 - EEPROM de escritura no es completa o no ha empezado todavía.
BCLIF - bit de bus de colisión bandera de interrupción. o 1 - Una colisión de autobuses se ha producido en el MSSP cuando se establece para operar en
modo maestro I2C. Este bit debe ser limpiado desde el software.
o 0 - No hay colisión del autobús se ha producido.
ULPWUIF - Ultra bajo consumo bits de interrupción de despertador Bandera. o 1 - Wake-up condición se ha producido. Este bit debe ser limpiado desde el software.
o 0 - Ninguna condición para despertar ha ocurrido.
CCP2IF - CCP2 bits bandera de interrupción. o 1 - CCP2 condición de interrupción se cumple (unidad de captura, comparación y generación de
señal PWM). Modo de operación indica si la captura o comparar partido se ha producido. En ambos casos, el bit debe ser limpiado desde el software. Este bit no se utiliza en modo PWM.
o 0 - No hay condición de interrupción CCP2 se reunió
Let's do it in mikroBasic...
' Module ULPWU activation sequence
main:
PORTA.0 = 1 ' PORTA.0 pin is set
ANSEL,ANSELH = 0 ' All I/O pins are configured as digital
TRISA = 0 ' PORTA pins are configured as outputs
Delay_ms(1) ' Charge capacitor
PIR2.ULPWUIF = 0 ' Clear flag
PCON.ULPWUE = 1 ' Enable ULP Wake-up
TRISA.0 = 1 ' PORTA.0 is configured as an input
PIE2.ULPWUIE = 1 ' Enable interrupt
INTCON.GIE = 1 ' Enable all unmasked interrupts
INTCON.PEIE = 1 ' Enable peripheral interrupt
asm ' Asm instruction
SLEEP ' Go to sleep mode
...
PCON registro
El registro PCON contiene solamente dos bits de la bandera se utilizan para diferenciar entre el poder-al
momento del reinicio, brown-out reset, restablecimiento del temporizador watchdog y reset externo en el
pin MCLR.
Leyenda: (-) poco no implementada, (R / W) - Legible / escritura de bits, (1) - Después del reinicio,
se establece el bit (0) Después de reiniciar, se restablece
ULPWUE - Ultra Low-Power despertador Bit de habilitación o 1 - Ultra bajo consumo de energía llamada de JavaScript.
o 0 - Ultra bajo consumo de energía para despertar desactivado.
SBOREN - Software BOR Bit de habilitación o 1 - Brown-out restablecer habilitado.
o 0 - Brown-out restablecer desactivado.
POR - Power-on poco Restablecer estado o 1 - No hay poder sobre la reposición se ha producido.
o 0 - Power-on reset se ha producido. Este bit se debe establecer desde el software después de un reinicio de encendido se produce.
BOR - Brown-out poco Restablecer estado o 1 - No hay reset brown-out se ha producido.
o 0 - Brown-out reset ocurrido. Este bit se debe establecer desde el software después de un reset brown-out ocurre.
PCL y PCLATH REGISTROS
El tamaño de la memoria de programa PIC16F887 es de 8K y proporciona 8192 lugares para almacenar
el programa. En consecuencia, el contador de programa (PC) debe ser de 13 bits de ancho (213 =
8192). Para el microcontrolador para acceder a algún lugar de memoria de programa durante la
operación, su dirección debe estar disponible a través de SFR. Puesto que todos los SFR son de 8-bits de
ancho, el contador de programa se crea mediante la combinación de dos registros individuales. El byte
bajo (8 bits) del contador de programa ocupa el registro PCL, mientras que el byte alto (5 bits) ocupa el
registro PCLATH. Si la ejecución del programa no afecta el contador de programa, el valor de este
registro (PCL y PCLATH) es automáticamente y se incrementa constantemente +1, +1, +1, uno ...De esta
manera, el programa se ejecuta como es writteninstruction por la instrucción, seguido por incremento de
dirección constante. Si el contador de programa se cambia desde dentro del software, entonces usted
debe tener cuidado de lo siguiente:
Si el contador de programa se cambia desde dentro del software, entonces hay varias cosas que se
deben tener en cuenta a fin de evitar problemas:
Ocho bits inferiores del registro PCL (el byte bajo) son a la vez de lectura y escritura, mientras que los cinco bits superiores del registro PCLATH son de sólo escritura.
El registro PC se borra en cualquier reinicio.
En lenguaje ensamblador, el valor del contador de programa está marcado como PCL y se refiere a 8 bits inferiores solamente. Tenga cuidado al utilizar la instrucción del 'ADDWF PCL' asamblea. Esta es una instrucción de salto, el destino de los cuales se determina mediante la adición de algunos núm ero a la dirección actual. Es comúnmente usado para saltar en una tabla de búsqueda o de la mesa pro g rama de leerlos. Un problema surge si dicha adición hace que el registro PCLATH que ser modificados. La ejecución de cualquier instrucción sobre el registro simultáneamente PCL ously hace que los bits del contador de programa para ser reemplazada por el contenido de ambas PCLATH y PCL registro. Sin embargo, el registro PCL tiene acceso a 8 bits inferiores de la instrucción resultado solamente de modo que el salto siguiente será incorrecta. El problema se resuelve mediante el establecimiento de tales instrucciones a las direcciones de programa que terminan por xx00h. Esto permite que el programa salte hasta 255 lugares. Si los saltos más largos son ejecutados por esta instrucción, el registro PCLATH debe ser incrementado en 1 por cada desbordamiento de registro PCL.
En una llamada a subrutina o salto de ejecución (instrucciones de
montaje CALL y GOTO ), el microcontrolador es capaz de proporcionar 11-bit de
dirección única. Similar a la RAM, que se divide en 'bancos', la ROM se divide en cuatro 'páginas' de 2K cada uno. Dichas instrucciones se ejecutan correctamente dentro de estos límites. En pocas palabras, ya que las ofertas de procesador con la dirección de 11 bits, es capaz de hacer frente a cualquier lugar dentro de 2 KB.
La figura siguiente ilustra un salto a la subrutina PP1. Pero si el inicio de la dirección de subrutina o salto
no está dentro de la misma página que el destino de la llamada, dos 'desaparecidos' bits superiores
deben ser proporcionados por la realización de la operación de escritura en el registro PCLATH. La figura
siguiente ilustra un salto a la subrutina PP2.
En ambos casos, cuando la subrutina llega a algunas de las instrucciones de la asamblea
siguiente RETURN , RETLW o RETFIE (volver al programa principal), el microcontrolador sólo se
procederá a la ejecución del programa desde donde lo dejó, porque la dirección de retorno se inserta en
la pila que, como se mencionó antes, se compone de registros 13-bits.
Direccionamiento indirecto
Además de direccionamiento directo, lo cual es lógico y evidente (que va a hacer para especificar la
dirección de un registro para leer su contenido), este microcontrolador es capaz de realizar el
direccionamiento indirecto por medio de la INDF y los registros de ISA. A veces hace que el proceso de
escribir un programa más fácil. Todo el procedimiento se habilita el registro INDF que no es un único y
verdadero (que no existe físicamente). Se utiliza para especificar el registro de la dirección de la que se
almacena en el registro FSR. Como resultado, escribir o leer del registro INDF significa realmente escribir
o leer desde el registro de la dirección de la que se almacena en el registro FSR. En otras palabras, las
direcciones de los registros se almacenan en el registro FSR, mientras que sus contenidos se almacenan
en el registro INDF. La figura siguiente ilustra la diferencia entre el direccionamiento directo e indirecto.
Como puede verse, la emisión de los bits de direccionamiento de los desaparecidos se resuelve mediante
un "tomar prestado" de otro registro. Esta vez, es el séptimo bit, denominado bit PIR, del registro de
estado.
3.3 Entrada / Salida
Una de las ventajas más importantes del microcontrolador es un número de entrada / salida en los pins
que le permiten ser conectados a los módulos periféricos. Hay un total de 35 de propósito general pines I /
O previstas en el PIC16F887, que es más que suficiente para la mayoría de las aplicaciones.
Con el fin de sincronizar el funcionamiento de puertos E / S con el interior de 8-bits organización del
microcontrolador, son, de forma similar a los registros, agrupados en cinco puertos denotados por letras
A, B, C, D y E. Todo E / S puertos tienen varias características en común:
Para ahorrar más espacio en el tablero, todos los pines de E / S son multifuncionales. Sin embargo, sólo se puede asignar una función al mismo tiempo.
Cada puerto está acompañado por el correspondiente registro TRIS: TRISA, TRISB, etc TRISC que determina el rendimiento, pero no el contenido de los bits del puerto. En la limpieza de cualquier bit del registro TRIS (bit = 0), el pasador correspondiente puerto está configurado como una salida. De manera similar, mediante el establecimiento de cualquier bit del registro TRIS (bit = 1), el pasador correspondiente puerto está configurado como una entrada. Esta regla es fácil de recordar 0 = Salida, 1 = Entrada.
PORTA y registro TRISA
PORTA es un puerto de 8 bits de ancho, puerto bidireccional. Los bits del registro TRISA controlar los
pins PORTA, es decir, si van a actuar como entradas o salidas digitales:
Al igual que los bits del registro TRISA que determinan cuál de los pines se configuran como entradas y
cuáles como salidas, los bits correspondientes del registro ANSEL determinar si los pines PORTA se
configuran como entradas analógicas o entradas y salidas digitales.
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)
Cada bit de este puerto se le asigna una función adicional relacionada con algunos de los módulos
integrados en la periferia. Este capítulo cubre sólo la función adicional del pasador RA0, que está
relacionado con la unidad PORTA y ULPWU, mientras que la función adicional de otros pines se
describirá en capítulos posteriores.
Vamos a hacerlo en mikroBasic ...
' The PORTA.2 pin is configured as a digital input. All other
PORTA pins are digital ... outputs
ANSEL = ANSELH = 0 ' All I/O pins are configured as digital
PORTA = 0 ' All PORTA pins are cleared
TRISA = %00000100 ' All PORTA pins except PORTA.2 are
configured as outputs
...
ULPWU UNIDAD
El microcontrolador se utiliza comúnmente en dispositivos independientes accionados batería que operan
de forma periódica. Ejemplos típicos son termómetros, sensores de detección de incendios y similares. El
consumo de energía mínima es una de las prioridades aquí. Como una reducción de la frecuencia de reloj
hace que el consumo de energía se reduce, una de las soluciones más convenientes para este problema
es reducir la velocidad del reloj, es decir, utilizar cristal de cuarzo 32 KHz en lugar de 20MHz.
Configuración del microcontrolador en modo de suspensión es un paso más en la misma
dirección.Aquí llegamos a otro tema - como para despertar el microcontrolador y la puso a
modo normal?Obviamente, es necesario proporcionar algún modo una señal externa para
cambiar el estado lógico de algunos pasador. La única manera de hacerlo es por medio de
dispositivos electrónicos adicionales, que por otra parte hace que aumente el consumo de
energía de todo el dispositivo ...
La solución ideal sería que el microcontrolador puede despertarse periódicamente por sí
mismo. El circuito que hace posible que se muestra en la figura a la izquierda.
Así es como funciona este circuito:
Un pasador se configura como una salida y un uno lógico (1) es llevado a la misma. Esto hace que el
condensador se cargará.Inmediatamente después de esto, el mismo pin está configurado como una
entrada. El cambio de estado lógico causará una interrupción y el microcontrolador entrará en el modo de
suspensión. Todo lo que queda ahora es esperar a que el condensador que se descarga por la corriente
de fuga que fluye a través de la clavija de entrada. Después de que una interrupción se lleva a cabo y el
producto del microcontrolador con la ejecución del programa en el modo normal. Todo el procedimiento se
repite periódicamente.
Teóricamente, esta es una solución perfecta. El problema es que todos los pasadores capaces
de provocar una interrupción de esta manera son digitales y tienen corriente de fuga
relativamente alto cuando su tensión no está cerca de los límites de Vdd (1) o Vss (0). En este
caso, el condensador se descarga por un corto período de tiempo dado que las cantidades
actuales a varios cientos de microamperios. Esta es la razón por un bajo consumo de ULPWU
circuito, capaz de registrar caídas lentas de tensión, se ha diseñado.Su salida genera una
interrupción, mientras que su entrada está conectada a la patilla RA0 en el
microcontrolador. Refiérase a la figura de la izquierda, R = 200 ohms, C = 1 nF, el tiempo de
descarga es aproximadamente 30mS, mientras que un consumo total de energía del
microcontrolador es 1000 veces menor (varios cientos de nanoamperios).
PORTB y TRISB registra
Puerto PORTB es un niño de 8 bits de ancho, el puerto bidireccional. Los bits del registro TRISB
determinar la función de sus patas.
Al igual que en el puerto PORTA, un uno lógico (1) en el bit TRISB registro configura el puerto apropiado
pines PORTB como entrada y viceversa. Seis terminales de este puerto puede actuar como entradas
analógicas (AN). Los bits del registro ANSELH determinar si estos pines se configuran como entradas
analógicas o entradas y salidas digitales:
RB0 = AN12 (determinado por el bit del registro ANS12 ANSELH)
RB1 = AN10 (determinado por el bit del registro ANS10 ANSELH)
RB2 = AN8 (determinado por el bit del registro ANS8 ANSELH)
RB3 = AN9 (determinado por el bit del registro ANS9 ANSELH)
RB4 = AN11 (determinado por el bit del registro ANS11 ANSELH)
RB5 = AN13 (determinado por el bit del registro ANS13 ANSELH)
Cada pin del puerto PORTB se le asigna una función adicional relacionada con algunos de los
incorporados en los módulos periféricos, que se explicarán más adelante.
Las siguientes características hacen de este diffierent puerto desde otros puertos, por lo tanto, sus patas
son de uso general:
Todos los pines del puerto PORTB se han construido en resistencias pull-up, que los hace ideales para conectar con los botones (teclado), interruptores u optoacopladores. Con el fin de conectar estas resistencias a los pines PORTB, el bit apropiado del registro WPUB debe ser fijado. *
Tener una alta resistencia (varias decenas de kiloohmios), estas resistencias 'virtuales' no afectan pines
configurados como salidas, pero sirven como un complemento útil cuando actúan como insumos. De lo
contrario, sin estas resistencias unidos los pines de entrada actuaría como coma flotante debido a su alta
resistencia de entrada.
* Aparte de los bits del registro WPUB, hay otro poco afecta a la instalación de todas las resistencias de
pull-up. Es el bit del registro RBPU OPTION_REG.
Puerto PORTB se puede utilizar como una fuente de interrupción. Si está activado, cada bit del puerto PORTB configura como una entrada puede causar una interrupción al cambiar su estado lógico. A fin de que los pins para provocar una interrupción, el bit apropiado del registro IOCB debe ser fijado.
Debido a estas características, los pines del puerto PORTB se utilizan comúnmente para el control de
botones en el teclado, ya que son capaces de registrar infaliblemente ningún tipo de presión botón. No
hay necesidad de 'escanear' estas entradas todo el tiempo, por lo tanto. Cuando los ejes X, Y y Z en los
pins están configurados como salidas fijados a uno lógico (1), sólo es necesario esperar a una petición de
interrupción para llegar después de presionar un botón. Mediante la combinación de ceros y unos de
estos resultados se comprueba que se presiona el pulsador. Refiérase a la figura a continuación:
Vamos a hacerlo en mikroBasic ...
'The PORTB.1 pin is configured as a digital input. Any change
of its logic state will cause
'an interrupt. It also has a pull-up resistor. All other PORTB
pins are digital ... outputs.
ANSEL, ANSELH = 0 ' All I/O pins are configured as digital
PORTB = 0 ' All PORTB pins are cleared
TRISB = %00000010 ' All PORTB pins except PORTB.1 are
configured as outputs
OPTION_REG.RBPU = 0 ' Pull-up resistors are enabled
WPUB.1 = 1 ' Pull-up resistor is connected to the
PORTB.1 pin
IOCB.1 = 1 ' The PORTB.1 pin may cause an interrupt on
logic state change
INTCON.RBIE = 1 ' Interrupt on PORTB change is enabled
INTCON.GIE = 1 ' All unmasked interrupts are enabled
...
PIN RB0/INT
El pasador RB0/INT es la única "verdadera" fuente de interrupción externa. Puede ser configurado para
responder a la señal borde elevar (cero a uno de transición) o el borde de la señal descendente (de uno a
cero de transición). El bit del registro INTEDG OPTION_REG se utiliza como un selector de señal.
RB6 y RB7 PINS
El PIC16F887 no está provisto de pasadores especiales para la programación. En su lugar, esta función
está asignada a pines I / O.Como una cuestión de hecho, los pines del puerto PORTB se utilizan para el
reloj (RB6) y la transferencia de datos (RB7) durante la programación. Además, es necesario para
proporcionar la tensión de alimentación Vdd (5V), así como la adecuada tensión Vpp (12-14V) para la
programación de la memoria FLASH. El pin MCLR se utiliza para este propósito. Usted no tiene que
pensar en todos estos detalles, ni que una de estas tensiones es que se aplicó por primera vez ya que el
programador se encarga de eso. Se permite que el programa para ser cargado en el microcontrolador
incluso cuando se suelda en el dispositivo de destino. El programa cargado normalmente se pueden
modificar de la misma manera. Este proceso se denomina ICSP (programación In-Circuit Serial). A fin de
que las ventajas de esta opción, es necesario planificar con anticipación.
Esto significa que es necesario para instalar una miniatura 5-pin en el dispositivo de destino a fin de
permitir el microcontrolador que se proporcionan con voltajes de programación necesarios. Con el fin de
evitar estos voltajes de interferir con el funcionamiento de otros módulos conectados a los pines del
microcontrolador, es necesario para aislarlos de la placa durante el proceso de programación utilizando
resistencias o puentes.
Como se puede ver, los voltajes aplicados a los pasadores en el zócalo del programador son los mismos
que los utilizados durante la programación ICSP
PORTC y registro TRISC
Puerto PORTC es un niño de 8 bits de ancho, el puerto bidireccional. Los bits del registro TRISC
determinar la función de sus patas. Al igual que en otros puertos, un uno lógico (1) aplicada al registro
TRISC configura el puerto correspondiente pin PORTC como entrada.
Todas las funciones adicionales de los bits del puerto PORTC se describirá más adelante.
PORTD y registro TRISD
Puerto PORTD es un niño de 8 bits de ancho, el puerto bidireccional. Los bits del registro TRISD
determinar la función de sus patas. Un uno lógico (1) aplicada al registro TRISD configura el pin del puerto
PORTD apropiado como una entrada.
PORTE y registro TRISE
Puerto PORTE es un puerto de 4 bits de ancho, bidireccional.
Los bits del registro TRISE de determinar la función de sus patas. Similar a otros puertos, un uno lógico
(1) aplicada al registro TRISE configura el pin del puerto PORTE apropiado como una entrada.
La excepción es el pin RE3 que siempre se configura como una entrada.
Al igual que en los puertos PORTA y PORTB, tres pines pueden ser configurados como entradas
analógicas, en este caso. Los bits de Ansel registro de determinar si un alfiler actuará como una entrada
analógica (AN) o una entrada / salida digital:
RE0 = AN5 (determinado por el bit ANS5 del registro ANSEL);
RE1 = AN6 (determinado por el bit ANS6 del registro ANSEL); y
RE2 = AN7 (determinado por el bit ANS7 del registro ANSEL).
Let's do it in mikroBasic...
' The PORTE.0 pin is configured as an analog input while
another three pins of the same
' p.o.r.t are configured as digital.
ANSEL = %00100000 ' The PORTE.0 pin is configured as analog
ANSELH = 0 ' All other I/O pins are configured as
digital
TRISE = %00000001 ' All PORTE pins except PORTE.0 are
configured as outputs
PORTE = 0 ' All PORTE pins are cleared
...
Y el registro ANSEL ANSELH
Los registros de Ansel y ANSELH se utilizan para configurar el modo de entrada de un pin de E / S como
analógico o digital.
La regla a seguir dice lo siguiente:
Para configurar un pin como una entrada analógica, el bit apropiado de los registros o Ansel ANSELH se
debe establecer (1). Para configurar un pin como una entrada / salida digital, el bit apropiado debe ser
cero (0).
El estado de los bits de Ansel registro no afecta a las funciones de salida digital. El resultado de cualquier
intento de leer un pin del puerto se configura como una entrada analógica será 0.
En Corto
Es probable que nunca escribir un programa que no utiliza los puertos, por lo que el esfuerzo que hacen
para aprender todo acerca de ellos sin duda valdrá la pena. También, que parecen ser los más simples
módulos dentro del microcontrolador. Esta es la forma en que se utilizan:
Al diseñar un dispositivo, seleccionar un puerto para ser utilizado por el microcontrolador para la comunicación con los módulos periféricos. Si se utilizan sólo las entradas y salidas digitales, seleccione cualquier puerto que desee. Si va a utilizar
algunas de las entradas analógicas, seleccione los puertos apropiados de apoyo de configuración de este tipo (AN0-AN13).
Cada pin del puerto puede configurarse como una entrada o una salida. Los bits del TRISA, TRISB, TRISC, TRISD y registros TRISE determinar cómo los terminales de los siguientes puertos PORTA, PORTB, PORTC, PORTD y PORTE va a actuar. Tan simple como eso.
Si utiliza alguna de las entradas analógicas, en primer lugar es necesario establecer los bits correspondientes de la ANSEL y registros ANSELH al comienzo del programa.
Si utiliza conmutadores y los botones como fuente de entrada de la señal, se recomienda conectarse a dispositivos a los pines del puerto PORTB porque tienen resistencias pull-up conectadas. El uso de estas resistencias está habilitado por el bit del registro RBPU OPTION_REG, mientras que las resistencias individuales están habilitadas por los bits del registro WPUB.
Generalmente es necesario para responder tan pronto como los pines de entrada cambia su estado lógico. Esto no significa que usted tiene que escribir un programa para comprobar el estado de los pins de la lógica de todo el tiempo.Sólo tienes que conectar a los pines PORTB y permitir que se produzca una interrupción en cada cambio de voltaje.Los bits de los registros y IOCB INTCON están a cargo de eso.
3,4 TIMER0
El microcontrolador PIC16F887 dispone de tres temporizadores completamente independientes y
contadores marcados como TMR0, TMR1 y TMR2. Lea atentamente el capítulo siguiente para aprender
más sobre ellos.
Timer0 tiene una amplia gama de aplicación en la práctica. No hay casi ningún programa sin él, ya que le
permite escribir fácilmente un código que es para generar pulsos de duración arbitraria, la medición del
tiempo o cómputo de impulsos externos (eventos) casi sin limitaciones.
Timer0 es un temporizador de 8-bits / contador con las siguientes características:
8-bit del temporizador / contador;
8-bits prescaler (compartido con el temporizador de vigilancia);
Programable de reloj interno o externo de origen;
Interrupción por desbordamiento, y
Programable reloj externo para seleccionar bordes.
La siguiente figura ilustra el esquema Timer0 con todos los bits que controlan su funcionamiento. Estos
bits se almacena en el registro OPTION_REG.
OPTION_REG Registrarse
RBPU - PORTB pull-up bit de habilitación
o 0 - PORTB resistencias pull-up desactivado.
o 1 - pins PORTB se puede conectar a tirar hacia arriba resistencias.
INTEDG - bits Edge Select interrupción o 0 - Interrumpir el flanco ascendente del pasador INT (0-1).
o 1 - Interrumpir el flanco descendente del pasador INT (1-0).
T0CS - TMR0 reloj de bits Select o 0 - Los pulsos son llevados a la entrada Timer0/counter a través del pin RA4.
o 1 - Timer0 utiliza ciclo de reloj interna (Fosc / 4).
T0SE - TMR0 poco el borde de selección de fuente o 0 - Incremento de alta a baja transición en el pin TMR0.
o 1 - Incremento de bajo a alto de transición en el pin TMR0.
PSA - Asignación de bits Prescaler o 0 - Prescaler se asigna al WDT.
o 1 - Prescaler se asigna a la Timer0/counter.
PS2, PS1, PS0 - Tasa de bits Seleccione Prescaler o Prescaler tasa se establece mediante la combinación de estos bits. Como se observa en la tabla, la
misma combinación de bits ofrece diferentes tipo de prescaler para el Timer0/counter y el temporizador perro guardián, respectivamente.
P S 2 P S 1 P S 0 T M R 0 W D T
0 0 0 01:02 01:01
0 0 1 01:04 01:02
0 1 0 01:08 01:04
0 1 1 01:16 01:08
1 0 0 01:32 01:16
1 0 1 1:64 01:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128
Cuando el bit PSA está desactivada, el prescaler está asignado a la Timer0/counter como se muestra en
la siguiente figura:
Vamos a hacerlo en mikroBasic ...
' In this example, Timer0 is configured as a timer and
prescaler is assigned to it.
unsigned cnt ' Define variable cnt
sub procedure interrupt ' Interrupt routine
cnt = cnt + 1 ' Interrupt causes cnt to be
incremented by 1
TMR0 = 155 ' Timer0 (or counter) returns its
initial value
INTCON = 0x20 ' Bit T0IE is set, bit T0IF is cleared
end sub
main:
OPTION_REG = 0x04 ' Prescaler (1:32) is assigned to
Timer0
TMR0 = 155 ' Timer0 counts from 155 to 255
INTCON = 0xA0 ' Enable interrupt on TMR0 overflow
...
...
' In the following example, Timer0 is configured as counter and
prescaler is assigned to it
OPTION_REG = 0x20 ' Prescaler (1:2) is assigned to the
Timer0
TMR0 = 155 ' Timer0 counts from 155 to 255
INTCON = 0xA0 ' Enable interrupt on TMR0 overflow
...
Cuando el bit PSA está establecido, el prescaler se asigna al temporizador perro guardián, como se
muestra en la siguiente figura:
Vamos a hacerlo en mikroBasic ...
' In this example, prescaler (1:64) is assigned to watch-dog
timer.
main:
OPTION_REG = 0x0E ' Prescaler is assigned to WDT (1:64)
asm
CLRWDT ' Assembly command to reset WDT
end asm
...
...
asm
CLRWDT ' Assembly command to reset WDT
end asm
...
Esta es también digno de mención:
Cuando el pre-escalador se le asigna al temporizador / contador, cualquier escritura en el registro TMR0 se desactive la pre-escalador.
Cuando el pre-escalador se le asigna al temporizador de reloj de perro, la instrucción CLRWDT borrará ambos.
Escribir en el registro TMR0, utilizada como un contador de tiempo, no hará que el contaje de impulsos para iniciar de inmediato, pero con dos ciclos de instrucción de retraso. En consecuencia, es ne cesarios para ajustar el valor escrito en el registro TMR0.
Cuando el microcontrolador se establece en modo de reposo, el oscilador de reloj está apagado. No desbordamiento puede ocurrir ya que no hay pulsos para contar y por lo tanto la interrupción de desbordamiento de TMR0 no puede despertar al microcontrolador del modo de suspensión.
Cuando se utiliza como un contador de reloj externa, sin pre-escalador, una longitud de impulso mínima o un retardo entre dos impulsos debe ser 2 Tosc + 20 nS (Tosc representa el período de una señal de reloj generada por el oscilador).
Cuando se utiliza como un contador de reloj externo con pre-escalador, una longitud de impulso mínima o el intervalo entre dos impulsos es sólo 10ns.
La 8-bits precontador registro no está disponible para el usuario, lo que significa que no pueden ser directamente leído o escrito.
Cuando se cambia la asignación del prescaler Timer0 al temporizador perro guardián, la siguiente secuencia de instrucciones escritas en lenguaje ensamblador debe ser ejecutado con el fin de evitar que el microcontrolador se reinicie:
BANKSEL TMR0
CLRWDT ;CLEAR WDT
CLRF TMR0 ;CLEAR TMR0 AND PRESCALER
BANKSEL OPTION_REG
BSF OPTION_REG,PSA ;PRESCALER IS ASSIGNED TO WDT
CLRWDT ;CLEAR WDT
MOVLW b’11111000’ ;SELECT BITS PS2,PS1,PS0 AND CLEAR
ANDWF OPTION_REG,W ;THEM USING ‘LOGIC AND’ INSTRUCTION
IORLW b’00000101’ ;BITS PS2, PS1, AND PS0 SET
MOVWF OPTION_REG ;PRESCALER RATE TO 1:32
Del mismo modo, cuando se cambia la asignación de prescaler del WDT al Timer0, la siguiente secuencia de instrucciones, también escrito en lenguaje ensamblador, se debe ejecutar:
BANKSEL TMR0
CLRWDT ;CLEAR WDT AND PRESCALER
BANKSEL OPTION_REG
MOVLW b’11110000’ ;SELECT ONLY BITS PSA,PS2,PS1,PS0
ANDWF OPTION_REG,W ;CLEAR THEM USNG ‘LOGIC AND’ INSTRUCTION
IORLW b’00000011’ ;PRESCALER RATE IS 1:16
MOVWF OPTION_REG
En Corto
Con el fin de utilizar Timer0 correctamente, es necesario:
Paso 1: Para seleccionar el modo:
Modo de temporizador se selecciona por el bit del registro T0CS OPTION_REG, (T0CS: 0 = temporizador, 1 contador =).
Cuando se utiliza, el pre-escalador debe ser asignado al temporizador / contador borrando el bit PSA del registro OPTION_REG. La tasa de pre-escalador se establece mediante los bits PS2-PS0 del mismo registro.
Cuando una interrupción se utiliza, los GIE y TMR0IE bits del registro INTCON deben establecerse.
Paso 2: Para medir y contar
Medida del tiempo:
Restablecer el registro TMR0 o escribir un valor conocido a ella.
El tiempo transcurrido (en microsegundos, si de cristal de cuarzo de 4 MHz se utiliza) se mide mediante la lectura del registro TMR0.
El TMR0IF bit de bandera del registro INTCON se ajusta automáticamente cada vez que el TMR0 desborda registro. Si está activado, se produce una interrupción.
Contar:
La polaridad de los impulsos para ser contados en el pin RA4 es seleccionado por el bit TOSE del registro OPTION_REG (T0SE: 0 = positivo, 1 = impulsos negativos).
Número de impulsos puede ser leída desde el registro TMR0. La pre-escalador y de interrupción se utilizan en la misma manera que en el modo de temporizador.
3,5 TIMER1
Módulo Timer1 es un contador de 16-bit de temporización /, lo que significa que se compone de dos
registros (TMR1L y TMR1H). Es capaz de contar hasta 65.535 pulsos en un solo ciclo, es decir, antes de
que el recuento se inicia desde cero.
Al igual que en Timer0, estos registros pueden ser leídos o escritos que en cualquier momento. En caso
de que se produce un desbordamiento, una interrupción se genera automáticamente, siempre y cuando
se activa.
El Timer1 puede ser configurado para operar en uno de dos modos, ya sea como un temporizador o un
contador. A diferencia del Timer0, ambos de estos modos de dar possibilitis adicional.
El Timer1 tiene las siguientes características:
16-bit del temporizador / contador de un par de registros;
Programable de reloj interno o externo de origen;
3-bit pre-escalador;
Opcional de baja potencia (LP) del oscilador;
Funcionamiento síncrono o asíncrono;
Timer1 puerta de control (cuenta activada) a través de comparación o el pasador T1G;
Interrupción por desbordamiento;
Wake-up en caso de desbordamiento (reloj externo), y
Fuente de reloj para la Captura / Comparación del módulo.
Un esquema simplificado del Timer1
TEMPORIZADOR TMR1 RELOJ DE SELECCIÓN DE FUENTE
El bit TMR1CS del registro T1CON se utiliza para seleccionar la fuente de reloj para el Timer1:
F U E N T E D E R E L O J T M R 1 C S
Fosc / 4 0
T1CKI pin 1
Cuando la fuente de reloj interno está seleccionado, el par de registros TMR1H-TMR1L se incrementará
en múltiplos de pulsos Fosc según lo determinado por el pre-escalador.
Cuando la fuente de reloj externa está seleccionada, el temporizador puede operar ya sea como un
temporizador o un contador. Los pulsos de reloj en el modo de contador puede ser sincronizado con el
reloj del microcontrolador interno o ejecutar de forma asincrónica.
TIMER1 de Prescaler
Timer1 está provisto de un pre-escalador completamente independiente que permite la división 1, 2, 4 u 8
de la frecuencia de entrada de reloj. El prescaler no es directamente leer o escribir. Sin embargo, el
contador de prescaler se borra automáticamente después de escribir en el registro o TMR1H TMR1L.
OSCILADOR TIMER1 de
Los pasadores RC0/T1OSO y RC1/T1OSI son, sobre todo, utilizado para registrar los impulsos
procedentes de los módulos periféricos, pero también tienen una función adicional. Como puede verse en
la figura, que al mismo tiempo actúan como entrada (pin RC1) y salida (pin RC0) del oscilador de cuarzo
LP adicional (baja potencia). Este circuito está diseñado principalmente para el funcionamiento a bajas
frecuencias (hasta 200 KHz) y utiliza cristal de 32.768 KHz de cuarzo. Tal cristal es conveniente para los
relojes de cuarzo debido a que es fácil de obtener un segundo de duración pulsos dividiendo esta
frecuencia. Dado que la operación de este oscilador no depende del reloj interno, que es capaz de
funcionar incluso en modo de suspensión, que se habilita estableciendo el bit de control del registro
T1OSCEN T1CON. En este caso, es necesario proporcionar un retardo de tiempo corto (unos pocos
milisegundos) desde el software en aras de la estabilidad del oscilador de reloj.
Tabla siguiente contiene los valores recomendados de los condensadores que son, además de
cristal de cuarzo, integrado en el oscilador. Estos valores no son críticos y se aplica la siguiente
regla: cuanto mayor es la capacidad, mayor será la estabilidad, la cual, al mismo tiempo,
prolonga el tiempo necesario para la estabilidad del oscilador de reloj.
O S C I L A D O R F R E C U E N C I A C 1 C 2
LP
32 kHz 33 pF 33 pF
100 kHz 15 pF 15 pF
200 kHz 15 pF 15 pF
El consumo de energía del microcontrolador se minimiza en el modo de espera como el consumidor de
energía principal, el oscilador, no funciona. El microcontrolador se establece en este modo de ejecutar la
instrucción SLEEP. El problema es cómo despertar el microcontrolador, es decir, cómo generar una
interrupción que hace que suceda. Como el microcontrolador "duerme", una interrupción debe ser
activado por los módulos periféricos. Se hace aún más complicado si es necesario despertar al
microcontrolador a intervalos regulares de tiempo ...
El problema se resuelve mediante la incorporación de un oscilador de baja potencia totalmente
independiente de cuarzo capaz de operar en modo de suspensión en el microcontrolador PIC16F887. En
pocas palabras, el módulo que solía ser periférica, está ahora integrada en el microcontrolador y asignado
a la Timer1. El oscilador se activa fijando el bit T1OSCEN del registro T1CON. El bit TMR1CS se utiliza
entonces para permitir que el Timer1 utilizar impulsos generados por dicho oscilador.
Una señal generada por el oscilador de cuarzo está sincronizado con el reloj del
microcontrolador en la limpieza de la broca T1SYNC. En este caso, el temporizador no puede funcionar en modo de reposo porque el circuito de sincronización utiliza el reloj del microcontrolador.
El registro TMR1 interrupción de desbordamiento se puede habilitar. Si el bit T1SYNC se establece, tales interrupciones también se producirá en modo de reposo.
PUERTA DEL TIMER1
La fuente de la puerta Timer1 es configurable por software para usar el pin T1G o la salida del
comparador C2. Esta puerta permite que el temporizador a las señales externas directamente de tiempo
utilizando el pasador T1G o señales analógicas utilizando la salida del comparador C2. Refiérase a la
figura en la página anterior. Con el fin de medir una duración de la señal, es suficiente para permitir esta
puerta y contar los impulsos en el registro TMR1.
TIMER1 en modo contador
Timer1 empieza a funcionar como un contador configurando el bit de TMR1CS. Cuenta impulsos
suministrados al pasador PC0/T1CKI y se incrementa en el borde ascendente en el pulso T1CKI reloj de
entrada externa. Si el bit de control T1SYNC del registro T1CON está desactivada, las entradas de reloj
externas se sincronizará antes de llegar al par de registros TMR1. En otras palabras, el Timer1 se
sincroniza con el reloj del microcontrolador, convirtiéndose en un contador síncrono.
Si el microcontrolador está en modo de suspensión, mientras que el Timer1 funciona como un contador,
los registros del temporizador TMR1H y TMR1L no será modificado a pesar de que los pines de entrada
se alimentan con pulsos. Dado que el reloj del microcontrolador no se ejecuta en modo de reposo, no hay
entradas de reloj que se utilizará para la sincronización. Sin embargo, el pre-escalador se mantendrá en el
funcionamiento de la medida de lo que hay pulsos de reloj en los pines, ya que es un divisor de frecuencia
simple.
Este contador registra un uno lógico (1) en los pines de entrada. Lo que pasa es que al menos un flanco
de bajada debe estar registrado antes de iniciar el conteo de pulsos. Refiérase a la figura de la
izquierda. Las flechas indican los incrementos del contador.
TIMER1 En el modo TIMER
Con el fin de establecer el modo de temporizador Timer1, es necesario borrar el bit TMR1CS. Después de
eso, cada pulso generado por el oscilador interno hará que el registro del temporizador de 16-bit para ser
incrementado. Si el cristal de cuarzo 4MHz está en uso, este registro se incrementa cada microsegundo.
En este modo, el bit T1SYNC no afecta el temporizador ya que cuenta impulsos de reloj internas
utilizadas por el microcontrolador y otros módulos internos. Por lo tanto no hay necesidad de
sincronización.
El reloj del microcontrolador no funciona en modo de reposo para que el exceso del temporizador registro
no puede causar una interrupción en este modo.
' In this example, Timer1 is configured as a timer with the
prescaler rate 1:8. Every time
' TMR1H and TMR1L registers overflow occurs, an interrupt will
be requested.
main:
...
PIR1.TMR1IF = 0 ' Reset the TMR1IF flag bit
TMR1H = 0x22 ' Set initial value for the Timer1
TMR1L = 0x00
T1CON.TMR1CS = 0 ' Timer1 counts pulses from internal
oscillator
T1CON.T1CKPS0 = 1 ' Assigned prescaler rate is 1:8
T1CON.T1CKPS1 = 1
PIE1.TMR1IE = 1 ' Enable interrupt on overflow
INTCON = 0xC0 ' Enable interrupt (bits GIE and PEIE)
T1CON.TMR1ON = 1 ' Turn the Timer1 on
...
T1CON Registrarse
Los bits del registro T1CON está en control de la operación Timer1.
T1GINV - Timer1 Puerta Invertir actos de bits como un inversor de estado lógico en la puerta pasador
T1G o la salida del comparador C2 (C2OUT) puerta. Permite que el temporizador para contar los pulsos
mientras la puerta está alta o baja.
1 - Temporizador 1 cuenta cuando el pasador T1G o puerta C2OUT bits es alta (1).
0 - Temporizador 1 cuenta cuando el pasador T1G o puerta C2OUT bits es baja (0).
TMR1GE - Timer1 Puerta de bit de habilitación determina si el pin T1G o el comparador C2 com salida
(C2OUT) la puerta se activa o no.Este bit se activa sólo cuando el Timer1 está encendido (TMR1ON bit =
1). De lo contrario, se ignora.
1 - Timer1 se activa sólo cuando la puerta Timer1 no está activo.
0 - Puerta de no afectar el funcionamiento del Timer1.
T1CKPS1, T1CKPS0 - determinar la tasa de la pre-escalador asignado al Timer1.
T 1 C K P S 1 T 1 C K P S 0 P R E S C A L E R T A R I F A
0 0 01:01
0 1 01:02
1 0 01:04
1 1 01:08
T1OSCEN - Oscilador LP Bit de habilitación de control
1 - Oscilador LP está habilitado para el reloj de Timer1 (oscilador de baja potencia con una frecuencia de 32,768 kHz).
0 - Oscilador LP está desactivado.
T1SYNC - Timer1 entrada externa de reloj de sincronización de bits de control permite la entrada del
oscilador LP o el pin de entrada T1CKI para sincronizarse con el reloj del controlador interno de micro. El
bit es ignorado mientras impulsos suministrados desde la fuente de reloj se cuentan microcontrolador
(TMR1CS bits = 0).
1 - Entrada de sincronización no se sincronizarán ..
0 - entrada de reloj externo se sincronizarán ..
- Temporizador TMR1 TMR1CS Fuente del Reloj Seleccione bits
1 - Contar pulsos en el pin T1CKI (en el flanco ascendente 0-1).
0 - Recuento de impulsos generados por el reloj del microcontrolador.
TMR1ON - Timer1 En poco
1 - Timer1 habilitado.
0 - Timer1 personas con discapacidad.
En Corto
Con el fin de utilizar el Timer1 correctamente, es necesario hacer lo siguiente:
Dado que no es posible apagar el pre-escalador, su tasa debe ser ajustado mediante el uso de los bits T1CKPS1 y T1CKPS0 de la T1CON registro (Consulte la tabla anterior).
Seleccione el modo apropiado con la broca de la TMR1CS T1CON registro. (TMR1CS: 0 = la fuente de reloj es oscilador interno de cuarzo, 1 = el reloj se suministra externamente).
Al establecer el bit T1OSCEN del mismo registro, el oscilador se activa y los registros TMR1H y TMR1L se incrementan en cada pulso de reloj. Contar las paradas en la limpieza de este bit.
El prescaler se borra en la limpieza o escribiendo a los registros del contador.
Cuando los dos registros del temporizador están llenas de seres y un occures de desbordamiento, la bandera TMR1IF se establece y comienza el conteo desde cero.
3,6 Timer2
Timer2 es un temporizador de 8-bits que opera en una manera específica.
Impulsos generados por el oscilador de cuarzo pase primero a través del divisor de la tasa de los cuales
se puede cambiar con los T2CKPS1 y T2CKPS0 bits. La salida del precontador se utiliza entonces para
incrementar el registro TMR2 a partir de las 00h. Los valores de TMR2 y PR2 registros se comparan todo
el tiempo y el TMR2 se incrementa constantemente hasta que coincida con el valor almacenado en
PR2. Cuando el partido se produce, el registro TMR2 se borra automáticamente. El postscaler Timer2 se
incrementa en cada partido y su producción se utiliza para generar una interrupción si está habilitada.
Los registros TMR2 y PR2 son de lectura y escritura. Contando puede ser detenido en la limpieza de la
broca TMR2ON, lo que reduce el consumo de energía.
El momento de la reposición Timer2 también puede utilizarse como una señal de comunicación de reloj de
serie.
El funcionamiento del Timer2 está bajo el control de varios bits de la T2CON registro.
T2CON Registrarse
TOUTPS3 - TOUTPS0 - Timer2 salida Postcaler bits de selección se utilizan para determinar la tasa de
postscaler de acuerdo con la siguiente tabla:
T O U T P S 3 T O U T P S 2 T O U T P S 1 T O U T P S 0 P O S T S C A L E R T A R I F A
0 0 0 0 01:01
0 0 0 1 01:02
0 0 1 0 01:03
0 0 1 1 01:04
0 1 0 0 01:05
0 1 0 1 01:06
0 1 1 0 01:07
0 1 1 1 01:08
1 0 0 0 01:09
1 0 0 1 01:10
1 0 1 0 01:11
1 0 1 1 01:12
1 1 0 0 01:13
1 1 0 1 01:14
1 1 1 0 01:15
1 1 1 1 01:16
TMR2ON - Timer2 En poco convierte el Timer2 sucesivamente.
1 - Timer2 está encendido.
0 - Timer2 está apagado.
T2CKPS1, T2CKPS0 - Timer2 Clock bits de preescala determinar la tasa de prescaler:
T 2 C K P S 1 T 2 C K P S 0 P R E S C A L E R T A R I F A
0 0 01:01
0 1 01:04
1 x 01:16
En Corto
Cuando se utiliza el Timer2, tenga en cuenta los siguientes datos relacionados con sus registros:
En el momento del encendido, el registro PR2 contiene el valor FFh.
Tanto el pre-escalador y postscaler han sido aprobados por escrito al registro TMR2.
Tanto el pre-escalador y postscaler han sido aprobados por escrito al registro T2CON.
En cualquier reajuste - que supongo que, tanto pre-escalador y postscaler se borran.
3.7 módulos CCP
Módulos CCP se puede configurar para operar en varios modos diferentes, lo que hace a los periféricos
más complicado de manejar.Simplemente tratar de analizar su funcionamiento utilizando los cuadros que
describen las funciones de bit y usted entenderá lo que estamos hablando. Por lo tanto, cuando se utiliza
uno de los módulos CCP, primero seleccione el modo que usted necesita, analizar la figura apropiada, a
continuación, cambiar los bits de los registros. O si no ...
El módulo CCP (Captura / Comparación / PWM) es un periférico que permite al usuario el tiempo y el
control de diferentes eventos. Como su nombre lo indica, se puede configurar para funcionar en tres
modos diferentes:
Modo de captura proporciona un acceso al estado actual de un registro que cambia constantemente su
valor. En este caso, es el temporizador de registro TMR1.
Modo de comparación compara constantemente los valores de dos registros. Uno de ellos es el
temporizador de registro TMR1.
PWM (Pulse Width Modulation) puede generar señales de diferente frecuencia y ciclo de trabajo en uno o
más pines de salida.
Hay dos módulos CCP integrados en el microcontrolador PIC16F887 - CCP1 y CCP2. Ellos son casi
idénticos en funcionamiento con la diferencia de características mejoradas de PWM disponibles en el
módulo CCP1 solamente. En este capítulo se ofrece una descripción detallada de este módulo. Como
para el módulo CCP2, sólo las características que lo distinguen de CCP1 será cubierto.
MÓDULO CCP1
El corazón del módulo CCP1 es una CCPR1 16-bit del registro que se compone de dos registros CCPR1L
y CCPR1H. Se utiliza para la captura de números binarios desde el temporizador registro TMR1 (TMR1H
y TMR1L) o la comparación de números binarios almacenados en los registros CCPR1 y TMR1.
Si está habilitado por el software, el temporizador TMR1 registro de reposición puede ocurrir en cualquier
partido en el modo de comparación. Además, el módulo CCP1 es capaz de generar señales PWM de
frecuencia variable y ciclo de trabajo.
Los bits del registro CCP1CON están en el control del módulo CCP1.
CCP1 en modo de captura
En este modo, el registro CCP1 (que consiste en la CCPR1H y un par CCPR1L registro) captura un valor
de 16-bit del temporizador TMR1 registro (que consiste en la TMR1H y un par TMR1L registro) cuando
uno de los siguientes eventos en el RC2/CCP1 pin:
Cada flanco de bajada (1 -> 0);
Cada flanco ascendente (0 -> 1);
Cada arista cuarta ascendente (0 -> 1), y
Cada arista 16a ascendente (0 -> 1).
¿Cuál de estos eventos hacen que un conjunto de datos de 16 bits para ser capturados depende de la
combinación de cuatro bits (CCP1M3, CCP1M2, CCP1M1 y CCP1M0) del registro de control. Además, las
siguientes condiciones deben cumplirse:
El pasador RC2/CCP1 debe ser configurado como entrada, y
El módulo Timer1 debe funcionar como un temporizador o un contador síncrono.
El bit de bandera CCP1IF se establece cuando la captura se hace. Si el bit del registro CCP1IE PIE1 se
establece cuando ocurre, se produce una interrupción.
Cuando las salidas del módulo CCP1 el modo de captura, una interrupción no deseada de captura se
puede generar. Con el fin de evitar esto, tanto el bit de permitir la interrupción CCP1IE y el bit de bandera
CCP1IF debe ser limpiado antes de realizar cualquier cambio en el registro de control CCP1CON.
Una interrupción no deseada también se puede generar cuando se cambia de una tasa de pre-escalador
a otro. Para evitar esto, el módulo CCP1 debe ser temporalmente apagado antes de cambiar la tasa de
pre-escalador. Es recomendable utilizar la siguiente secuencia de programa escrito en lenguaje
ensamblador:
BANKESEL CCP1CON
CLRF CCP1CON 'CONTROL REGISTER IS CLEARED
'CCP1 MODULE IS OFF
MOVLW XX 'NEW PRESCALER MODE IS SELECTED
MOVWF CCP1CON 'NEW VALUE IS LOADED INTO THE CONTROL REGISTER
'CCP1 MODULE IS SIMULTANEOUSLY SWITCHED ON
Let's do it in mikroBasic...
...
asm
BANKESEL CCP1CON
CLRF CCP1CON ' CONTROL REGISTER IS CLEARED
' CCP1 MODULE IS OFF
MOVLW XX ' NEW PRESCALER MODE IS SELECTED
MOVWF CCP1CON ' NEW VALUE IS LOADED INTO THE CONTROL REGISTER
' CCP1 MODULE IS SIMULTANEOUSLY SWITCHED ON
end asm
...
CCP1 en modo de comparación
En este modo, el valor almacenado en el registro CCP1 se compara constantemente con el valor
almacenado en el registro del temporizador TMR1. Cuando se produce una coincidencia, el estado lógico
de la patilla de salida RC2/CCP1 puede ser cambiado, que depende del estado de bits en el registro de
control (CCP1M3 - CCP1M0). El bit de bandera CCP1IF se establece al mismo tiempo.
Para configurar el módulo CCP1 para funcionar en el modo de comparación, dos condiciones deben
cumplirse:
El pasador RC2/CCP1 se debe configurar como una salida, y
Timer1 debe estar sincronizado con el reloj interno.
CCP1 en modo PWM
Secuencias de impulsos con una frecuencia de pulso variable y ciclo de trabajo tienen una amplia gama
de aplicaciones en la automatización. Un ejemplo típico es una unidad de control de potencia. Refiérase a
la figura de abajo. Si un cero lógico (0) indica un estado de desconexión y una lógica uno (1) indica un
estado switchon, la energía eléctrica para alimentar a un consumidor con será directamente proporcional
a la duración del impulso. Esta relación se conoce como ciclo de trabajo.
Otro ejemplo, también es común en la práctica, es el uso de señales PWM en señal de unidades
generadoras para producir señales de formas de onda arbitrarias, como forma de onda sinusoidal. Vea la
siguiente figura:
Los dispositivos que operan con señales PWM se utilizan comúnmente en la práctica como controladores
de frecuencia ajustable para controlar el funcionamiento de los motores eléctricos (velocidad, aceleración,
deceleración, etc.)
La figura anterior muestra un diagrama de bloques del conjunto módulo CCP1 a modo PWM. Con el fin de
generar un pulso de ciclo de trabajo arbitrario en su pin de salida, es necesario establecer período de
pulso (frecuencia) y duración del impulso del primero.
PWM PERÍODO
La salida PWM período de impulso (T) depende del valor almacenado en el registro PR2 del Timer2. Se
calcula por medio de la siguiente ecuación:
Período PWM = (PR2 +1) * 4Tosc * TMR2 pre-escala de valor
Si el período de PWM (T) es conocido, es fácil calcular la frecuencia de la señal (F) ya que estos dos
valores están relacionadas por la ecuación F = 1 / T.
PWM ANCHO DE PULSO
La anchura de impulsos PWM está determinado por medio de 10 bits en total: todos los bits (ocho en
total) del registro CCPR1L como MSB y dos bits del registro CCP1CON como LSBs (DC1B1 y DC1B0). El
resultado es un número de 10-bits contenidos en la fórmula:
Ancho de pulso = (CCPR1L, DC1B1, DC1B0) * Tosc * TMR2 pre-escala de valor
La siguiente tabla muestra cómo generar señales PWM de frecuencia variable, si el microcontrolador
utiliza un 20 MHz con cristal de cuarzo (Tosc = 50ns).
F R E C U E N C I A [ K H Z ] 1 , 2 2 4 , 8 8 1 9 , 5 3 7 8 , 1 2 1 5 6 , 3 2 0 8 , 3
TMR2 Prescaler 16 4 1 1 1 1
PR2 Registrarse FFh FFh FFh 3Fh 1Fh 17h
Sólo dos cosas más:
El pin de salida será constantemente establecer si la anchura de impulso es por negligencia dispuesto a ser más grande que período de PWM.
En este caso, el postscaler Timer2 no puede ser utilizado para la generación de largos períodos de PWM.
Resolución de la señal PWM
Una señal PWM es nada más que una secuencia de impulsos con diversos ciclo de trabajo. Para una
frecuencia específica (número de pulsos por segundo), hay un número limitado de combinaciones de
ciclos de trabajo. La resolución es el número máximo de combinaciones del ciclo de trabajo medido en
bits. Por ejemplo, una resolución de 10-bits se traducirá en 1024 ciclos de trabajo discretos, mientras que
una resolución de 8-bits se traducirá en 256 ciclos de trabajo discretos etc En cuanto a este
microcontrolador, la resolución depende de los contenidos del registro PR2. La resolución máxima se
obtiene mediante la escritura número FFh a dicho registro.
Las frecuencias de las señales PWM y resoluciones (Fosc = 20MHz):
F R E C U E NC I A P W M
1 . 2 2 KH Z
4 . 8 8 KH Z
1 9 . 5 3 KH Z
7 8 . 1 2 KH Z
1 5 6 . 3 KH Z
2 0 8 . 3 KH Z
Temporizador de pre-escala
16 4 1 1 1 1
PR2 Valor FFh FFh FFh 3Fh 1Fh 17h
Resolución máxima
10 10 10 8 7 6
Las frecuencias de las señales PWM y resoluciones (Fosc = 8MHz):
F R E C U E NC I A P W M
1 . 2 2 KH Z
4 . 9 0 KH Z
1 9 . 6 1 KH Z
7 6 . 9 2 KH Z
1 5 3 . 8 5 KH Z
2 0 0 . 0 KH Z
Temporizador de pre-escala
16 4 1 1 1 1
PR2 Valor 65h 65h 65h 19h 0Ch 09h
Resolución máxima
8 8 8 6 5 5
Vamos a hacerlo en mikroBasic ...
' In this example, PWM module is initialized and set to give a
pulse train of 50% duty-
' cycle. Functions PWM1_Init(), PWM1_Start() and
PWM1_Set_Duty() are used for this
' purpose. All of them are already contained in the mikroBasic
PRO for PIC PWM library
' and just need to be copied to the program.
dim duty_c as byte ' Define variable duty_c
...
sub procedure InitMain()
ANSEL,ANSELH = 0 ' All I/O pins are configured as digital
PORTC,TRISC = 0 ' Initial state of port C output pins
PWM1_Init(5000) ' PWM module initialization (5KHz)
end sub
main:
InitMain()
duty_c = 127 ' Initial value of duty-cycle
PWM1_Start ' Start PWM1 module
PWM1_Set_Duty(duty_c) ' Set PWM duty-cycle to 50%
...
...
CCP1CON Registrarse
P1M1, P1M0 - PWM bits de configuración de salida - El pin P1A siempre se configura como una entrada
en la captura / modo de comparación. Pines P1B, P1C y actuar como puerto PORTD P1D entrada / salida
de pines.
P 1 M 1 P 1 M 0 M O D O
0 0
PWM con salida única
Pin P1A emite la señal modulada. Pines P1B, P1C y P1D son puerto de entrada de D / salida
0 1 Full Bridge - Configuración Adelante
Pin P1D emite la señal modulada
Pin P1A está activo Pines P1B y P1C están inactivos
1 0
La mitad de configuración de puente
Pasadores P1A y P1B señal de salida modulada PinsP1C y P1D son entradas de los puertos D y salidas
1 1
Full Bridge - configuración inversa
Pin P1B emite la señal modulada Pin P1C está activo
Pines P1A y P1D están inactivos
DC1B1, DC1B0 - PWM fragmentos de ciclos de trabajo menos importantes - sólo se utilizan en el modo
PWM en el que se representan dos bits menos significativos de un número de 10 bits. Este número se
utiliza para determinar el ciclo de trabajo de una señal PWM. El resto de bits (8 en total) se almacenan en
el registro CCPR1L.
CCP1M3 - CCP1M0 bits - se utilizan para seleccionar el modo de funcionamiento del Módulo CCP1.
C C P 1 M 3 C C P 1 M 2 C C P 1 M 1 C C P 1 M 0 M O D O
0 0 0 0 El módulo está desactivada (reset)
0 0 0 1 No usado
0 0 1 0 Comparar el modo de
CCP1IF bits se encuentra en juego
0 0 1 1 No usado
0 1 0 0
Modo de captura
Cada flanco descendente en el pin CCP1
0 1 0 1
Modo de captura
Cada flanco ascendente en el pin CCP1
0 1 1 0
Modo de captura
Cada borde de cuarto creciente en el pin CCP1
0 1 1 1
Modo de captura
Cada arista 16a aumento en el pin CCP1
1 0 0 0
Comparar el modo de
De salida y el bit CCP1IF se
establecen en el partido del
1 0 0 1
Comparar el modo de
La salida se borra y poco CCP1IF se establece en el partido del
1 0 1 0 Comparar el modo de
Solicitud de interrupción llega y
CCP1IF bit se establece en el partido
1 0 1 1
Comparar el modo de
CCP1IF bit está establecido, y
contadores de tiempo de 1 o 2 registros se borran
1 1 0 0
Modo PWM
Pines P1A y P1C están activos de alta Pines P1B y P1D están activos de alta
1 1 0 1
Modo PWM
Pines P1A y P1C están activos de alta Pines P1B y P1D están activos bajo
1 1 1 0
Modo PWM
Pines P1A y P1C están activos bajo
Pines P1B y P1D están activos de alta
1 1 1 1
Modo PWM
Pines P1A y P1C están activos bajo Pines P1B y P1D están activos bajo
MÓDULO CCP2
Independientemente de los nombres de diferentes registros y bits en los módulos CCP1 y CCP2, el
módulo CCP2 representa una copia fiel del módulo CCP1 configurado para funcionar en modo normal
(capturar y comparar). Sólo hay una cosa que hace que el CCP2 diferente cuando se opera en el modo
de comparación.
Es la señal de reposición Timer1. Es decir, si el convertidor A / D está habilitada, en el momento en que
los valores de los registros TMR1 y CCPR2 partido, la señal de reinicio del temporizador Timer1 se
iniciará automáticamente el proceso de conversión A / D.
El módulo CCP2 está también bajo el control de los bits de control del registro. Esta vez, es el registro
CCP2CON.
CCP2CON Registrarse
DC2B1, DC2B0 - PWM fragmentos de ciclos de trabajo menos importantes - sólo se utilizan en el modo
PWM en el que se representan dos bits menos significativos de un número de 10 bits. Este número se
utiliza para determinar el ciclo de trabajo de una señal PWM. El resto de bits (8 en total) se almacenan en
el registro CCPR2L.
CCP2M3 - CCP2M0 bits - se utilizan para seleccionar el modo de funcionamiento del módulo CCP2.
C C P 2 M 3 C C P 2 M 2 C C P 2 M 1 C C P 2 M 0 M O D O
0 0 0 0 El módulo está desactivada (reset)
0 0 0 1 No usado
0 0 1 0 No usado
0 0 1 1 No usado
0 1 0 0
Modo de captura
Cada flanco descendente en el pin CCP2
0 1 0 1
Modo de captura
Cada borde de sensibilización sobre la pin CCP2
0 1 1 0
Modo de captura
Cada borde de cuarto creciente en el pin CCP2
0 1 1 1
Modo de captura
Cada arista 16a aumento en el pin
CCP2
1 0 0 0
Comparar el modo de
De salida y el bit CCP2IF se
establecen en el partido del
1 0 0 1
Comparar el modo de
La salida se borra y poco CCP2IF se establece en el partido del
1 0 1 0
Comparar el modo de
La interrupción se genera poco CCP2IF se establece y el pin CCP2 no
se ve afectado el partido
1 0 1 1
Comparar el modo de
En Mach, poco CCP2IF se establece, Timer 1 registros se borran y la
conversión A / D se inicia si el convertidor A / D está habilitada.
1 1 x x Modo PWM
En Corto Configuración CCP1 módulo a modo PWM
Con el fin de establecer el módulo CCP1 para funcionar en el modo PWM, los siguientes pasos se deben
tomar:
Deshabilitar el pin de salida CCP1 (configurarlo como un insumo).
Establecer el período de PWM escribiendo un valor en el registro PR2.
Establecer el módulo CCP1 para operar en el modo PWM mediante la combinación de bits del registro CCP1CON.
Ajuste el ciclo de trabajo de la señal PWM escribiendo un valor en el registro y el uso de los bits CCPR1L DC1B1 y DC1B0 del registro CCP1CON.
Configurar e iniciar Timer2: o Desactive la bandera de interrupción TMR2IF del registro PIR1.
o Establecer el valor Timer2 preescala utilizando los bits T2CKPS1 y T2CKPS0 del registro T2CON.
o Ejecute el Timer2 al establecer el bit TMR2ON del registro T2CON.
Habilitar pines PWM de salida después de un ciclo PWM se ha completado: o Espere a que el desbordamiento del Timer2 (el bit de la TMR2IF PIR1register está establecido).
o Configurar el pin correspondiente como salida en la limpieza de un bit del registro TRIS.
CCP1 en modo mejorado
El modo mejorado está disponible en el módulo CCP1 solamente. El conjunto CCP1 para operar en el
modo mejorado básicamente no difiere de la CCP1 en modo normal. La mejora en realidad se refiere a la
transmisión de señales PWM a los pines de salida. Es un detalle importante porque los
microcontroladores se utilizan cada vez más en los sistemas eléctricos de control de motores. Estos
dispositivos no se describen en este documento, pero si alguna vez han tenido la oportunidad de trabajar
con dispositivos similares, se reconocen algunas unidades que, hasta hace muy poco, fueron utilizados
como módulos independientes adicionales. Hoy en día están integrados en los microcontroladores y
puede funcionar en varios modos diferentes.
SOLA SALIDA MODO PWM
Una sola salida PWM modo se activa sólo cuando los bits P1M1 y P1M0 del registro CCP1CON se
borran. En este caso, una señal PWM puede estar disponible en hasta cuatro pines de salida diferentes al
mismo tiempo. Además, la señal PWM puede aparecer ya sea en forma de onda básica o
invertida. Distribución de la señal depende de bits del registro PSTRCON, mientras que su polaridad
depende de las CCP1M1 y CCP1M0 bits del registro CCP1CON.
Si una salida invertida se utiliza, los pines son de baja actividad, y los pulsos con la misma forma de onda
se generan siempre en parejas: en el P1A y P1C pernos y pasadores P1B y P1D, respectivamente.
MEDIA MODO DE PUENTE
En el modo de medio puente, el pasador P1A se alimenta con una señal PWM, mientras que el pasador
P1B es al mismo tiempo alimenta con la señal PWM complementaria. Estos pulsos transistores MOSFET
de accionamiento en la configuración de medio puente, que activar / desactivar la corriente pase a través
de la carga.
No encienda dos transistores MOSFET simultáneamente como la corriente de cortocircuito que puede ser
causada por lo tanto va a ser fatal. Con el fin de evitar esto, es necesario esperar un tiempo de
conmutación entre los conductores de encendido y apagado. Este retardo de tiempo, marcado como 'td'
en la siguiente figura, se proporciona por medio de bits PDC0-PDC6 del registro PWM1CON.
Como puede verse en la figura a continuación, el modo de medio puente también puede ser utilizado para
conducir los transistores MOSFET en la configuración de puente completo:
FULL-BRIDGE MODE
Todos los cuatro pasadores se configuran como salidas en el modo de puente completo. En la práctica,
este modo de funcionamiento se utiliza comúnmente para el funcionamiento de los motores, ya que
proporciona un control sencillo y lleno de velocidad y dirección de rotación. Hay dos configuraciones de
este modo: Full Bridge-Forward y Full Bridge-Reverse.
Puente completo - CONFIGURACIÓN DE ADELANTE
En la configuración de puente completo hacia adelante en los siguientes casos:
Una lógica de un (1) aparece en el pin P1A (pin está activo-alto);
Secuencia de impulsos aparece en el pin P1D; y
Una lógica cero (0) aparece en los pines P1B y P1C (pines están activos-bajo).
La siguiente figura muestra el estado de los pines P1A-P1D durante un ciclo completo de PWM.
Puente completo - configuración inversa
La configuración inversa puente completo es similar a la configuración antes mencionada, sólo que los
pasadores tienen diferentes funciones:
Una lógica de un (1) aparece en el pin P1C (pin está activo-alto);
Secuencia de impulsos aparece en el pin P1B, y
Una lógica cero (0) aparece en la P1A y P1D pines (pines están activos-bajo).
PWM1CON Registrarse
PRSEN PWM Reinicie Bit de habilitación
1 - Una vez apagado automático, el módulo PWM se reinicia automáticamente, mientras que el bit del registro ECCPASE ECCPAS se borra.
0 - Con el fin de reiniciar el módulo PWM al auto-apagado, el bit ECCPASE debe ser limpiado desde el software.
PDC6 - PDC0 PWM bits de recuento de retraso - Un número binario 7-dígitos determina el número de
ciclos de instrucción (4 * Tosc) usado como un retardo de tiempo durante la activación de pines de salida
PWM.
PSTRCON Registrarse
STRSYNC - bits de dirección Sync ajusta el tiempo de la reorientación de pulso PWM:
1 - Redirigir se produce después de modificar el registro PSTRCON, pero no hasta la forma de onda PWM es completa.
0 - Redirigir se produce después de modificar el registro PSTRCON. La señal PWM en el pin de salida se cambió inmediatamente sin tener en cuenta si el ciclo anterior se ha completado o no. Tal reorientación se utiliza cuando una señal PWM tiene que ser eliminado de la immediatley pasador.
STRD - Dirección Activar bit D determina la función del pin P1D.
1 - El pin P1D se alimenta con una señal PWM la polaridad de la cual es controlada por los CCP1M0 y CCP1M1 bits.
0 - Pin está configurado como un puerto de entrada general, PORTD / salida.
Dirección STRC Activar bit C determina la función del pin P1C.
1 - El pin P1C se alimenta con una señal PWM la polaridad de la cual es controlada por los CCP1M0 y CCP1M1 bits.
0 - Pin está configurado como un puerto de entrada general, PORTD / salida.
STRB - Dirección Activa B bits determina la función del pin P1B.
1 - El pin P1B se alimenta con la señal PWM la polaridad de la cual es controlada por los CCP1M0 y CCP1M1 bits.
0 - Pin está configurado como un puerto de entrada general, PORTD / salida.
STRA - Dirección Activa bits determina la función del pin P1A.
1 - El pin P1A se alimenta con la señal PWM la polaridad de la cual es controlada por los CCP1M0 y CCP1M1 bits.
0 - Pin está configurado como un puerto de entrada general, PORTC / salida.
ECCPAS Registrarse
ECCPASE - Auto-apagado PECC bit de estado indica si el evento estado de cierre del módulo CCP se
ha producido:
1 - módulo CCP está en el estado de cierre.
0 - módulo CCP opera con normalidad.
ECCPAS2 - ECCPAS0 - PECC Auto Shutdown-bits de origen Select se utilizan para seleccionar el
auto apagado Estado de la fuente:
E C C P A S 2 E C C P A S 1 E C C P A S 0 S H U T H O W N E S T A D O D E L A F U E N T E
0 0 0 Estado de cierre desactivada
0 0 1 Comparador C1 cambio en la salida
0 1 0 Comparador C2 cambio de salida
0 1 1 El comparador C1 o C2 cambio de salida
1 0 0 La lógica cero (0) en el pin INT
1 0 1 La lógica cero (0) en el pin INT o cambio
comparador C1 de salida
1 1 0 La lógica cero (0) en el pin INT o cambio
comparador la salida C2
1 1 1 La lógica cero (0) en el pin INT o cambio
comparador la salida C1 o C2
PSSAC1, PSSAC0 - Pins P1A, P1C de cierre de los bits de control del Estado definir el estado lógico
de la salida de pines P1A y P1C cuando el módulo CCP está en el estado de apagado.
P S S A C 1 P S S A C 0 P I N E S E S T A D O L Ó G I C O
0 0 0
0 1 1
1 X De alta impedancia (Tri-State)
PSSBD1, PSSBD0 - P1B Pins, P1D de cierre de los bits de control del Estado definir el estado lógico
de la salida de pines P1B y P1D cuando el módulo CCP está en el estado de apagado.
P S S B D 1 P S S B D 0 P I N E S E S T A D O L Ó G I C O
0 0 0
0 1 1
1 X De alta impedancia (Tri-State)
3.8 MÓDULOS DE COMUNICACIÓN DE SERIE
El microcontrolador PIC16F887 tiene varios módulos independientes de comunicación en serie y cada
uno de ellos puede ser configurado para operar en varios modos diferentes, que las hacen insustituible en
muchas situaciones. Recuerde lo que le aconseja acerca de los módulos CCP que el mismo se aplica
aquí. ¿No te cargues con detalles sobre el funcionamiento de todos ellos, sólo tienes que seleccionar uno
y aprender sólo lo que realmente necesita.
La USART es uno de los sistemas más antiguos de comunicación en serie. Las versiones modernas de
este sistema se actualizan y pidió un poco diferente - EUSART.
EUSART
El Mayor Conjunto de Receptor Universal Synchronous Asynchronous transmisor (EUSART) es
un módulo de E / S serie la unidad de comunicación periférica. También se conoce como
interfaz de comunicaciones en serie (SCI).Contiene todos los generadores de reloj, registros de
desplazamiento y los datos de buffers necesarios para realizar una transferencia de datos en
serie de forma independiente de la ejecución del programa principal. Como su nombre indica,
aparte de usar el reloj para la sincronización, este módulo también puede establecer conexión
asíncrona, que le hace único para algunas de las aplicaciones. Por ejemplo, en caso de que es
difícil o imposible para proporcionar canales especiales para la transferencia de reloj y de datos
(por ejemplo, la radio o el control remoto de infrarrojos), el módulo EUSART es definitivamente
la mejor solución posible.
El sistema EUSART integrado en el microcontrolador PIC16F887 tiene las siguientes características:
Full-duplex asíncrono de transmisión y recepción;
Programable 8 - o caracteres anchos 9-bit;
De detección de direcciones en el modo de 9-bit;
Desbordamiento de búfer de entrada de la detección de errores, y
Half-duplex de comunicación en modo síncrono. EUSART en modo asíncrono
El EUSART transmite y recibe datos utilizando un estándar de no retorno a cero (NRZ) en formato. Como
puede verse en la figura a continuación, este modo no utiliza la señal de reloj, mientras que el formato de
datos que están siendo transferidos es muy sencillo:
Brevemente, cada datos se transfieren de la siguiente manera:
En estado de reposo, la línea de datos tiene un nivel lógico alto (1);
Cada transmisión de datos se inicia con el bit de inicio que siempre es un cero (0);
Cada dato es de 8 - o 9-bits de ancho (el bit LSB se transfiere primero), y
Cada transmisión de datos termina con el bit de parada, que es siempre un uno (1).
La figura siguiente muestra una forma común de conectar un microcontrolador PIC con el módulo
EUSART. El circuito RS-232 se utiliza como un convertidor de nivel de tensión.
TRANSMISOR EUSART ASÍNCRONO
A fin de permitir la transmisión de datos a través del módulo EUSART, es necesario configurar este
módulo para funcionar como un transmisor. En otras palabras, es necesario definir el estado de los bits
siguientes:
TXEN = 1 - transmisor EUSART se habilita estableciendo el bit TXEN del registro TXSTA.
SYNC = 0 - EUSART está configurado para funcionar en modo asíncrono limpiando el bit SYNC del registro TXSTA.
SPEN = 1 - Al establecer el bit SPEN del registro RCSTA, EUSART está habilitado y el pin TX / CK se configura automáticamente como una salida. Si este bit se utiliza simultáneamente para alguna función analógica, debe ser desactivado por despejar el bit correspondiente del registro ANSEL.
La parte central del transmisor EUSART es el TSR registro de desplazamiento que no es directamente
accesible por el usuario. Con el fin de iniciar la transferencia de datos, el transmisor EUSART debe ser
habilitada por la configuración del bit TXEN del registro TXSTA. Los datos que se envíen deben ser
escrito en el registro TXREG, haciendo así que la siguiente secuencia de eventos que se produzca:
Byte será inmediatamente transferido al registro de desplazamiento TSR;
El registro TXREG queda vacío, lo cual se indica mediante el establecimiento de la TXIF bit de bandera del registro PIR1. Si el bit del registro TXIE PIE1 se establece, entre otras una Rupt se generará. Sin embargo, el indicador se establece con independencia de que uno entre Rupt está habilitada o no y que no se puede borrar por software, pero al escribir nuevos datos en el registro TXREG.
La electrónica de control "empuja" los datos hacia el pin TX en sincronización con el reloj interno: bit de START (0) ...los datos ... Bit de parada (1).
Cuando la última abandona el registro TSR, el bit del registro TRMT TXSTA se ajusta automáticamente.
Si el registro TXREG ha recibido un dato nuevo carácter en el entretanto, todo el procedimiento se repitió inmediatamente después del bit de parada del carácter anterior se ha transmitido.
La transferencia de datos de 9-bit se habilita estableciendo el bit TX9 del registro TXSTA. El bit TX9D del
registro TXSTA es el noveno bit de datos y la más significativa. Cuando la transferencia de 9 - bits de
datos, el bit de datos TX9D debe estar escrito antes de escribir los 8 bits menos significativos en el
registro TXREG. Los nueve bits de datos se transfieren al desplazamiento TSR registrar inmediatamente
después de la escritura TXREG es completa.
EUSART RECEPTOR ASÍNCRONO
Similar a la activación del transmisor EUSART, con el fin de permitir que el receptor es necesario para
configurar los bits siguientes:
CREN = 1 - receptor EUSART se habilita estableciendo el bit CREN del registro RCSTA;
SYNC = 0 - EUSART está configurado para funcionar en modo asíncrono limpiando el bit SYNC almacenado en el registro TXSTA, y
SPEN = 1 - Al establecer el bit SPEN del registro RCSTA, EUSART está habilitado y el pin RX / DT se configura automáticamente como una entrada. Si este bit se utiliza simultáneamente para alguna función analógica, debe ser desactivado por despejar el bit correspondiente del registro ANSEL.
Cuando este primer paso y necesario se lleva a cabo y el bit de inicio se detecta, los datos se transfieren
al registro de desplazamiento RSR a través del pasador RX. Cuando el bit de parada se ha recibido,
ocurre lo siguiente:
Los datos se envían automáticamente al registro RCREG (si está vacío);
El RCIF bit de bandera está establecida y una interrupción, si está habilitada por el bit RCIE del registro PIE1 ocurre,.Al igual que en el transmisor, el bit de flag se borra automáticamente al leer el registro RCREG. Tenga en cuenta que se trata de un registro de dos caracteres FIFO (primero en entrar, primero en salir) que permite una recepción simultánea de dos bytes de datos;
SiInm el registro RCREG está ocupado (contiene dos bytes) y el registro de desplazamiento detecta poco nueva parada, el OERR bit de desbordamiento se establecerá. En este caso, unos nuevos datos procedentes se pierde, y el bit OEER debe ser limpiado por el software. Se lleva a cabo en la limpieza y reposición del bit CREN; Nota: no es posible recibir nuevos datos en la medida que el bit OERR se establece.
Si el bit de parada es accionado bajo (0), el bit FERR del registro RCSTA detectar recibir el error se establecerá, y
Para permitir la recepción de 9-bit de datos, es necesario para establecer el bit RX9 del registro RCSTA.
RECIBIR LA DETECCIÓN DE ERRORES
Hay dos tipos de errores que el microcontrolador puede detectar automáticamente. El primero se
llama error de trama y se produce cuando el receptor no detecta el bit de parada en el momento
esperado. Tal error se indica mediante el bit FERR del registro RCSTA. Si este bit está establecido, los
últimos datos recibidos pueden ser incorrectos. Aquí hay varias cosas importantes a saber:
Un error de trama no genera una interrupción por sí mismo;
Si este bit está establecido, los últimos datos recibidos tiene un error;
Un error de trama (bit) no impide la recepción de nuevos datos;
El bit FERR se elimina mediante la lectura de los datos recibidos, lo que significa que el registro debe hacerse antes de la lectura de datos, y
El bit FERR no se puede borrar por software. Si es necesario, se puede borrar en la limpieza de la broca SPEN del registro RCSTA. Es al mismo tiempo hará que el sistema EUSART entero a poner a cero.
Hay dos tipos de errores que el microcontrolador puede detectar automáticamente. El primero se llama
error de trama y se produce cuando el receptor no detecta el bit de parada en el momento esperado. Tal
error se indica mediante el bit FERR del registro RCSTA. Si este bit está establecido, los últimos datos
recibidos pueden ser incorrectos. Aquí hay varias cosas importantes a saber:
Un error de trama no genera una interrupción por sí mismo;
Si el bit FERR se establece, los últimos datos recibidos tiene un error;
Un error de trama (bit) no impide que los nuevos datos de que se reciba;
El bit FERR se elimina mediante la lectura de los datos recibidos, lo que significa que el registro debe hacerse antes de la lectura de datos, y
El bit FERR no se puede borrar por software. Si es necesario, se puede borrar en la limpieza de la broca SPEN del registro RCSTA. Es al mismo tiempo hará que el sistema EUSART entero a poner a cero.
Otro tipo de error se llama error de desbordamiento. Como se mencionó anteriormente, la memoria FIFO
puede recibir dos bytes. Un error de desbordamiento se generará en el intento de recibir el tercer
personaje. En pocas palabras, no hay espacio para otro byte una y un error es inevitable. Cuando esto
sucede, el bit OERR del registro RCSTA se establece. Las consecuencias son las siguientes:
Los datos ya almacenados en los registros FIFO (dos bytes) puede ser normalmente leer;
No hay datos adicionales se recibirán hasta el bit OERR se borra, y
Este bit no se accede directamente. Para limpiarlo, es necesario borrar el bit CREN del registro de RCSTA o restablecer el sistema EUSART en la limpieza de toda el bit SPEN del registro RCSTA.
9-BIT de recepción de datos
Además de recibir estándar de 8-bits de datos, el sistema EUSART soporta 9-bits de recepción de
datos. En el lado de transmisión, el noveno bit es "adjunto" en el byte original directamente antes de que
el bit de STOP. En el lado de recepción, cuando el bit RX9 del registro RCSTA se establece, el noveno bit
de datos se escriben automáticamente en el bit RX9D del mismo registro. Después de recibir este byte, es
necesario tener cuidado de cómo leer los bits de los bits de datos RX9D deben leerse antes de la lectura
de 8 bits menos significativos del registro RCREG. De lo contrario, el bit de datos novena se borrará.
De detección de direcciones
Cuando el bit Adden del registro RCSTA está establecido, el módulo EUSART es capaz de recibir datos
sólo 9-bits, mientras que todos los datos de 8-bits será ignorada. Aunque parece una restricción, estos
modos permiten la comunicación en serie entre varios microcontroladores. El principio de funcionamiento
es simple. Dispositivo maestro envía una base de datos de 9 bits que representan la dirección del
microcontrolador esclavo. Sin embargo, todos ellos deben tener el conjunto de bits Adden ya que permite
la detección de dirección. Todos los microcontroladores esclavos, compartiendo la misma línea de
transmisión, recibir estos datos (dirección) y comprobar automáticamente si coincide con su propia
dirección. El dispositivo esclavo en el que el partido de dirección se produce, debe desactivar la detección
de la dirección en la limpieza de su granito de arena Addendum.
El dispositivo maestro sigue enviando 8-bits de datos. Todos los datos que pasan a través de la línea de
transmisión será recibido por el módulo EUSART dirigida únicamente. Cuando el último byte se ha
recibido, el dispositivo esclavo debe establecer el bit Adden con el fin de activar la detección de la nueva
dirección.
TXSTA Registrarse
CSRC - bits Reloj de selección de fuente - se utiliza para la selección de la fuente de reloj. Se utiliza
sólo en modo síncrono.
1 - el modo maestro. Reloj se genera internamente a partir de generador de Baud Rate.
0 - el modo esclavo. Reloj se genera a partir de una fuente externa.
TX9 - 9-bit de habilitación de transmisión poco
1 a 9 bits de transmisión de datos a través del sistema EUSART.
0 a 8 bits de transmisión de datos a través del sistema EUSART.
TXEN - Transmitir Bit de habilitación
1 - Transmisión activada.
0 - Transmisión desactivada.
SYNC - Seleccionar el modo de EUSART bits
1 - EUSART funciona en modo síncrono.
0 - EUSART funciona en modo asíncrono.
SENDB - Enviar poco vacaciones de caracteres sólo se utiliza en modo asíncrono y cuando sea
necesario para observar el estándar de bus LIN.
1 - Vacaciones de la transmisión de caracteres está habilitada.
0 - transmisión carácter de salto se ha completado.
BRGH - Tasa de bits de alta selección de baudios determina la velocidad de transmisión en modo
asincrónico. No afecta a EUSART en modo síncrono.
1 - EUSART funciona a alta velocidad.
0 - EUSART funciona a baja velocidad.
TRMT - Registro de desplazamiento de transmisión bit de estado
1 - TSR registro está vacío.
0 - TSR registro está lleno.
TX9D - noveno bit de datos de transmisión se puede utilizar como dirección o bit de paridad.
RCSTA Registrarse
SPEN - Puerto serie Bit de habilitación
1 - Puerto serie habilitado. RX / DT y los pines TX / CK se configuran automáticamente como entrada y salida, respectivamente.
0 - Puerto serie desactivado.
RX9 - 9-bit Recibe Bit de habilitación
1 - Recepción de datos 9-bits a través del sistema EUSART.
0 - Recepción de 8-bits de datos a través del sistema EUSART.
SREN - poco ReceiveEnable solo se utiliza sólo en modo síncrono cuando el microcontrolador funciona
como un maestro.
1 - Recepción sola habilitado.
0 - Recepción sola discapacidad.
CREN - recepción continua Bit de habilitación actúa de forma diferente dependiendo del modo de
EUSART.
Modo asíncrono:
1 - El receptor activado.
0 - Receptor desactivado.
El modo síncrono:
1 - Habilita la recepción continua hasta que el bit CREN se borra.
0 - Deshabilita recepción continua.
Addendum - Dirección Detectar Bit de habilitación sólo se utiliza en modo de detección de la dirección.
1 - Permite la detección de dirección de 9-bit de datos reciben.
0 - Desactiva la detección de la dirección. El noveno bit se puede utilizar como un bit de paridad.
FERR - Enmarcados bit de error
1 - error de trama se detecta en recibir.
0 - No hay error de trama.
OERR - bit de error de desbordamiento.
1 - Al recibir, error de desbordamiento se detecta.
0 - No hay error de desbordamiento.
RX9D - noveno bit de datos recibidos se pueden utilizar como dirección o bit de paridad.
El siguiente diagrama muestra tres palabras que aparecen en la entrada RX. El búfer de recepción se lee
después de la tercera palabra, que la broca OEER (bit error de desbordamiento) se establezca.
EUSART generador de tasa de baudios (BRG)
Si usted mira cuidadosamente el receptor EUSART asíncrono o un diagrama del transmisor, se verá que
tanto el uso de una señal de reloj del temporizador local de BRG para la sincronización. La misma fuente
de reloj también se utiliza en modo síncrono.
El temporizador BRG se compone de dos registros de 8-bits haciendo un 16-bit del registro.
Un número escrito a estos dos registros determina la tasa de baudios. Además, tanto el bit BRGH del
registro TXSTA y el bit de la BRGH16 BAUDCTL registro afectar frecuencia de reloj. Tablas en las
páginas siguientes contienen los valores que deben ser escritos a la SPBRG Registro de 16 bits y se
asignan a las funciones SYNC, BRGH y BRGH16 bits en el fin de obtener algunas de las velocidades de
transmisión estándar.
Utilice la siguiente fórmula para determinar la velocidad de transmisión.
Ejemplo
Para que un dispositivo en modo asíncrono con una frecuencia de reloj de 16 MHz y velocidad de
transmisión deseada de 9600, el generador de 8-bit Velocidad en baudios (BRG) se calcula como sigue:
BAUDCTL Registrarse
ABDOVF - Auto-detección de baudios bits de desbordamiento sólo se utiliza en modo asíncrono
durante la detección de la velocidad de transmisión.
1 - Auto-temporizador de transmisión se ha desbordado.
0 - Auto-temporizador de transmisión no se ha desbordado.
RCIDL - Recibir bits Bandera de inactividad sólo se utiliza en modo asíncrono.
1 - El receptor está inactivo.
0 - bit de START se ha recibido y recibe los datos está en curso.
SCKP - bits síncrono polaridad del reloj de selección. El estado lógico de este bit varía en función del
modo EUSART está activo.
Modo asíncrono:
1 - Transmisión de datos invertidos al pin RC6/TX/CK.
0 - Transmisión de datos no invertidas en la clavija de RC6/TX/CK.
El modo síncrono:
1 - Sincronización en el borde de subida del reloj.
0 - Sincronización del reloj en el borde que cae.
BRG16 de 16-bit poco generador de velocidad en baudios - determina si el registro SPBRGH será
utilizada, es decir, si el temporizador BRG tendrá 8 o 16 bits.
1 a 16 bits generador de velocidad en baudios se utiliza.
0 a 8 bits generador de velocidad en baudios se utiliza.
EUA despertador Bit de habilitación
1 - El receptor espera un flanco descendente en el pin RC7/RX/DT para despertar al microcontrolador del modo de suspensión.
0 - El receptor funciona normalmente.
ABDEN - Auto-detección de baudios Activar bit se utiliza sólo en modo asíncrono.
1 - Auto-baudios modo de detección está activado. El bit se borra automáticamente en la detección de la velocidad de transmisión.
0 - Auto-modo de detección de baudios está desactivado.
Vamos a hacerlo en mikroBasic ...
' In this example, internal EUSART module is initialized and
set to send back the
' message immediately after receiving it. Baud rate is set to
9600 bps. The pro
'gram uses UART library routines UART1_init(),
UART1_Write_Text(), UART1_Data_Ready(),
'UART1_Write() and UART1_Read().
dim uart_rd as byte
main:
ANSEL,ANSELH = 0 ' Configure AN pins as digital
CM1CON0.C1ON = 0 ' Disable comparators
CM2CON0.C2ON = 0
UART1_Init(9600) ' Initialize UART module at 9600
bps
Delay_ms(100) ' Wait for UART module to become
stable
UART1_Write_Text("Start")
while 1 ' Endless loop
if (UART1_Data_Ready() ' If data is received,
uart_rd = UART1_Read() ' read it,
end if
UART1_Write(uart_rd) ' and send it back via UART
wend
...
En Corto La transmisión de datos a través de la comunicación asíncrona EUSART:
1. La velocidad de transmisión deseada debe establecerse mediante el uso de los bits BRGH (TXSTA registro) y BRG16 (BAUDCTL registro) y registra SPBRGH y SPBRG.
2. El bit SYNC (TXSTA registro) debe ser limpiado y el bit SPEN debe ser ajustada (RCSTA registro) a fin de habilitar el puerto en serie.
3. El bit TX9 del registro TXSTA se deben establecer en la transmisión de datos de 9 bits. 4. La transmisión de datos se habilita estableciendo el bit TXEN del registro TXSTA. El bit
TXIF del registro PIR1 se ajusta automáticamente. 5. Tanto poco TXIE del registro PIE1 y los bits GIE y PEIE del registro INTCON deben
establecerse para que la broca TXEN para causar una interrupción. 6. Valor del noveno bit debe ser escrito en el bit del registro TX9D TXSTA en la transmisión
de datos de 9 bits. 7. La transmisión se inicia escribiendo 8-bits de datos al registro TXREG.
Recepción de datos a través de la comunicación asíncrona EUSART:
1. Velocidad de transmisión se debe establecer mediante el uso de los bits BRGH (TXSTA registro) y BRG16 (BAUDCTL registro) y registra SPBRGH y SPBRG.
2. El bit SYNC (TXSTA registro) debe ser limpiado y el bit SPEN debe ser ajustada (RCSTA registro) a fin de habilitar el puerto en serie.
3. Tanto el bit del registro RCIE PIE1 y los bits GIE y PEIE del registro INTCON se debe establecer cuando es necesario para permitir la recepción de datos para provocar una interrupción.
4. El bit RX9 del registro RCSTA se debe establecer el 9 de bits de datos reciben. 5. La recepción de datos se habilita estableciendo el bit CREN del registro RCSTA. 6. El registro RCSTA debe ser leído con el fin de comprobar si se han producido algunos
errores durante la recepción. El noveno bit será almacenado en este registro en la recepción de datos de 9-bit.
7. La recibida de 8-bits de datos almacenados en el registro RCREG debe ser leído. Ajuste del modo de detección de direcciones:
1. Velocidad de transmisión se debe establecer mediante el uso de los bits BRGH (TXSTA registro) y BRG16 (BAUDCTL registro) y registra SPBRGH y SPBRG.
2. El bit SYNC (TXSTA registro) debe ser limpiado y el bit SPEN debe ser ajustada (RCSTA registro) a fin de habilitar el puerto en serie.
3. El bit del bit RCIE PIE1 así como los bits GIE y PEIE del registro INTCON se debe establecer cuando es necesario para permitir la recepción de datos para provocar una interrupción.
4. El bit RX9 del registro RCSTA debe ser fijado. 5. El Addendum del registro RCSTA se debe establecer, lo que permite que los datos para
ser reconocidos como la dirección. 6. La recepción de datos debe ser habilitada por establecer el bit CREN del registro RCSTA. 7. Tan pronto como los datos de 9-bits es recibido, el bit RCIF del registro PIR1 se establece
automáticamente. Si está activado, se produce una interrupción. 8. El registro RCSTA debe ser leído con el fin de comprobar si se han producido algunos
errores durante la recepción. El RX9D noveno bit se establece siempre. 9. La recibida de 8-bits de datos almacenados en el registro RCREG debe ser leído. Se
debe comprobar si la combinación de estos bits coincide con la dirección predefinida. Si la coincidencia ocurre, es necesario limpiar el bit Adden del registro RCSTA, que permite a 8-bits de datos para ser recibido.
MAESTRO SINCRÓNICO módulo de puerto COM
El módulo MSSP (Master puerto en serie síncrona) es una herramienta muy útil, pero al mismo tiempo,
uno de los circuitos más complejos dentro del microcontrolador. Permite la comunicación de alta velocidad
entre el microcontrolador y otros periféricos u otros microcontroladores mediante la entrada de unos
pocos / líneas de salida (tres o máximo cuatro). Por lo tanto, se utiliza comúnmente para conectar el
microcontrolador a las pantallas LCD, convertidores A / D, EEPROM serie, registros de desplazamiento,
etc La principal característica de este tipo de comunicación es que es síncrono y adecuados para uso en
sistemas con un solo maestro y uno o más esclavos. El dispositivo maestro contiene un generador de
velocidad en baudios y suministra todos los dispositivos en el sistema con el reloj. Los dispositivos
esclavos pueden de este modo eliminar el circuito de reloj generación interna. El módulo MSSP puede
funcionar en uno de dos modos:
Modo SPI (Serial Peripheral Interface), y
I 2 C de modo (Inter-Integrated Circuit).
Como puede verse en la figura a continuación, un módulo MSSP representa sólo un medio de el hardware
necesario para establecer comunicación en serie, mientras que la otra mitad se almacena en el dispositivo
intercambia datos con. A pesar de que los módulos en ambos extremos de la línea son los mismos, sus
modos son esencialmente diferentes en función de si operan como un maestro o un esclavo:
Si el microcontrolador a ser los controles programados a otro dispositivo o circuito (periféricos), debe ser
configurada para funcionar como un maestro. Se generará reloj cuando sea necesario, es decir, sólo
cuando la recepción y transmisión de datos son requeridos por el software. Obviamente, es
exclusivamente del dispositivo principal para establecer la conexión o no.
En caso contrario, si el microcontrolador a programar es un periférico de algún dispositivo más complejo
(por ejemplo, un PC), entonces debe funcionar como un esclavo. Como tal, siempre tiene que esperar a
petición de transmisión de datos para ser enviada por el dispositivo maestro.
MODO SPI
El modo SPI permite 8 bits de datos a transmitir y recibir simultáneamente con 3 entradas / líneas de
salida:
SDO - salida de datos serial - línea de transmisión;
SDI - datos serie en - línea de recepción, y
SCK - Serial Clock - línea de sincronización.
Aparte de estas tres líneas, existe la cuarta línea (SS), así que puede ser utilizado si los intercambios
microcontrolador datos con varios dispositivos periféricos. Refiérase a la figura de abajo.
SS - Slave Select - es una línea adicional que se utiliza para la selección de un dispositivo
específico. Sólo está activo cuando el microcontrolador está en modo esclavo, es decir, cuando la externa
- dispositivo maestro requiere el intercambio de datos.
El módulo MSSP utiliza en el registro total de 4 cuando está en modo SPI:
SSPSTAT - registro de estado
SSPCON - registro de control
SSPBUF - búfer registro
SSPSR - registro de desplazamiento (no disponible directamente)
Los tres primeros registros son de escritura / lectura y se puede cambiar en cualquier momento, mientras
que el cuarto registro, ya que no está disponible, se utiliza para convertir los datos en "serial" en formato.
Como puede verse en la figura a continuación, la parte central del módulo SPI se compone de dos
registros conectados a las patillas para la recepción, transmisión y sincronización.
El registro de desplazamiento (SSPRS) está directamente conectado a los pines del microcontrolador y
utilizado para la transmisión de datos en serie. El registro SSPRS tiene su entrada y salida así como los
datos pueden ser desplazado dentro y fuera. En otras palabras, cada bit que aparece en la entrada (línea
de recepción) simultáneamente se desplaza a otro poco hacia la salida (línea de transmisión).
El registro SSPBUF (Buffer) es parte de la memoria utilizada para almacenar temporalmente los datos
antes de ser enviado o inmediatamente después de ser recibido. Después de los 8 bits de datos se han
recibido, el byte se mueve desde los SSPRS el registro SSPBUF. Tal operación permite que el siguiente
byte para ser recibido antes de leer los datos que acaba de ser recibidos. Cualquier escritura en el
registro SSPBUF durante la transmisión / recepción de datos se tendrá en cuenta. Desde el punto de vista
de los programadores, este registro es considerado el más importante como ser las más solicitadas.
Es decir, si tenemos en cuenta la configuración del modo por un momento, la transferencia de datos a
través de SPI en realidad viene a escribir y leer datos desde y hacia este registro, mientras que otros 'de
acrobacias como los registros de movimiento se realiza automáticamente por el hardware.
' In this example, PIC microcontroller (master) sends data byte
to peripheral chip
' (slave) via SPI. Program uses SPI library functions
SPI1_init() and SPI1_Write.
dim Chip_Select as sbit at PORTC.RC0 ' Peripheral
chip_select line is connected to RC0
dim Chip_Select_Direction as sbit at TRISC.0 ' TRISC0 bit
defines RC0 pin to be input or output
dim value as unsigned int ' Data to be sent
(value) is of unsigned int type
main:
ANSEL, ANSELH = 0 ' All I/O pins are digital
TRISB.0 = 1
TRISB.1 = 1 ' Configure RB0, RB1 pins as inputs
Chip_Select = 0 ' Select peripheral chip
Chip_Select_Direction = 0 ' Configure the CS# pin as an output
SPI1_Init() ' Initialize SPI module
SPI1_Write(value) ' Send value to peripheral chip
...
En breve Recepción / transmisión de datos utilizando el modo SPI
Antes de comenzar la inicialización de SPI, es necesario especificar varias opciones:
Modo Master TRISC.3 = 0 (el pin SCK es la salida del reloj);
Modo esclavo TRISC.3 = 1 (el pin SCK es la entrada de reloj);
Los datos de entrada de fase media o final del tiempo de salida (el bit SMP del registro SSPSTAT);
El borde del reloj (el bit CKE del registro SSPSTAT);
Velocidad en baudios, bits de SSPM3-SSPM0 del registro SSPCON (sólo en modo master);
Esclavo modo de selección, los bits SSPM3-SSPM0 del registro SSPCON (sólo modo Esclavo).
El módulo SPI se pone en marcha activando el bit SSPEN:
Paso 1.
Los datos que se transfieren deben ser por escrito a la SSPBUF registro tampón. Si el módulo
SPI funciona en modo maestro, el microcontrolador automáticamente realice los siguientes
pasos 2, 3 y 4. Si el módulo SPI funciona como esclavo, el microcontrolador no realizar estos
pasos hasta que el pin SCK detecta señal de reloj.
Paso 2.
Los datos se mueve ahora en el registro SSPSR y el registro SSPBUF no se borra.
Paso 3.
Estos datos se desplaza a la patilla de salida (el bit MSB primero), mientras que el registro está
simultáneamente siendo llenado con los bits a través de la patilla de entrada. En el modo
maestro, el propio microcontrolador genera el reloj, mientras que el modo esclavo usa un reloj
externo (el pin SCK).
Paso 4.
El registro es SSPSR completo una vez que 8 bits de datos se han recibido. Se indica al
establecer el bit BF del registro SSPSTAT y el bit SSPIF del registro PIR1. Los datos recibidos
(un byte) se desplaza automáticamente de la SSPSR registrarse en el registro SSPBUF.Dado
que la transmisión de datos en serie se realiza automáticamente, el resto del programa se
ejecuta normalmente, mientras que la transmisión de datos está en curso. En este caso, la
función del bit SSPIF es generar una interrupción cuando una transmisión de bytes se ha
completado.
Paso 5.
Finalmente, los datos almacenados en el registro SSPBUF está listo para usar y debe ser
movido a un registro deseado.
I 2 MODO C
I 2 C modo (Inter IC Bus) El modo I2C (Inter IC bus) es especialmente adecuado cuando el
microcontrolador y un circuito integrado, que el microcontrolador debe intercambiar datos con, están
dentro del mismo dispositivo. Por lo general, otro microcontrolador o un circuito especializado, integrado
barata que pertenece a la nueva generación de los llamados 'componentes periféricos inteligentes
"(módulos de memoria, sensores de temperatura en tiempo real, relojes, etc)
Al igual que en la comunicación serie en modo SPI, la transferencia de datos en modo I2C es síncrona y
bidireccional. Esta vez sólo dos pines se utilizan para la transmisión de datos. Se trata de la SDA (Serial
Data) y los pines SCL (Serial Clock). El usuario debe configurar estos pines como entradas o salidas por
medio de los bits TRISC.
Mediante la observación de reglas particulares (protocolos), de este modo permite hasta 122 diferentes
componentes para ser conectados simultáneamente de una manera sencilla mediante el uso de sólo dos
valiosos pines I / O. Echemos un vistazo a cómo funciona:
Reloj, necesario para sincronizar el funcionamiento de ambos dispositivos, siempre se genera por el
dispositivo maestro (un microcontrolador) y su frecuencia afecta directamente a la tasa de baudios. A
pesar de que existe un protocolo que permite la máxima frecuencia de reloj de 3,4 MHz (denominado bus
I2C de alta velocidad), este libro cubre sólo el protocolo de uso más frecuente de la frecuencia de reloj de
la cual está limitada a 100 KHz. No hay limitaciones para la frecuencia mínima.
Cuando los componentes del maestro y el esclavo están sincronizados con el reloj, cada intercambio de
datos es siempre iniciada por el maestro. Una vez que el módulo MSSP se ha habilitado, se espera una
condición de arranque que se produzca. El dispositivo maestro envía primero el bit de inicio (un cero
lógico) a través del pin SDA, a continuación, una dirección de 7-bits del dispositivo esclavo seleccionado,
y finalmente, el bit que requiere datos de escritura (0) o leer (1) al dispositivo . En otras palabras, ocho bits
se desplazan al registro SSPSR después de la condición de arranque. Todos los dispositivos esclavos
que comparten la misma línea de transmisión simultánea recibirá el primer byte, pero sólo uno de ellos
tiene la dirección para igualar y recibe los datos completos.
Una vez que el primer byte ha sido enviado (sólo 8-bits de datos son transmitidos), el maestro entra en
modo de recepción y espera a que el reconocimiento del dispositivo esclavo que coincidencia de dirección
se ha producido. Si el dispositivo esclavo envía el bit de confirmación de datos (1), la transferencia de
datos se mantendrá hasta que el dispositivo maestro (microcontrolador) envía el bit de parada.
Esta es la explicación más simple de cómo dos componentes se comunican. Tal un microcontrolador es
también capaz de controlar las situaciones más complicadas cuando 1024 diferentes componentes (10-bit
de dirección), compartidos por varios dispositivos maestros diferentes, están conectados. Estos
dispositivos se usan muy poco en la práctica y no hay necesidad de discutir más a fondo.
La siguiente figura muestra el diagrama de bloques del módulo MSSP en el modo I 2 C.
El módulo MSSP utiliza seis registros para la operación de I
2 C. Algunos de ellos se muestran en la figura
anterior:
SSPCON
SSPCON2
SSPSTAT
SSPBUF
SSPSR
SSPADD
SSPSTAT Registrarse
SMP bit de la muestra
SPI modo maestro - Este bit determina la fase de entrada de datos.
1 - estado lógico se lee al final del tiempo de salida.
0 - estado lógico se lee en el medio del tiempo de salida.
Modo esclavo SPI - Este bit debe ser borrado cuando SPI se emplea en modo esclavo.
I ² modo C (maestro o esclavo)
1 - Control de velocidad de subida desactivado para el modo de velocidad estándar (100 kHz).
0 - Control de Velocidad de giro habilitado para el modo de alta velocidad (400k Hz).
CKE - Edge Reloj Seleccione bit selecciona el modo de sincronización.
CKP = 0:
1 - Los datos se transfieren en flanco ascendente de pulso de reloj (0 - 1).
0 - Los datos se transfieren en el flanco descendente de pulso de reloj (1 - 0).
CKP = 1:
1 - Los datos se transfieren en el flanco descendente de pulso de reloj (1 - 0).
0 - Los datos se transfieren en flanco ascendente de pulso de reloj (0 - 1).
D / A - Datos / bits de la dirección se utiliza en el modo I 2 C solamente.
1 - Indica que el último byte recibido o transmitido los datos.
0 - Indica que el último byte recibido o transmitido es una dirección.
P - bit de parada se utiliza en el modo I ² C solamente.
1 - el último bit detectado es el bit de parada.
0 - el último bit detectado no es el bit de parada.
S - bit de inicio se utiliza en el modo I ² C solamente.
1 - último bit detectado es el bit de inicio.
0 - último bit detectado no es el bit de inicio.
R / W - Leer bits escritura se utiliza en el modo I 2 C solamente. Este bit contiene la información de bit R
/ W después del partido la última dirección. Este bit sólo es válido desde el partido de la dirección del bit
de inicio al lado, bit de parada o no bit ACK.
En modo esclavo I ² C
1 - Lectura de datos.
0 - escritura de datos.
En el modo I ² C maestro
1 - Transmitir en curso.
0 - Transmitir no está en curso.
UA - bits Actualización de la dirección se utiliza en 10-bit de modo I2C solamente.
1 - El registro SSPADD debe ser actualizada.
0 - Dirección en el registro SSPADD es correcta y no necesita ser actualizado.
BF Buffer bit de estado completa
Durante la recepción de datos (en el SPI e I ² C modos)
1 - Recibe completa. El registro SSPBUF está lleno.
0 - Recibir no es completa. El registro SSPBUF está vacía.
Durante la transmisión de datos (en el modo I ² C solamente)
1 - Los datos de transmisión en curso (no incluye los bits ACK y STOP).
0 - Transmitir datos completa (no incluye los bits ACK y STOP).
SSPCON Registrarse
Colisión WCOL Escribir Detectar bits
1 - colisión detectada. Escribir en el registro SSPBUF se intentó, mientras que las condiciones I2C no eran válidos para la transmisión de empezar.
0 - No hay colisión.
Recibe SSPOV bits de desbordamiento Indicador
1 - Un byte se recibe una nueva antes de leer los datos previamente recibidos. Puesto que no hay espacio para recibir nuevos datos, uno de estos dos octetos debe ser compensado. En este caso, los datos almacenados en el registro SSPSR está irremediablemente perdido.
0 - serie de datos se reciben correctamente.
SSPEN - puerto serie síncrono Activar bit determina la función de micro pines y se inicializa el módulo
MSSP:
En modo SPI
1 - Habilita el módulo MSSP y configura pines SCK, SDO, SDI y SS como pines del puerto serie.
0 - Deshabilita el módulo MSSP y configura estos pines de E / S del puerto.
En el modo I ² C
1 - Habilita el módulo MSSP y configura pines SDA y SCL como pines del puerto serie.
0 - Deshabilita el módulo MSSP y configura estos pines de E / S del puerto.
CKP - bit de polaridad del reloj de selección no se utiliza en el modo I ² C maestro.
En modo SPI
1 - Estado de reposo para el reloj es un alto nivel.
0 - en estado inactivo para el reloj es un nivel bajo.
En modo esclavo I ² C
1 - Activa el reloj.
0 - Mantiene baja del reloj. Se utiliza para proporcionar más tiempo para la estabilización de los datos.
SSPM3-SSPM0 - síncronos bits de modo Serial Port Seleccionar. SSP modo se determina mediante
la combinación de estos bits:
S S P M 3 S S P M 2 S S P M 1 S S P M 0 M O D O
0 0 0 0 SPI Master Mode, reloj = Fosc / 4
0 0 0 1 SPI Master Mode, reloj = Fosc/16
0 0 1 0 SPI Master Mode, reloj = Fosc/64
0 0 1 1 SPI Master Mode, reloj = (TMR de salida) / 2
0 1 0 0 Modo SPI esclavo, SS pin de control activado
0 1 0 1 Modo SPI esclavo, de las SS con
discapacidad de control de pines, SS puede
ser utilizado como pin I / O
0 1 1 0 I ² C modo esclavo, 7 bits de la dirección
utilizada
0 1 1 1 I ² C modo de esclava, de 10-bits de
direcciones utilizado
1 0 0 0 I ² C Master Mode, reloj = Fosc / [4 (SSPAD
+1)]
1 0 0 1 Máscara utilizada en modo esclavo I ² C
1 0 1 0 No se utiliza
1 0 1 1 I ² C modo master controlado
1 1 0 0 No se utiliza
1 1 0 1 No se utiliza
1 1 1 0
I ² C modo de esclava, de 7-bits de
direcciones utilizado, iniciar y detener los bits permiten interrumpir
1 1 1 1 I ² C modo de esclavos, la dirección de 10
bits utilizada, iniciar y detener los bits permiten interrumpir
SSPCON2 Registrarse
GCEN - Convocatoria general Bit de habilitación
En modo esclavo I ² C sólo
1 - Habilita la interrupción cuando una dirección de llamada general (0000h) se recibe en el SSPSR.
0 - Dirección General de llamada desactivado.
ACKSTAT - Reconocer bit de estado
En I ² C maestro de transmisión sólo en el modo
1 - Reconocer que no se ha recibido de esclavos.
0 - se ha recibido información de esclavo.
ACKDT - Reconocer bit de datos
En I ² C Maestro modo de recepción única
1 - no reconoce.
0 - Reconocer.
ACKEN - Reconocer la secuencia Bit de habilitación
En I ² C Maestro modo de recepción
1 - Iniciar la condición de reconocer a la SDA y SCL pines y transmitir los bits de datos ACKDT. Se borra automáticamente por el hardware.
0 - Reconocer condición no se inicia.
RCEN - Recibir Bit de habilitación
En modo I ² C único Maestro
1 - Permite la recepción de datos en el modo I 2 C.
0 - Recibir desactivado.
PEN - Habilitar la condición de STOP bits
En modo I ² C único Maestro
1 - Inicia la condición de STOP en los pines SDA y SCL. Este bit se borra automáticamente por el hardware.
0 - condición de STOP no se inicia.
RSEN - poco repetida condición de START Activado
En modo I ² C único maestro
1 - condición de START aparición de estos repetidos inició en los pines SDA y SCL. Este bit se borra automáticamente por el hardware.
0 - condición de START repetida no se inicia.
SEN - condición de START Habilitado / bit Stretch Activado
En modo I ² C único Maestro
1 - Inicia la condición de START en los pines SDA y SCL. Este bit se borra automáticamente por el hardware.
0 - condición de START no se inicia.
I 2 C en el modo Maestro
El caso más común es que el microcontrolador funciona como un maestro y un componente periférico
como un esclavo. Por eso, este libro cubre sólo de este modo. También se considera que la dirección se
compone de 7 bits y un dispositivo de destino contiene un solo microcontrolador (maestro único
dispositivo).
A fin de permitir módulo MSSP en este modo, es necesario hacer lo siguiente:
Establecer la velocidad de transmisión (SSPADD registro), desactivar el control de velocidad de respuesta
(al establecer el bit SMP del registro SSPSTAT) y seleccione el modo maestro (SSPCON
registro). Después de todos estos preparativos se han terminado y el módulo se ha activado (SSPCON
registro: poco SSPEN), es necesario esperar a que la electrónica interna para indicar que todo está listo
para la transmisión de datos, es decir, el bit SSPIF del registro PIR1 está establecido.
Este bit debe ser limpiado por el software y después de que el microcontrolador está listo para
intercambiar datos con periféricos.
TRANSMISIÓN DE DATOS EN EL MODO MAESTRO I2C
La transmisión de datos en el pin SDA se inicia con una lógica cero (0) que aparece en la configuración
del bit SEN del registro SSPCON2. Aún está activado, el microcontrolador tiene que esperar un cierto
tiempo antes de que comience la comunicación. Es la llamada "condición de arranque" en la que los
preparativos y controles internos se llevan a cabo. Si todas las condiciones se cumplen, el bit de la SSPIF
PIR1 se establece y transmisión de datos se inicia tan pronto como el registro SSPBUF está cargado.
Máximo 112 circuitos integrados dispositivos esclavos) al mismo tiempo pueden compartir la misma línea
de transmisión. El primer byte de datos enviada por el dispositivo maestro contiene la dirección para que
coincida con sólo un dispositivo esclavo. Todas las direcciones se muestran en las hojas de datos
respectivas. El octavo bit del primer byte de datos se especifica la dirección de la transmisión de datos, es
decir, si el microcontrolador es para enviar o recibir datos. En este caso, el octavo bit se borra a la lógica
cero (0), lo que significa que se trata de transmisión de datos.
Cuando se produce coincidencia de dirección, el microcontrolador tiene que esperar a que el bit de
reconocimiento de datos. El dispositivo esclavo reconoce coincidencia de dirección en la limpieza de la
broca ASKSTAT del registro SSPCON2. Si el partido ha producido correctamente, todos los bytes de
datos se transmiten en la misma forma.
La transmisión de datos termina configurando el bit SEN del registro SSPCON2. La condición de parada
se produce, que permite el pin SDA para recibir impulsos:
Inicio - Dirección - Reconocimiento - Dato - Reconocimiento de datos .... - Reconocimiento - ¡Detente!
Los datos de recepción en la que el Modo 2 C Maestro
Preparaciones para la recepción de datos son similares a los de transmisión de datos, con excepción de
que el último bit del primer byte enviado (dirección que contiene) se ajusta a uno lógico (1). Se especifica
que el maestro espera recibir los datos desde el dispositivo esclavo direccionado. Vamos a ver lo que
sucede dentro del microcontrolador:
Después de los preparativos internos están terminadas y el bit de inicio está establecida, el dispositivo
esclavo inicia el envío de un byte a la vez. Estos bytes se almacenan en el registro SSPSR serie. Cada
dato es, después de recibir el octavo bit último, cargado al registro SSPBUF desde donde se puede
leer. La lectura de este registro hace que el bit de reconocimiento que se envían automáticamente, lo que
significa que el dispositivo maestro está listo para recibir nuevos datos.
Del mismo modo, la recepción de datos termina configurando el bit de STOP:
Inicio - Dirección - Reconocimiento - Datos - Reconocer ... - Reconocer los datos - Stop!
En esta secuencia de pulsos, el bit de reconocimiento se envían al dispositivo esclavo.
GENERADOR DE VELOCIDAD DE TRANSMISIÓN
Con el fin de sincronizar la transmisión de datos, todos los eventos que tienen lugar en el pin SDA deben
estar sincronizados con un reloj generada en el dispositivo maestro por un oscilador simple cuya
frecuencia depende de la frecuencia del microcontrolador oscilador principal, el valor escrito en el registro
SSPADD y el actual modo de SPI también.
La frecuencia de reloj del modo descrito en este libro depende de cristal de cuarzo seleccionado y el
registro SPADD. La siguiente figura muestra la fórmula utilizada para calcularlo.
Vamos a hacerlo en mikroBasic ...
' In this example, PIC MCU is connected to 24C02 EEPROM via SCL
and SDA pins. The program
' sends one byte of data to the EEPROM address 2. Then, it
reads data via I2C from EEPROM
' and sends it to PORTB in order to check if the data has been
successfully written.
main:
ANSEL = ANSELH = PORTB = TRISB = 0 ' All pins are digital.
PORTB pins are outputs.
I2C1_Init(100000) ' Initialize I2C with desired clock
I2C1_Start() ' I2C start signal
I2C1_Wr(0xA2) ' Send byte via I2C (device address + W)
I2C1_Wr(2) ' Send byte (address of EEPROM location)
I2C1_Wr(0xF0) ' Send data to be written
I2C1_Stop() ' I2C stop signal
Delay_100ms()
I2C1_Start() ' I2C start signal
I2C1_Wr(0xA2) ' Send byte via I2C (device address + W)
I2C1_Wr(2) ' Send byte (data address)
I2C1_Repeated_Start() ' Issue I2C signal repeated start
I2C1_Wr(0xA3) ' Send byte (device address + R)
PORTB = I2C1_Rd(0u) ' Read the data (NO acknowledge)
I2C1_Stop()
NOTAS DE INTERÉS ...
Cuando el microcontrolador se comunica con los componentes periféricos, puede ocurrir que la
transmisión de datos falla por alguna razón. En este caso, se recomienda para comprobar el estado de
algunos de los bits que puede aclarar el tema. En la práctica, el estado de estos bits se comprueba
mediante la ejecución de un subprograma de corto después de cada transmisión y recepción de bytes
(por si acaso).
WCOL (SPCON, 7) - Si tratas de escribir nuevos datos en el registro SSPBUF, mientras que otro los
datos de transmisión / recepción en curso, el bit WCOL se establecerá y el contenido del registro SSPBUF
se mantiene sin cambios. Escribir no se produce. Después de esto, el bit WCOL debe ser limpiado en el
software.
BF (SSPSTAT, 0) - En el modo de transmisión, este bit se establece cuando la CPU escribe los datos en
el registro SSPBUF y permanece establecido hasta el byte en formato de serie se desplaza desde el
registro SSPSR. En el modo de recepción, este bit se establece cuando los datos o la dirección se carga
en el registro SSPBUF. Se pone a cero después de leer el registro SSPBUF.
SSPOV (SSPCON, 6) - En el modo de recepción, este bit se establece cuando un nuevo byte
es recibido por el registro SSPSR a través de la comunicación en serie, mientras que los datos
recibidos previamente no se ha leído en el registro SSPBUF todavía.
Pines SDA y SCL - Cuando el módulo SSP está habilitado, estos pines se convierten en
salidas de desagüe abierto. Esto significa que deben ser conectados a las resistencias que
son, en el otro extremo, conectados a la fuente de alimentación positiva.
En breve Recepción / transmisión de datos en el modo I
2 C
Con el fin de establecer una comunicación serie en modo I2C, lo siguiente se debe hacer:
Configuración del módulo y envío de Dirección:
Valor para determinar la velocidad de transmisión debe ser escrito en el registro SSPADD.
Control de SlewRate deben apagarse al establecer el bit SMP del registro SSPSTAT.
Con el fin de seleccionar el modo Maestro, el valor binario de 1000 se debe escribir en los bits SSPM3-SSPM0 del registro SSPCON1.
El bit SEN del registro SSPCON2 (secuencia de START) debe ser fijado.
El bit SSPIF se ajusta automáticamente al final de la secuencia de arranque cuando el módulo está listo para funcionar. Se debe ser compensado.
Dirección del esclavo debe ser escrito en el registro SSPBUF.
Cuando el byte se envía, el bit SSPIF (interrupción) se ajusta automáticamente después de recibir el bit de reconocimiento del dispositivo esclavo.
Los datos de transmisión:
Los datos que se envían deben ser escritos para el registro SSPBUF.
Cuando el byte se envía, el bit SSPIF (interrupción) se ajusta automáticamente después de recibir el bit de reconocimiento del dispositivo esclavo.
Con el fin de informar al dispositivo Esclavo que la transmisión de datos está completa, la condición de parada debe ser iniciado por establecer el bit PEN del SSPCON registrarse.
Recepción de datos:
Con el fin de permitir la recepción, el bit RSEN del registro SSPCON2 debe ser fijado.
El bit SSPIF indica la recepción de datos. Cuando se leen los datos desde el registro SSPBUF, el bit ACKEN del registro SSPCON2 debe establecerse con el fin de permitir que el bit de confirmación para ser enviado.
Con el fin de informar al dispositivo Esclavo que la transmisión de datos está completa, la condición de STOP debe ser iniciado por establecer el bit PEN del SSPCON registrarse.
3.9 Módulos analógicos
Además de un gran número de E / S digitales en los pins utilizados para la comunicación con los módulos
periféricos, el PIC16F887 también tiene 14 entradas analógicas. Permiten que el microcontrolador a
reconocer no sólo si un pin es impulsada bajo o alto (0 o 5 V), pero para medir con precisión la tensión y
convertirla en valor numérico, es decir, en formato digital.
Uno de los módulos analógicos más importantes dentro del microcontrolador es un convertidor A / D, que
tiene las siguientes características:
La conversión se realiza aplicando el método de aproximación sucesiva;
Hay 14 entradas separadas analógicos conectados a los pines del microcontrolador del puerto;
El convertidor A / D convierte una señal de entrada analógica en un número binario de 10-bit;
La resolución, es decir, la calidad de la conversión se puede ajustar para diferentes necesidades mediante la selección de referencias de tensión Vref-y Vref +.
Convertidor A / D
A pesar de que el uso de un convertidor A / D parece ser muy complicado, es muy sencilla, más simple
que el uso de módulos de comunicación temporizadores y serie, de todos modos.
El funcionamiento del convertidor A / D está en el control de los bits de cuatro registros:
Contiene ADRESH byte alto del resultado de la conversión;
Contiene ADRESL byte bajo del resultado de la conversión;
Control de registro ADCON0 0, y
ADCON1 registro de control 1.
ADRESH y ADRESL Registros
El proceso de convertir un valor analógico en digital tiene como resultado un número de 10-bits que se
almacenan en los registros ADRESH y ADRESL. Hay dos formas de manipulación de este número -
justificación a la izquierda y derecha que simplifica su uso en gran medida. El formato del resultado de la
conversión depende del bit ADFM del registro ADCON1. En caso de que el convertidor A / D no se utiliza,
registros ADRESH y ADRESL puede utilizarse como registros de propósito general.
A / D REQUISITOS DE ADQUISICIÓN
Para el voltaje a ser medido con precisión por medio del convertidor A / D, es necesario para proporcionar
un retardo de tiempo determinado entre la selección de una entrada analógica y la medición en sí. Este
retardo de tiempo se denomina "tiempo de adquisición" y depende principalmente de la impedancia de la
fuente. Existe una ecuación para calcular este retardo de tiempo con precisión, que en el peor de los
casos equivale a aproximadamente 20US. Por lo tanto, si desea que la conversión A / D para ser exactos,
no se olvide este pequeño detalle.
ADC período de reloj
El tiempo necesario para completar una conversión de un solo bit que se conoce como DAT. Se requiere
al menos 1,6 uS. Un total de 10-bits de conversión A / D es un poco más de lo previsto y que equivale a
11 periodos de TAD. Puesto que tanto la frecuencia de reloj del dispositivo y una fuente de conversión A /
D de reloj son especificados por software, es necesario seleccionar una de las combinaciones posibles de
los bits ADCS1 y ADCS0 antes de la medición de la tensión en algunas de las aperturas entradas
analógicas. Estos bits se almacenan en el registro ADCON0.
A D C F U E N T E D E R E L O J
A D C S 1 A D C S 0
A P A R A T O D E A L T A F R E C U E N C I A ( F O S C )
20 Mhz 8 Mhz 4 Mhz 1 Mhz
Fosc / 2 0 0 100 ns 250 nS 500 ns 2 nos
Fosc / 8 0 1 400 nS 1 nos 2 nos 8 nos
Fosc/32 1 0 1,6 uS 4 nos 8 nos 32 nos
Frc 1 1 2-6 uS 2-6 uS 2-6 uS 2-6 uS
Cualquier cambio de la frecuencia de reloj microcontrolador afectará a la A / D de velocidad de
conversión, que puede afectar adversamente el resultado del ADC. El abowe tabla muestra algunas de
las posibles frecuencias de reloj del dispositivo, así como la forma en que afectan a la velocidad de la
conversión A / D. Los valores en las celdas sombreadas se encuentran fuera del rango recomendado.
CÓMO USAR EL convertidor A / D?
Con el fin de permitir que el convertidor A / D para funcionar correctamente, así como para evitar
resultados inesperados, es necesario considerar la siguiente:
El convertidor A / D no se diferencia entre las señales digitales y analógicas. Con el fin de evitar errores en la medición o para prevenir el chip se dañe, todos los pines de entrada A / D debe configurarse como entradas analógicas antes del proceso de conversión se inicia. Los bits correspondientes se almacenan en el TRIS y ANSEL (ANSELH) registra;
Cuando se lee el puerto con entradas analógicas marcadas como CH0-CH13, el estado de los bits correspondientes, es decir, su valor digital será leído como un cero lógico (0), y
En términos generales, el proceso de medición de tensión por el convertidor se basa en la comparación de la tensión de entrada a una escala immaginary con 1024 grados (2
10 = 1024). La marca más baja se denomina la tensión Vref, mientras que el más alto
que se conoce como el voltaje Vref +. La siguiente figura muestra las referencias de voltaje seleccionables y sus valores de corte, así.
Registro ADCON0
ADCS1, ADCS0 - A / D bits de reloj de conversión Seleccionar seleccionar la frecuencia de reloj que
se utiliza para la sincronización interna del convertidor A / D. También afecta a la velocidad de conversión
A / D.
A D C S 1 A D C S 2 R E L O J
0 0 Fosc / 2
0 1 Fosc / 8
1 0 Fosc/32
1 1 RC *
Reloj * es generada por el oscilador interno incorporado en el convertidor A / D.
CHS3-CHS0 - Analog Channel bits de selección de seleccionar un PIN (una entrada analógica) para la
conversión A / D, es decir, la medición de tensión:
C H S 3 C H S 2 C H S 1 C H S 0 C A N A L P I N
0 0 0 0 0 RA0/AN0
0 0 0 1 1 RA1/AN1
0 0 1 0 2 RA2/AN2
0 0 1 1 3 RA3/AN3
0 1 0 0 4 RA5/AN4
0 1 0 1 5 RE0/AN5
0 1 1 0 6 RE1/AN6
0 1 1 1 7 RE2/AN7
1 0 0 0 8 RB2/AN8
1 0 0 1 9 RB3/AN9
1 0 1 0 10 RB1/AN1
0
1 0 1 1 11 RB4/AN1
1
1 1 0 0 12 RB0/AN1
2
1 1 0 1 13 RB5/AN1
3
1 1 1 0 CVref
1 1 1 1 Vref = 0,6 V
GO / DONE - Conversión A / D bit de estado determina el estado actual de la conversión:
1 - la conversión A / D está en marcha.
0 - conversión A / D es completa. Este bit se borra automáticamente después de completar la conversión A / D.
ADON - A / D El bit permite convertidor A / D.
1 - Un convertidor A / D está habilitado.
0 - convertidor A / D está desactivado.
Vamos a hacerlo en mikroBasic ...
'This example code reads analog value from channel 2 and
displays it on PORTB and PORTC
'as a 10-bit binary number.
dim adc_rd as word
main:
ANSEL = 0x04 ' Configure AN2 as an analog pin
TRISA = 0xFF ' PORTA is configured as an input
ANSELH = 0 ' Configure all other AN pins as digital
I/O
TRISC = 0x3F ' Pins RC7 and RC6 are configured as
outputs
TRISB = 0 ' PORTB is configured as an output
while 1
temp_res = ADC_Read(2) ' Get a 10-bit result of AD conversion
PORTB = temp_res ' Send lower 8 bits to PORTB
PORTC = temp_res >> 2 ' Send 2 most significant bits to RC7
and RC6
wend ' Remain in the loop
end.
ADCON1 Registrarse
ADFM - un formato de resultados / D Seleccione bits
1 - resultado de la conversión se justifica a la derecha. Seis bits más significativos del registro ADRESH no se utilizan.
0 - resultado de la conversión está justificado a la izquierda. Por lo menos seis bits significativos del registro ADRESL no se utilizan.
VCFG1 - bit de referencia de voltaje selecciona la fuente de tensión de referencia negativa para el
funcionamiento del convertidor A / D.
1 - La Vref patillas se alimenta con tensión de referencia negativa.
0 - tensión de alimentación de alimentación Vss se utiliza como una fuente de tensión de referencia negativa.
VCFG0 - bit de referencia de voltaje selecciona la fuente de tensión de referencia positiva para el
funcionamiento del convertidor A / D.
1 - La Vref + pasador se alimenta con tensión de referencia positiva.
0 - Fuente de alimentación Vdd voltaje se utiliza como una fuente de tensión de referencia positiva.
En Corto Uso de un convertidor A / D
Con el fin de medir el voltaje en un pin de entrada por medio del convertidor A / D, el procedimiento debe
realizarse:
Paso 1 - Configuración del puerto:
Escribir un uno lógico (1) a un bit del registro TRIS para configurar el pin apropiado como una entrada.
Escribir un uno lógico (1) para un poco de la ANSEL registrarse para configurar el pin apropiado como una entrada analógica.
Paso 2 - Configuración del ADC módulo:
Configuración de tensión de referencia en el registro ADCON1.
Seleccione un reloj de conversión A / D en el registro ADCON0.
Seleccione uno de los canales de entrada CH0-CH13 del registro ADCON0.
Selecciona el formato de datos utilizando el bit ADFM del registro ADCON1.
Habilitar el convertidor A / D al poner el bit ADON del registro ADCON0.
Paso 3 - Configuración del ADC interrupción (opcional):
Borrar el bit ADIF.
Establecer los bits ADIE, PEIE y GIE.
Paso 4 - Esperar a que el tiempo de adquisición requerido para pasar (aproximadamente 20US).
Paso 5 - Iniciar la conversión mediante el establecimiento de la GO / bit DONE del registro ADCON0.
Paso 6 - Esperar a que la conversión A / D para ser completado.
Compruebe en el programa si el bit GO / DONE se borra o esperar a que un A / D de interrumpir a ocurrir (debe estar previamente habilitado).
Paso 7 - Leer los resultados de conversión:
Leer registros ADRESH y ADRESL.
Comparador analógico
En adición al convertidor A / D, hay otro módulo, que hasta hace poco se construyó sólo en circuitos
integrados pertenecientes a los componentes electrónicos llamados analógicas. Debido al hecho de que
apenas es posible encontrar cualquier dispositivo más complejo en automáticas que de algún modo no
utiliza estos módulos, dos comparadores analógicos de alta calidad están integrados en el
microcontrolador y conectado a sus patas.
¿Cómo funciona un comparador analógico? Básicamente, el comparador analógico es un amplificador
provisto de dos entradas y una salida. Se compara la magnitud de las tensiones en dos
entradas. Dependiendo de la entrada tiene un voltaje más alto (un valor analógico), un cero lógico (0) o un
uno lógico (1) (valores digitales) aparecerá en su salida:
Cuando el voltaje analógico Vin en-es mayor que en Vin +, la salida del comparador es
un nivel digital bajo (0).
Cuando el voltaje analógico Vin en + es mayor que en Vin-, la salida del comparador es un nivel digital de alta (1).
El microcontrolador PIC16F887 está provisto de dos comparadores analógicos tales las entradas de los
cuales están conectados a los pines de E / S RA0-RA3, mientras que sus salidas están conectadas a las
RA4 y RA5 los pins. Hay también una fuente de tensión de referencia ajustable interna dentro del propio
microcontrolador, que se discutirá más adelante.
Estos dos módulos analógicos están bajo el control de los bits de los registros siguientes:
CM1CON0 está en control de comparador C1;
CM2CON0 está en control del comparador C2; CM2CON1 está en control del comparador C2;
FUENTE DE REFERENCIA INTERNA DE VOLTAJE
Uno de los dos voltajes analógicos proporcionados en las entradas del comparador analógico es fija y
constante. Este voltaje se conoce como una "tensión de referencia '(Vref) y se pueden generar ya sea por
la fuente de voltaje externo o interno. La fuente de voltaje se puede seleccionar a través de ambos
extremos de una red de escalera que consta de 16 resistencias que juntas forman un divisor de tensión.El
bit del registro VRSS VRCON se utiliza para seleccionar la fuente de tensión de referencia.
La tensión comparador módulo de referencia proporciona una referencia de tensión generada
internamente para los comparadores (CVref). La tensión de referencia CVref tiene 2 rangos, cada uno con
16 niveles de voltaje. Selección de la gama está controlado por el bit VRR del registro VRCON. El rango
de tensión seleccionado puede ser la salida a la clavija RA2/AN2 utilizando el bit VROE. Además, los bits
VR0-VR3 se utilizan para seleccionar los niveles adecuados de voltaje. Véase la figura a continuación.
Aunque la idea principal, con el módulo de tensión de referencia era proporcionar módulos analógicos con
variando la tensión de referencia, ahora se utiliza como un convertidor D / A también. Como tal, demostró
ser muy útil en algunas aplicaciones. Su funcionamiento está bajo el control del registro VRCON.
COMPARADORES e interrumpir
Cada cambio de estado lógico de la salida de cualquier comparador hace que el bit de bandera CMIF del
registro PIR a ser fijado. Estos cambios también se generará una interrupción si los bits siguientes se
establecen:
El bit CMIE del registro PIE = 1;
El bit PEIE del registro INTCON = 1, y
El bit GIE del registro INTCON = 1.
Si una interrupción se activa cuando el microcontrolador está en modo de reposo, cualquier cambio en la
salida del comparador hará que el microcontrolador para salir de este modo y proceder con la operación
normal.
FUNCIONAMIENTO del comparador en el modo SLEEP
El comparador, si está habilitado antes de que el microcontrolador entra en modo de reposo, se mantiene
activa. En caso de que la comparación no se utiliza para despertar el microcontrolador, se puede
desactivar para reducir al mínimo el consumo de energía. Se lleva a cabo en la limpieza de la broca
CxON del registro CMxCON0.
Para habilitar el comparador de despertar el microcontrolador de un sueño, el bit CxIE del registro IE2 y el
bit PEIE del registro INTCON se debe establecer. La primera instrucción que se ejecutará después de las
salidas del microcontrolador del modo de reposo es el que sigue a la instrucción del sueño. Si el bit GIE
del registro INTCON se pone, el microcontrolador se ejecutará la rutina de interrupción en primer lugar.
CM1CON0 Registrarse
Los bits del registro CM1CON0 están en el control del comparador C1. Se refiere principalmente a la
conexión de las entradas. La siguiente figura muestra una parte del módulo directamente afectados por
los bits de este registro.
C1ON - comparador C1 bit de habilitación permite comparador C1.
1 - comparador C1 está habilitado.
0 - comparador C1 está desactivado.
C1OUT - comparador C1 bit de salida es la salida del comparador C1.
Si C1POL = 1 (salida del comparador está invertida)
1 - Salida analógica de tensión en el C1Vin + es inferior a la tensión analógica en C1Vin.
0 - Salida analógica de tensión en el C1Vin + es superior a la tensión analógica en C1Vin.
Si C1POL = 0 (salida del comparador es no invertida)
1 - Salida analógica de tensión en el C1Vin + es superior a la tensión analógica en C1Vin.
0 - Salida analógica de tensión en el C1Vin + es inferior a la tensión analógica en C1Vin.
Comparador C1OE C1 de habilitación de salida poco.
1 - salida C1OUT comparador está conectada a la clavija C1OUT *.
0 - Salida del comparador sólo se utiliza internamente.
* A fin de que el estado del bit C1OUT a estar presente en el pin, dos condiciones deben cumplirse: C1ON
= 1 (comparador debe estar habilitado) y el pin correspondiente se debe configurar como una salida (bit
TRIS = 0).
C1POL - comparador C1 polaridad de salida poco Seleccionar permite que el estado de la salida del
comparador C1 a ser invertida.
1 - salida del comparador C1 se invierte.
0 - salida del comparador C1 es no invertida.
C1R - comparador C1 de referencia bits Select
1 - entrada no inversora C1Vin + está conectado a la tensión de referencia C1Vref.
0 - entrada no inversora + C1Vin está conectado a la C1IN + pasador.
C1CH1, C1CH0 - comparador C1 bits de selección de canal
C 1 C H 1 C 1 C H 0 C O M P A R A D O R C 1 V I N E N T R A D A
0 0 Entrada C1Vin-está conectado a la C12IN0 patillas
0 1 Entrada C1Vin-está conectado a la C12IN1 patillas
1 0 Entrada C1Vin-está conectado a la C12IN2 patillas
1 1 Entrada C1Vin-está conectado a la C12IN3 patillas
CM2CON0 Registrarse
Los bits del registro CM2CON0 están en el control del comparador C2. Similar al caso anterior, figura a
continuación muestra un esquema simplificado del circuito afectado por los bits de este registro.
C2ON - Comparador C2 bit de habilitación permite comparador C2.
1 - comparador C2 está activado, y
0 - comparador C2 está desactivado.
C2OUT - comparador bit de salida C2 es la salida del comparador C2.
Si C2POL = 1 (salida del comparador invertida)
1 - Salida analógica de tensión en el C2Vin + es inferior a la tensión analógica en C2Vin.
0 - Salida analógica de tensión en el C2Vin + es superior a la tensión analógica en C2Vin.
Si C2POL = 0 (salida del comparador es no invertida)
1 - Salida analógica de tensión en el C2Vin + es superior a la tensión analógica en C2Vin.
0 - Salida analógica de tensión en el C2Vin + es inferior a la tensión analógica en C2Vin.
C2OE - C2Output comparador Bit de habilitación
1 - salida C2OUT comparador está conectada a la clavija C2OUT *.
0 - Salida del comparador es interno.
* A fin de que el estado del bit C2OUT a estar presente en el pin, dos condiciones deben cumplirse: C2ON
= 1 (comparador debe estar habilitado) y el pin correspondiente se debe configurar como una salida (bit
TRIS = 0).
C2POL - comparador C2 polaridad de salida poco Seleccionar permite el estado de la salida del
comparador C2 a ser invertida.
1 - comparador la salida C2 se invierte.
0 - comparador C2 es de salida no invertida.
C2R - Comparador C2 referencia bits Select
1 - entrada no inversora C2Vin + está conectado a la C2Vref tensión de referencia.
0 - entrada no inversora + C2Vin está conectado a la C2IN + pasador.
C2CH1, C2CH0 comparador C2 bits de selección de canal
C 2 C H 1 C 2 C H 0 C O M P A R A D O R C 2 V I N E N T R A D A
0 0 Entrada C2Vin-está conectado a la C12IN0 patillas
0 1 Entrada C2Vin-está conectado a la C12IN1 patillas
1 0 Entrada C2Vin-está conectado a la C12IN2 patillas
1 1 Entrada C2Vin-está conectado a la C12IN3 patillas
CM2CON1 Registrarse
Espejo Copia de la broca C1OUT
Espejo Copia de la broca C2OUT
C1RSEL comparador C1 de referencia Seleccione bits
1 - Variando CVref voltaje se utiliza en la fuente de referencia C1Vref tensión.
0 - 0,6 V de tensión de referencia fijo se utiliza en la fuente de referencia C1Vref tensión.
C2RSEL - Comparador C2 referencia bits Select
1 - Variando CVref voltaje se utiliza como una fuente de referencia C2Vref tensión.
0 - 0,6 V de tensión de referencia fija se utiliza como una fuente de referencia C2Vref tensión.
T1GSS - Timer1 Fuente Puerta Seleccione bits
1 - Timer1 puerta utiliza la señal de pin T1G como fuente de reloj.
0 - Timer1 puerta utiliza la salida del comparador SYNCC2OUT como una fuente de reloj.
C2SYNC - Comparador de salida C2 sincronización de bits
1 - comparador la salida C2 está sincronizado con el reloj del Timer1.
0 - comparador C2 es de salida de la señal asíncrona.
VRCON Registrarse
Comparador VREN C1 Referencia de tensión Bit de habilitación
1 - CVref voltaje fuente de referencia habilitada.
0 - Voltaje de fuente de referencia CVref desactivado.
VROE comparador de voltaje de referencia C2 Bit de habilitación
1 - El pasador CVref se alimenta con CVref voltaje de la fuente de referencia.
0 - El pasador CVref se desconecta de CVref fuente de referencia.
VRR - Rango CVref poco Selección
1 - fuente de tensión de referencia se establece en la gama baja.
0 - Voltaje de fuente de referencia se ajusta a la gama alta.
VRSS - Comparador rango Vref selección de bit
1 - fuente de voltaje de referencia está en el intervalo entre Vref + y Vref.
0 - fuente de voltaje de referencia está en el intervalo entre Vdd y Vss (tensión de alimentación).
VR3 - VR0 selección de valores CVref
Si VRR = 1 (gama baja)
Referencia de voltaje se calcula por medio de la fórmula: CVref = ([VR3: VR0] / 24) Vdd
Si VRR = 0 (gama alta)
Referencia de voltaje se calcula por medio de la fórmula: CVref = Vdd / 4 + ([VR3: VR0] / 32) Vdd
En Corto
Con el fin de utilizar adecuadamente incorporados en los comparadores, es necesario hacer lo siguiente:
Paso 1 - Configuración del módulo:
Con el fin de seleccionar el modo adecuado, los bits de los registros y CM1CON0 CM2CON0 debe ser configurado.Interrumpir el cambio de modo debe estar deshabilitada.
Paso 2 - Internos de configuración de voltaje de la fuente de referencia (cuando se usa). En el registro
VRCON es necesario:
Seleccione uno de los dos rangos de tensión con el bit VRR.
Configurar necesaria Vref utilizando los bits VR3 - VR0.
Establezca el bit VROE si es necesario.
Habilitar el voltaje de referencia Vref fuente configurando el bit de VREN.
Fórmula utilizada para calcular la tensión de referencia:
VRR = 1 (gama baja)
CVref = ([VR3: VR0] / 24) VLADDER
VRR = 0 (gama alta)
CVref = (VLADDER / 4) + ([VR3: VR0] VLADDER/32)
Vladder = Vdd o ([Vref +] - [Vref-]) o Vref +
Paso 3 - Inicio de operación:
Habilitar una interrupción mediante el establecimiento de bits de CMIE (PIE registro), PEIE y GIE (registro INTCON).
Lea los bits C1OUT y C2OUT del registro CMCON.
Lea el bit de bandera CMIF del registro PIR. Cuando se establece, este bit debe ser limpiado desde el software.
3,10 reloj oscilador
Con el fin de sincronizar todos los procesos que tienen lugar dentro del microcontrolador, es necesario
para proporcionar una señal de reloj. La señal de reloj es generada por un oscilador de reloj. Tan simple
como eso. Este microcontrolador cuenta con varios osciladores capaces de operar en diferentes
modos. Tiene toda la historia aún más interesante ...
Como puede verse en la figura a continuación, la señal de reloj puede ser generada por externo o interno
oscilador incorporado.
El oscilador externo está integrado en el microcontrolador y conectado a los pines OSC1 y OSC2. Se
llama "externo", ya que está conectado a los componentes externos tales como cristal de cuarzo, circuito
resonador cerámico o resistencia condensador. El modo de oscilador es seleccionado por los bits de la
palabra de configuración, cargados en el microcontrolador durante la programación.
El oscilador interno consiste en dos osciladores internos separados:
El oscilador HFINTOSC es un oscilador interno de alta frecuencia que opera a 8MHz. El microcontrolador
puede usar un reloj generada en esta frecuencia o después de ser dividida en pre-escalador.
El oscilador LFINTOSC es un oscilador interno de baja frecuencia que opera a 31 kHz. El reloj se genera
se utiliza para reloj-perro y el momento del encendido, sino que también se puede utilizar como un reloj
para el funcionamiento del microcontrolador entero.
El bit de reloj del sistema Select (bit SCS) del registro OSCCON se utiliza para la selección entre oscilador
externo e interno.
OSCCON Registrarse
El registro OSCCON se utiliza para seleccionar y controlar oscilador de reloj y frecuencia de
reloj. Contiene los siguientes bits: bits de selección de frecuencia (IRCF2, IRCF1, IRCF0), los bits de
estado del oscilador (HTS, LTS) y el sistema de bits de control de reloj (OSTA, SCS).
IRCF2-0 -. Internos bits de frecuencia del oscilador seleccionar la combinación de estos tres bits
determina la tasa de pre-escalador, por lo tanto, la frecuencia de reloj del oscilador interno.
I R C F 2 I R C F 1 I R C F 0 F R E C U E N C I A O S C .
1 1 1 8 MHz HFINTOSC
1 1 0 4 MHz HFINTOSC
1 0 1 2 MHz HFINTOSC
1 0 0 1 MHz HFINTOSC
0 1 1 500 kHz HFINTOSC
0 1 0 250 kHz HFINTOSC
0 0 1 125 kHz HFINTOSC
0 0 0 31 kHz LFINTOSC
COSTOS - oscilador de puesta en marcha de tiempo de espera de bits de estado indica que la fuente
de reloj se encuentra actualmente en uso. Es de sólo lectura.
1 - oscilador de reloj externo está en uso.
0 - Uno de los osciladores de reloj interno está en uso (o HFINTOSC LFINTOSC).
HTS - poco HFINTOSC Estado (8 MHz - 125 kHz) indica si el oscilador interno de alta frecuencia es
estable.
1 - HFINTOSC es estable.
0 - HFINTOSC no es estable.
LTS-bit LFINTOSC estable (31 kHz) indica si el oscilador interno de baja frecuencia es estable.
1 - LFINTOSC es estable.
0 - LFINTOSC no es estable.
SCS - reloj del sistema Seleccionar bits selecciona el oscilador para ser utilizado como una fuente de
reloj.
1 - oscilador interno se utiliza como una fuente de reloj.
0 - oscilador externo se utiliza como una fuente de reloj. El modo de oscilador se establece por los bits en la Palabra de configuración escritos en la memoria del microcontrolador durante el proceso de programación.
MODOS DE EXTERIORES DEL RELOJ
El oscilador externo puede ser configurada para funcionar en varios modos diferentes, lo que significa
además que puede operar a velocidades diferentes y utilizar diferentes componentes para la
estabilización de la frecuencia. El modo de funcionamiento se selecciona durante el proceso de escribir un
programa en el microcontrolador. En primer lugar, es necesario poner en marcha el programa en un PC
para ser utilizado para la programación. Es el programa PICFlash en este caso. Haga clic en el campo del
oscilador y seleccione oscilador deseado de la lista desplegable. La información sobre estos ajustes se
guardan automáticamente en la Palabra de Configuración.
Durante el proceso de la programación del microcontrolador, los bits de la palabra de configuración se
escriben en los registros especiales de la ROM que no están disponibles para el usuario. Sobre la base
de estos bits, el microcontrolador "sabe" qué hacer, a pesar de que no se indica explícitamente en el
programa.
El modo de funcionamiento del oscilador se selecciona el programa después de escribir y compilar están
completos.
Oscilador externo EN MODO CE
El oscilador de reloj externa establecida en modo EC utiliza un oscilador externo independiente como una
fuente de reloj. La máxima frecuencia de esta señal de reloj está limitado a 20 MHz..
Las ventajas del oscilador externo cuando establecidos para operar en el modo de CE:
La fuente de reloj externa independiente está conectada a la entrada OSC1 y la OSC2 está disponible como un propósito general I / O;
Es posible sincronizar el funcionamiento del microcontrolador con el resto de un panel electrónico;
En este modo el microcontrolador inicia la operación tan pronto como la fuente de alimentación está encendido. Sin tiempo de retraso es necesario para la estabilización de la frecuencia, y
Suspensión temporal de la operación de la fuente de reloj externa automáticamente hará que el microcontrolador para detener la operación, dejando todos los datos intactos. Después de reiniciar el oscilador externo, el microcontrolador procede con la operación como si nada hubiera sucedido.
Oscilador externo en LP, XT o modo HS
El oscilador externo en LP, XT y modos SA utiliza el oscilador externo dentro del microcontrolador como
una fuente de reloj. La frecuencia de reloj depende del cristal de cuarzo o resonadores cerámicos
conectados a OSC1 y OSC2 los pins. Dependiendo de la frecuencia de funcionamiento del componente
en uso, seleccione uno de los modos siguientes:
Modo LP - (baja potencia) se utiliza para un cristal de cuarzo de baja frecuencia solamente. Este modo está diseñado para conducir sólo 32.768 cristales kHz normalmente en los relojes de cuarzo. Es fácil de reconocer por su pequeño tamaño y forma cilíndrica específico. El consumo de corriente es el menor de los tres modos.
XT modo se utiliza para el intermedio frecuencia cristales de cuarzo de hasta 8 Mhz. El consumo de corriente es el medio de los tres modos.
Modo HS - (alta velocidad) se utiliza para la alta frecuencia de cristales de cuarzo de más de 8 MHz. El consumo de corriente es la más alta de los tres modos.
Resonadores de cerámica en el modo XT o HS
Resonadores de cerámica son muy similares a los cristales de cuarzo por sus características y por lo
tanto conectado de la misma manera. A diferencia de los cristales de cuarzo, que son más baratos y los
osciladores que las contienen tienen características un poco más pobres. Se utilizan para frecuencias de
reloj que van desde 100 kHz a 20 MHz.
Oscilador externo en RC y MODO rcio
Componentes para la estabilización de la frecuencia son sin duda muy útil, pero a veces innecesaria. En
la mayoría de los casos, el oscilador puede operar a frecuencias que no están definidas con precisión de
modo que la instalación de dichos componentes es una pérdida de dinero por lo tanto. La solución más
sencilla y barata es usar una resistencia y un condensador para el funcionamiento del oscilador. Hay dos
modos en los que estos dos componentes sre utilizados:
RC modo. Cuando el oscilador externo está configurado para operar en modo RC, el pasador
OSC1 debe conectarse al circuito RC como se muestra en la figura a la derecha. El pasador
OSC2 da salida a la frecuencia del oscilador RC dividida por 4.Esta señal de reloj puede ser
utilizado para aplicaciones de calibración, sincronización o de otro tipo.
Rcio modo. Asimismo, el circuito RC está conectada a la clavija OSC1. Esta vez, la disposición
OSC2 pasador se utiliza como un adicional de propósito general pin I / O.
En ambos casos, se recomienda el uso de componentes como se muestra en las figuras.
La frecuencia de un oscilador se calcula según la fórmula F = 1 / T en la que:
f = frecuencia [Hz];
T = R * C = constante de tiempo [s];
R = resistencia de la resistencia [Ω], y
C = capacidad del condensador [F].
MODOS DE RELOJ INTERNO
El circuito oscilador interno consiste en dos osciladores separados que se pueden seleccionar como
fuente de reloj del sistema:
El oscilador HFINTOSC viene calibrado de fábrica y funciona a 8 Mhz. Su frecuencia puede ajustarse
desde el software utilizando los bits del registro OSCTUNE.
El oscilador LFINTOSC no está calibrado de fábrica y funciona a 31kHz.
Al igual que el oscilador externo, el oscilador interno también se puede configurar para funcionar en varios
modos. El modo de funcionamiento se selecciona de la misma manera que para el oscilador externo -
utilizando los bits de la palabra de configuración. En otras palabras, todos los ajustes se realizan desde el
software antes de escribir un programa en el microcontrolador.
OSCILADOR INTERNO EN MODO INTOSC
En este modo, el pasador OSC1 está disponible como un propósito general I / O, mientras que
el pasador OSC2 salidas de frecuencia seleccionado oscilador interno dividido por 4.
OSCILADOR INTERNO EN MODO INTOSCIO
En este modo, ambos pasadores están disponibles como propósito general pines I / O.
AJUSTES oscilador interno
El oscilador interno está formado por dos circuitos independientes.
1. El HFINTOSC de alta frecuencia del oscilador interno está calibrado de fábrica y funciona a 8 Mhz. Se
conecta a un postscaler (divisor de frecuencia). El postscaler permite este oscilador de impulsos de reloj
de salida en una de las siete frecuencias. La selección de la frecuencia se realiza en el software utilizando
IRCF2, IRCF1 y IRCF0 bits del registro OSCCON.
El oscilador HFINTOSC se activa al seleccionar una de las siete frecuencias (entre 8 MHz y 125 kHz) y
ajustar el reloj de bit del sistema Fuente (SCS) del registro OSCCON. Como puede verse en la figura a
continuación, todos los ajustes se realizan usando bits del registro OSCCON.
2. El LFINTOSC oscilador de baja frecuencia no está calibrado y funciona a 31 kHz. Se activa mediante la
selección de esta frecuencia de uso de bits del registro OSCCON y estableciendo el bit SCS del mismo
registro.
DOS VELOCIDADES DEL RELOJ modo de Arranque
Dos velocidades de reloj de arranque modo permite al microcontrolador para proporcionar ahorros
adicionales de energía cuando funciona en modo de reposo. ¿Qué es todo esto?
Cuando se configura para operar en LP, XT o HS modo, el oscilador externo se desactiva en la transición
a dormir con el fin de reducir el consumo de energía total del dispositivo.
Cuando las condiciones de activación cuando se cumplen, el microcontrolador no de inmediato
comenzará a operar porque tiene que esperar a que la frecuencia de reloj se estabilice. Toma
exactamente 1024 pulsos por el microcontrolador para proceder con la ejecución del programa. Después
de 1024 impulsos son contados y sólo unas pocas instrucciones de los programas se ejecutan, el
microcontrolador se suele fijar de nuevo a modo de suspensión. Esto significa que la mayor parte del
tiempo, así como la mayor parte de la energía suministrada por baterías se desperdicia. Este problema se
resuelve mediante el uso de un oscilador interno de la ejecución del programa, mientras que el recuento
de estos pulsos de 1024 está en curso. Tan pronto como la frecuencia del oscilador externo se estabiliza,
automáticamente se hará cargo del 'protagonismo'. Todo el proceso se activa mediante el establecimiento
de un bit de la palabra de configuración. Con el fin de programar el microcontrolador de esta manera, es
necesario seleccionar la opción Ext. Int.-conmutación dentro del software.
Fail-Safe reloj del monitor
Como su nombre indica, el reloj del monitor a prueba de errores (FSCM) supervisa el funcionamiento del
oscilador externo y permite que el microcontrolador para proceder con la ejecución del programa a pesar
de que el oscilador externo falla por alguna razón. En este caso, el oscilador interno toma su lugar.
La prueba de fallos monitor de reloj detecta el fallo comparando fuentes de reloj internas y externas. Si se
necesita más que 2mS para el reloj oscilador externo por venir, la fuente de reloj cambiará
automáticamente. El oscilador interno se hará cargo de la función de la fuente de reloj principal de la
operación que está controlada por los bits del registro OSCCON. Cuando el bit del registro OSFIE PIE2
está establecido, una interrupción será generada. El reloj del sistema se mantendrá en el que se obtengan
a partir del oscilador interno hasta que el microcontrolador se reinicia correctamente el oscilador externo y
vuelve a la fuente de reloj externa.
Este módulo también está habilitada, cambiando la palabra de configuración antes de iniciar el proceso de
programación. En este ejemplo, se realiza seleccionando la opción Fail-Safe Monitor de Reloj.
OSCTUNE Registrarse
Las modificaciones en el registro OSCTUNE afecta a la frecuencia HFINTOSC, pero no la frecuencia
LFINTOSC. No hay ninguna indicación durante el funcionamiento del microcontrolador desplazamiento de
frecuencia que se ha producido.
TUN4 - tun0 bits de sintonía Frecuencia Mediante la combinación de estos cinco bits, los cambios de
frecuencia del oscilador de 8MHz..De esta manera, las frecuencias obtenidas por su división en el
postscaler cambiar también.
T U N 4 T U N 3 T U N 2 T U N 1 T U N 0 F R E C U E N C I A
0 1 1 1 1 Máximo
0 1 1 1 0
0 1 1 0 1
0 0 0 0 1
0 0 0 0 0 Calibrado
1 1 1 1 1
1 0 0 1 0
1 0 0 0 1
1 0 0 0 0 Mínimo
3,11 memoria EEPROM
EEPROM es un segmento de memoria por separado, no es parte de la memoria de programa (ROM), ni la
memoria de datos (RAM). A pesar de que lugares de la memoria EEPROM no es fácil y rápido acceso a
otros registros, que son de gran importancia ya que los datos EEPROM se guardan de forma permanente,
incluso después de la pérdida de poder y se puede cambiar en cualquier momento. Estas características
excepcionales que lo hagan cada byte de la EEPROM valioso.
El microcontrolador PIC16F887 tiene 256 localizaciones de memoria EEPROM datos controlados por los
bits de los registros siguientes:
EECON1 (registro de control);
EECON2 (registro de control);
EEDAT (almacena los datos listos para leer y escribir), y
EEADR (dirección de la ubicación de las tiendas de EEPROM para acceder).
El registro EECON2 no es una verdad, no existe físicamente. Se utiliza únicamente en la secuencia de
datos del programa de escritura.
Además de los registros antes mencionados, los registros y EEDATH EEADRH se utilizan también para
escribir y leer la EEPROM.También se utilizan para el programa (FLASH) de memoria de lectura y
escritura.
Estos registros se considera una zona de riesgo y rara vez se utiliza ya que cualquier error puede ser fatal
para su programa (que seguramente no desea que su microcontrolador para eliminar de forma accidental
o cambiar su propio programa). No habrá nuevas discusiones aquí, pero ten cuidado.
EECON1 Registrarse
EEPGD - Programa / EEPROM de datos Seleccione bits
1 - la memoria de acceso al programa.
0 - Acceso a la memoria EEPROM.
WRERR - Error de EEPROM poco Bandera
1 - Escribir se termina prematuramente y el error se ha producido.
0 - Escribir completado.
WREN - EEPROM Escribir Habilitar poco.
1 - Escribe en la memoria EEPROM habilitada.
0 - Escribir en la memoria EEPROM deshabilitada.
WR - bit de control de escritura
1 - Inicia la escritura en la memoria EEPROM.
0 - Escribir en la memoria EEPROM completado.
RD - bits de control de lectura
1 - Inicia la lectura de la EEPROM.
0 - Leer EEPROM deshabilitada.
Leer datos en la EEPROM
Con el fin de permitir que los datos se leen de la memoria EEPROM, siga el procedimiento siguiente:
Paso 1: Escriba la dirección de (00h - FFh) en el registro EEADR.
Paso 2: Seleccione el bloque de memoria EEPROM en la limpieza de la broca EEPGD del registro EECON1.
Paso 3: Establecer el bit RD del registro mismo de leer la posición de memoria adecuada.
Paso 4: Los datos se almacenan en el registro EEDAT y está listo para usar.
El siguiente ejemplo ilustra el procedimiento anterior cuando el programa está escrito en lenguaje
ensamblador:
BSF STATUS,RP1 ;
BCF STATUS,RP0 ; Access bank 2
MOVF ADDRESS,W ; Move address to the W register
MOVWF EEADR ; Write address
BSF STATUS,RP0 ; Access bank 3
BCF EECON1,EEPGD ; Select EEPROM memory block
BSF EECON1,RD ; Read data
BCF STATUS,RP0 ; Access bank 2
MOVF EEDATA,W ; Data is stored in the W register
La secuencia de un mismo programa escrito en un lenguaje básico es como sigue:
W = EEPROM_Read (ADDRESS)
Ahora te das cuenta de las ventajas del lenguaje Basic, ¿no?
Escribir datos en la EEPROM
Antes de escribir datos en la memoria EEPROM es necesario para escribir datos en el registro EEDAT y
la dirección apropiada para el registro EEADR. Todo lo que queda es ejecutar una secuencia del
programa especial para iniciar de escritura para cada byte.Interrupciones debe ser desactivado mientras
los proces de escritura de datos en la EEPROM está en curso.
El siguiente ejemplo ilustra el procedimiento anterior cuando el programa está escrito en lenguaje
ensamblador:
BSF STATUS,RP1
BSF STATUS,RP0
BTFSC EECON,WR1 ; Wait for the previous write to complete
GOTO $-1 ;
BCF STATUS,RP0 ; Bank 2
MOVF ADDRESS,W ; Move address to W
MOVWF EEADR ; Write address
MOVF DATA,W ; Move data to W
MOVWF EEDATA ; Write data
BSF STATUS,RP0 ; Bank 3
BCF EECON1,EEPGD ; Select EEPROM memory block
BSF EECON1,WREN ; Write to EEPROM enabled
BCF INCON,GIE ; All interrupts disabled
BSF INTCON,GIE ; Interrupts enabled
BCF EECON1,WREN ; Write to EEPROM disabled
MOVLW 55h
MOVWF EECON2
MOVLW AAh
MOVWF EECON2
BSF EECON1,WR
La secuencia de un mismo programa escrito en un lenguaje básico es como sigue:
W = EEPROM_Write(ADDRESS, W)
¿Necesita un comentario?
Vamos a hacerlo en mikroBasic ...
' This example demonstrates the use of EEPROM Library in
mikroBasic PRO for PIC.
program eeprom_test
dim ii as byte ' ii variable used in the loop
main:
ANSEL = 0 ' Configure AN pins as digital I/O
ANSELH = 0
PORTB = 0
PORTC = 0
PORTD = 0
TRISB = 0
TRISC = 0
TRISD = 0
for ii = 0 to 32 step 1 ' Fill data buffer
EEPROM_Write(0x80+ii, ii) ' Write data to address 0x80+ii
next ii
EEPROM_Write(0x02,0xAA) ' Write data (number 0xAA) to EEPROM
address 2
EEPROM_Write(0x50,0x55) ' Write data (number 0x55) to EEPROM
address 0x50
Delay_ms(1000) ' Blink PORTB and PORTC diodes
PORTB = 0xFF ' to indicate start of reading
PORTC = 0xFF
Delay_ms(1000)
PORTB = 0x00
PORTC = 0x00
Delay_ms(1000)
PORTB = EEPROM_Read(0x02) ' Read data from EEPROM address 2 and
display it on PORTB
PORTC = EEPROM_Read(0x50) ' Read data from EEPROM address 0x50
and display it on PORTC
Delay_ms(1000)
for ii = 0 to 32 step 1 ' Read 32 bytes block from
address 0x80
PORTD = EEPROM_Read(0x80+ii) ' and display data on PORTD
Delay_ms(250)
next ii
end.
3.12 REINICIAR! NEGRO-OUT, Brown-out o ruidos?
A primera vista, es suficiente para encender la cámara para hacer que el microcontrolador funcione. A
primera vista, es suficiente para apagar la unidad para hacer que deje de funcionar. Sólo a primera vista
... De hecho, de inicio y final de la operación dependerá de una señal especial que se llama RESET.
Una condición de reposición hace que el microcontrolador para detener inmediatamente la operación y
borrar sus regis tros. Una señal de reposición puede ser generada externamente en cualquier momento
(el pin MCLR es conducido bajo). También puede ser generada por dentro del microcontrolador, si es
necesario. Un poder, a condición siempre causa un reinicio que se produzca. Puesto que hay muchas
ocurrencias que se acompañan que tienen lugar cuando la fuente de alimentación está encendido
(intermitente de contacto de interruptor y el aumento del espumoso, el voltaje lento, estabilización gradual
frecuencia de reloj, etc), es necesario para proporcionar un retardo de tiempo determinado por el
microcontrolador antes de que comience a operar. Dos temporizadores independientes PWRT y OST se
encarga de eso. El primero puede ser activada o desactivada durante el proceso de programación. Vamos
a ver lo que realmente ocurre aquí:
Cuando la tensión de alimentación llega a 1,2 - 1,7 V, un circuito llamado de encendido se
reinicia el temporizador del microcontrolador en un plazo aproximado 72mS. Temporizador Tan
pronto como expire este tiempo, otro temporizador denominado arranque del oscilador genera
otra señal de reposición dentro de los períodos 1024 oscilador de cuarzo. Cuando expire este
tiempo de retardo (marcado como reset T en la figura a la derecha) y el pin MCLR es excitada
alta, el microcontrolador puede comenzar a ejecutar el primer programa de instrucción.
Además de este llamado "controlado" reset que se produce en el momento en que la fuente de
alimentación continua, hay otras dos condiciones de restablecimiento llamados Negro de salida y Brown
fuera que pueden ocurrir durante el funcionamiento del microcontrolador, así como en el momento la
fuente de alimentación se apaga.
NEGRO-restablecer
El restablecimiento de negro de salida tiene lugar cuando el microcontrolador está
correctamente apagado. En este caso, el microcontrolador no tiene tiempo para hacer nada
impredecible debido a que la tensión de alimentación cae muy rápido en virtud de su valor
mínimo. A la luz wordsthe otra se apaga, la cortina se cae y el espectáculo ha terminado.
Brown-out de RESET
Cuando la tensión de alimentación desciende lentamente (un ejemplo típico es una descarga
de la batería, aunque el microcontrolador experimenta mucho más rápidas caídas de tensión
como procesos lentos), los componentes electrónicos internos gradualmente deja de funcionar
y se produce la llamada de Brown-restablecer. Antes de que el microcontrolador
completamente deja de funcionar hay un riesgo de que los circuitos que operan a voltajes más
altos comenzar a realizar de forma impredecible. El reinicio brown-out también puede ser fatal
para el programa, ya que se guarda en la memoria flash en el chip.
RUIDO
El ruido es un tipo especial de brown-out reset que se produce en el entorno industrial siempre
que "parpadea de la tensión de alimentación por un momento y cae por debajo del nivel
mínimo. Incluso corto, por ejemplo un ruido en la fuente de alimentación puede afectar
considerablemente el funcionamiento del microcontrolador.
MCLR PIN
Un cero lógico (0) en el pin MCLR provoca que el microcontrolador que se restablezca
inmediatamente y de una manera apropiada. Se recomienda para conectarlo como en la figura
de la derecha. La función de los componentes adicionales es mantener "pura" lógica de un (1)
durante la operación normal. Si estos componentes se configuran para proporcionar un nivel
lógico alto (1) en el pin MCLR después de restablecer T es más, el microcontrolador
inmediatamente comenzará a operar. Esta condición puede ser muy útil cuando es necesario
para sincronizar el funcionamiento del microcontrolador y la electrónica adicionales, así como el
funcionamiento de varios microcontroladores.
Con el fin de evitar cualquier error que pueda ocurrir en el Brown-out reset, el PIC 16F887 tiene un
"mecanismo de protección" built-in. Es un circuito simple, pero eficaz, que responde cada vez que la
tensión de alimentación cae por debajo de 4V durante más de 100 microsegundos. Este circuito genera
una señal de reposición y desde ese momento el microcontrolador funciona como si se hubiera acaba de
encender.
Capítulo 4: Ejemplos
El propósito de este capítulo es proporcionar información básica que usted necesita saber con el fin de
poder utilizar microcontroladores con éxito en la práctica. En este capítulo, por lo tanto, no contiene
ningún programa o esquema super interesante dispositivo con soluciones sorprendentes. En cambio, los
siguientes ejemplos son una prueba mejor que escribir un programa es un privilegio ni una cuestión de
talento, pero la capacidad de los simples directivas de poner las piezas del rompecabezas juntas
usando. Diseño y desarrollo de dispositivos, principalmente se reducen a el método de "prueba correcta
de la repetición". Por supuesto, cuanto más estás en él, más complicado se hace desde las piezas del
rompecabezas se unen por los niños y los arquitectos de primera clase ...
4.1 CONEXIÓN BÁSICA
4.2 COMPONENTES ADICIONALES
4.3 Ejemplo 1 - Escribir cabecera, configurar pines de E / S y utilizar la función de retardo
4.4 Ejemplo 2 - Instrucciones de uso, armado y LFINTOSC oscilador interno
4.5 Ejemplo 3 - TMR0 como contador, declarar nuevas variables, símbolos de uso y de relé
4.6 Ejemplo 4 - Use temporizadores TMR0, TMR1 y TMR2. Utilice las interrupciones, declarar el nuevo procedimiento
4.7 Ejemplo 5 - Uso del temporizador perro guardián
Ejemplo 6 4,8 - Módulo CCP1 como un generador de señal PWM
4.9 Ejemplo 7 - Utilice un convertidor A / D
4.10 EJEMPLO 8 - Utilizar memoria EEPROM
4.11 Ejemplo 9 - Dos dígitos contador de LED, la multiplexación
4.12 EJEMPLO 10 - Utilización LCD
4.13 EJEMPLO 11 - comunicación serie RS232
4.14 EJEMPLO 12 - Medir la temperatura con sensor de DS1820. El uso del protocolo '1-wire '
4,15 Ejemplo 13 - la generación de sonido, librería de sonidos ...
4.16 EJEMPLO 14 - Utilizar una pantalla gráfica LCD
4.17 EJEMPLO 15 - Utilizar un panel sensible al tacto
4.18 EJEMPLO 16 - Utilizar un teclado 4x4
4.1 CONEXIÓN BÁSICA
A fin de que el microcontrolador para funcionar correctamente, es necesario proporcionar:
Fuente de alimentación;
Restablecer la señal, y
Señal de reloj.
Como puede verse en la figura anterior, se trata de circuitos sencillos. Pero no es siempre el caso. Si el
dispositivo de destino se utiliza para controlar costosas máquinas o dispositivos de soporte de vida, todo
se complica cada vez más. De todos modos, esta sencilla solución va a hacer por el momento ...
FUENTE DE ALIMENTACIÓN
Aunque el PIC16F887 puede operar a diferentes voltajes de alimentación, ¿por qué 'la ley de Murphy
"prueba? Un 5V DC tensión de alimentación es el más adecuado. El circuito, que se muestra en la página
anterior, utiliza una barata integrado de tres terminales LM7805 regulador positivo y proporciona una
estabilidad de la tensión alta calidad y muy corriente suficiente para permitir que los módulos de
microcontroladores y periféricos para operar con normalidad (los medios suficientes 1A).
La señal de reset
A fin de que el microcontrolador para funcionar correctamente, un uno lógico (VCC) debe ser aplicada en
el pasador de reposición. Un botón de conectar el pin de reset MCLR a GND no es necesario, pero es
casi siempre proporcionada, ya que permite que el microcontrolador se recuperan rápidamente si algo
sale mal. Al pulsar este botón, el pin MCLR se suministra con 0V, el microcontrolador se produce y el
restablecimiento de la ejecución del programa comienza desde el principio. Una resistencia de 10K se
utiliza para evitar acortar el carril 5V DC a la tierra desde que ocurre cuando el botón se pulsa RESET.
Señal de reloj
A pesar de que el microcontrolador tiene un oscilador incorporado, no puede funcionar sin componentes
externos que hacen que su funcionamiento estable y determinar su frecuencia de
operación. Dependiendo de los componentes en uso y sus frecuencias de funcionamiento, el oscilador se
puede ejecutar en cuatro modos diferentes:
LP - Cristal de baja potencia;
XT - Cristal / resonador;
SA - Cristal de alta velocidad / resonador, y
RC - resistencia / condensador.
¿Cuál es el punto de utilizar estos modos?Debido al hecho de que es casi imposible diseñar un
oscilador para operar de forma estable sobre un amplio rango de frecuencias, el
microcontrolador debe estar familiarizado con el tipo de cristal de cuarzo conectado de manera
que se puede ajustar el funcionamiento de su oscilador de reloj a la misma. Por eso, todos los
programas que se utilizan para los microcontroladores de programación contiene una opción
para la selección del oscilador modo. Véase la figura de la izquierda.
Cristal de cuarzo
Cuando el cristal de cuarzo se utiliza para estabilizar la frecuencia, la incorporada en el oscilador funciona
a una frecuencia precisa que no se ve afectada por cambios en el voltaje de suministro de potencia y
temperatura. Esta frecuencia está por lo general aparece en la carcasa de cristal de cuarzo.
Además de los cristales, los condensadores C1 y C2 también debe estar conectado como por esquema
de arriba. Su capacitancia no es de gran importancia. Por lo tanto, los valores indicados en la mesa de al
lado el esquema debe ser considerado como una recomendación, y no como una regla estricta.
Resonador cerámico
Un resonador de cerámica es más barato, pero muy similar al cuarzo por su función y modo de
funcionamiento. Por ello, estos dos esquemas, que ilustran su conexión con el microcontrolador, son
idénticos. Sin embargo, en comparación con el cristal de cuarzo, la capacitancia de los condensadores C1
y C2 es ligeramente diferente debido a las diferentes características eléctricas. Consulte la tabla siguiente.
Resonadores de cerámica normalmente están conectados a osciladores cuando no es necesario para
proporcionar una frecuencia extremadamente precisa.
RC oscilador
Si la frecuencia de funcionamiento no importa, entonces no hay necesidad de utilizar componentes
adicionales costosos para su estabilización. En su lugar, una simple red RC, como se muestra en la figura
a continuación, se debe utilizar. En este caso, sólo la entrada de oscilador de reloj del microcontrolador se
utiliza, lo que significa que la señal de reloj con la Fosc / 4 frecuencia aparecerá en el pasador
OSC2. Esta frecuencia es la misma que la frecuencia de funcionamiento del microcontrolador, es decir,
representa la velocidad de ejecución de la instrucción.
Oscilador externo
Si se requiere para sincronizar el funcionamiento de varios microcontroladores o si por alguna razón, no
es posible utilizar cualquiera de las configuraciones anteriores, una señal de reloj puede ser generada por
un oscilador externo. Refiérase a la figura de abajo.
4.2 COMPONENTES ADICIONALES
A pesar del hecho de que el microcontrolador es un producto de la tecnología moderna, es de ninguna
utilidad si no está conectado a los componentes adicionales. En pocas palabras, la aparición de voltaje en
los pines del microcontrolador no significa nada si no se utiliza para realizar ciertas operaciones, tales
como convertir algo de encendido / apagado, cambio, etc mostrar
Esta sección cubre algunos de los componentes más utilizados en la práctica adicionales tales como
resistencias, transistores, LEDs, pantallas LED, pantallas LCD y RS-232 módulos de comunicación.
Interruptores y pulsantes de
Interruptores y pulsadores es probable que los componentes más simples que proporcionan la
forma más sencilla de llevar la tensión en unos pines del microcontrolador de entrada. Por
supuesto, no es tan simple como que en la práctica ... Lo que lo hace complicado es un rebote
de contacto.
El rebote de contacto es un problema común con los interruptores mecánicos. Cuando los
contactos chocan juntos, su impulso y la elasticidad de actuar en conjunto para causar un
rebote. El resultado es una corriente rápidamente impulsos eléctricos en lugar de una transición
limpia de cero a plena corriente. En su mayoría se produce debido a las vibraciones, las
pequeñas asperezas y la suciedad entre los contactos. El rebote ocurre demasiado rápido de
modo que no es posible notar cuando estos componentes se utilizan normalmente.
Sin embargo, esto causa problemas en algunos circuitos lógicos y analógicos que responden
suficientemente rápido como para malinterpretar encendido / apagado impulsos como una secuencia de
datos. En otras palabras, todo el proceso no dura mucho tiempo (unos pocos micro o milisegundos), pero
lo suficiente como para ser registrado por el microcontrolador. Cuando sólo un pulsador se utiliza como
una fuente de señal de contador, se producen errores en casi el 100% de los casos.
Una de las posibles soluciones a este problema es conectar a un circuito simple RC para suprimir rápidos
cambios de voltaje. Dado que el período de rebote no está definido, los valores de los componentes no
puede determinarse con precisión. En la mayoría de los casos, se recomienda el uso de los mismos
valores, como se muestra en la figura a continuación.
Si la estabilidad completa se requiere entonces medidas radicales deben ser tomadas. La salida del
circuito lógico, como se muestra en la figura a continuación (flip-flop RS), cambiará su estado lógico
después de detectar el primer pulso disparado por un rebote de contacto. Esta solución es más cara
(interruptor SPDT), pero más seguro sin duda.
Además de estas soluciones de hardware, hay también una solución de software sencillo. Cuando el
programa comprueba el estado lógico de un pin de entrada y detecta un cambio, la comprobación debe
hacerse una vez más después de un cierto retraso. La verificación de cambio significa que el botón del
interruptor / pulsador ha cambiado su posición. Las ventajas de esta solución son claras: es de forma
gratuita y se puede aplicar a los contactos de baja calidad.
RELÉS
Un relé es un interruptor eléctrico que abre y cierra bajo el control de otro circuito eléctrico. Por
lo tanto, conectado a los pines de salida del microcontrolador y se utiliza para activar /
desactivar los dispositivos de potencia tales como motores, transformadores, resistencias,
bombillas, etc Estos dispositivos se colocan casi siempre lejos de los componentes sensibles a
bordo. Hay varios tipos de relés y todos funcionan de la misma manera. Cuando la corriente
fluye a través de la bobina, el relé es operado por un electroimán para abrir o cerrar uno o más
conjuntos de contactos.Similar a acopladores ópticos, no hay conexión galvánica (contacto
eléctrico) entre la entrada y salida de los relés. Relés por lo general requieren de alta tensión y
alta corriente para iniciar la operación, pero también los hay en miniatura que pueden ser
activadas por baja corriente directa alimentado por un pin del microcontrolador.
La figura siguiente muestra la forma más común de conectar un relé a la red otros dispositivos de
potencia.
Con el fin de evitar que el alto voltaje de autoinducción, causada por una parada repentina del flujo de
corriente a través de la bobina, un diodo polarizado invertida está conectado en paralelo a la bobina. El
propósito de este diodo es 'cortar' el pico de tensión.
DIODOS LED
Usted probablemente sabe todo lo que usted debe saber acerca de los LED, pero también debemos
pensar en las generaciones más jóvenes ... Vamos a ver, cómo destruir un LED? Bueno ... fácilmente.
Quick Burning
Al igual que cualquier otro diodo, los LEDs tienen dos extremos-un ánodo y un cátodo. Conecte un diodo
correctamente a la tensión de alimentación y que emitirá luz felizmente. Gire el diodo al revés y aplicar la
misma tensión de alimentación (aunque sea por un momento).Es probable que no emiten luz - nunca
más!
Slow Burning
Hay un nominal (lo consideran como máximo) corriente especificada para cada LED que no se debe
superar. Si esto sucede, el diodo emitirá luz más intensa, pero sólo durante un corto período de tiempo.
Algo para recordar
Del mismo modo, todo lo que necesita hacer es quitar una resistencia limitadora de corriente se muestra a
continuación. Dependiendo de la tensión de alimentación, los efectos podrían ser espectaculares.
DISPLAY LED
Básicamente, una pantalla LED no es más que varios LEDs moldeados en el caso mismo
plástico. Hay muchos tipos de pantallas y algunos de ellos están compuestos de varias
decenas incorporados en los diodos que pueden visualizar símbolos diferentes. Sin embargo,
la pantalla más utilizada es un display de 7 segmentos. Se compone de 8 LEDs. Siete
segmentos de un dígito se disponen en forma de rectángulo para mostrar los símbolos,
mientras que el segmento adicional se utiliza para mostrar un punto decimal. Con el fin de
simplificar la conexión, los ánodos o cátodos de todos los diodos están conectados a un solo
pasador de modo que hay pantallas ánodo común y pantallas comunes de cátodo,
respectivamente. Segmentos están marcadas con las letras de la A a g, además de DP, como
se muestra en la figura a continuación. Cuando se conecta una pantalla LED, cada diodo es
tratada por separado, lo que significa que cada uno debe tener su propia resistencia limitadora
de corriente.
Aquí hay algunas cosas que usted debe prestar atención a la hora de comprar pantallas de LED:
Como se mencionó anteriormente, dependiendo de si los ánodos o cátodos están conectados a la clavija común, hay pantallas ánodo común y pantallas comunes catódicos. No hay ninguna diferencia entre ellos para nada en su apariencia lo que se recomienda para corroborar que se va a utilizar antes de instalarla.
La corriente máxima que cada pin del microcontrolador puede recibir o dar es limitado. Por lo tanto, si varias pantallas están conectados al microcontrolador entonces llamado bajo LED actuales limitados a 2mA sólo debe ser utilizado.
Segmentos de la pantalla suelen ser marcadas con las letras de A a G, pero no hay una regla que indica rápida visualización pines que están conectados. Por esta razón, es muy importante para comprobar la conexión antes de empezar a escribir un programa o el diseño de un dispositivo.
LED muestra conectado al microcontrolador normalmente ocupan un gran número de valiosos pines I / O,
que puede ser molesto, especialmente cuando es necesario para visualizar múltiples números dígitos. Es
aún más complicado si, por ejemplo, es necesario para mostrar dos 6-dígitos. Un simple cálculo muestra
que 96 pines de salida son necesarios en este caso. La solución a este problema se denomina
multiplexación.
Así es como una ilusión óptica basada en el mismo principio de funcionamiento como una cámara de
película está hecha. Sólo un dígito está activo en un momento, pero cambian sus condiciones de
encendido / apagado tan rápidamente hormigonado la impresión de que todos los dígitos de un número
son activos simultáneamente.
Echemos un vistazo a la figura de arriba. En primer lugar un byte que representa las unidades se carga en
el puerto PORT2 microcontrolador y transistor T1 se activa al mismo tiempo. Después de un tiempo, el
transistor T1 está apagado, un byte que representa decenas se carga a PORT2 y el transistor T2 se
activa. Este procedimiento se repite cíclicamente a alta velocidad para todos los dígitos y transistores
correspondientes.
Un hecho decepcionante, lo que indica que el microcontrolador es sólo una especie de ordenador en
miniatura diseñado para sólo entienden el lenguaje de ceros y unos se expresa plenamente cuando se
muestran los dígitos. Es decir, el microcontrolador no sabe lo que las unidades, decenas o centenares
son, ni lo que diez dígitos que se usan para que parezca. Por esta razón, cada número que se muestra
debe someterse al procedimiento siguiente:
En primer lugar, un número de varios dígitos debe ser dividido en unidades, decenas etc en una subrutina
especializado. Entonces cada uno de estos dígitos debe ser almacenado en un byte específico. Dígitos de
obtener la apariencia reconocible para los seres humanos mediante la realización de un procedimiento
sencillo llamado "enmascaramiento". En otras palabras, un número binario se sustituye con una
combinación diferente de bits. Por ejemplo, el dígito 8 (0000 1000) se sustituye por el número binario
0111 1111 con el fin de activar todos los LEDs que muestran este dígito. El diodo único que queda
inactiva aquí está reservado para el punto decimal.
Si el puerto microcontrolador está conectado a una pantalla de modo que "a" que el bit 0 segmento activa,
poco "b" 1 segmento se activa, el bit 2 del segmento "c", etc, entonces la tabla de abajo muestra máscara
binario apropiado para cada dígito.
D Í G I T O S
P A R A M O S T R A R
M O S T R A R S E G M E N T O S
dp un b c d e F g
0 0 1 1 1 1 1 1 0
1 0 0 1 1 0 0 0 0
2 0 1 1 0 1 1 0 1
3 0 1 1 1 1 0 0 1
4 0 0 1 1 0 0 1 1
5 0 1 0 1 1 0 1 1
6 0 1 0 1 1 1 1 1
7 0 1 1 1 0 0 0 0
8 0 1 1 1 1 1 1 1
9 0 1 1 1 1 0 1 1
Además de los dígitos (0-9), hay algunas letras del alfabeto - A, C, E, J, F, U, H, L, b, c, d, O, R, T-que
también se puede mostrar por enmascaramiento.
En caso de que las pantallas comunes del ánodo se utilizan, todos los que se incluyen en la tabla de
arriba debe ser reemplazado con ceros y viceversa. Además, los transistores PNP debe utilizarse como
conductores.
IC
Un acoplador óptico es un componente comúnmente utilizado para microcontrolador galvánicamente
separadas de cualquier corriente potencialmente peligroso o tensión en su entorno. Optoacoplador suelen
tener fuentes de uno, dos o cuatro de luz (LED) en su entrada, mientras que en su salida, frente a los
diodos, hay el mismo número de componentes sensibles luz (fototransistores, foto-tiristores o
phototriacs). La cuestión es que un acoplador óptico utiliza un trayecto corto de transmisión óptica para
transferir una señal entre los diodos y componentes foto-sensibles, mientras que los mantiene aislado
eléctricamente. Este aislamiento tiene sentido sólo si estos componentes por separado alimentado. De
esta manera, el microcontrolador y sus módulos adicionales están completamente protegidos de alto
voltaje y ruidos que por lo general les hacen sufrir daños o funcionar de una manera impredecible. Los
optoacopladores utilizados con más frecuencia son los que tienen fototransistores sobre su
producción. Cuando se trata de los optoacopladores con el interior de la base-a-pin 6 de conexión
(también hay optoacopladores sin ella), la base puede dejarse sin conectar.
La red de R / C se indica por una línea punteada en la figura anterior es una conexión opcional que
reduce los efectos del ruido mediante la eliminación de impulsos muy cortos.
PANTALLA LCD
Una pantalla LCD se fabrica específicamente para el uso con los microcontroladores, lo que significa que
no pueda ser activado por circuitos estándar de CI. Se utiliza para mostrar diferentes mensajes en una
pantalla de cristal líquido en miniatura. La pantalla LCD se describe aquí es por su bajo precio y una gran
capacidad de uso más frecuente en la práctica. Se basa en el controlador HD44780 (Hitachi) y muestra
los mensajes en dos líneas de 16 caracteres cada una. Distintos símbolos como las letras del alfabeto, las
letras griegas, signos de puntuación, símbolos matemáticos, etc se pueden mostrar en ella. También es
posible visualizar símbolos creados por el usuario. Otras funciones útiles incluyen cambio automático de
mensajes (izquierda y derecha), el aspecto del cursor, retroiluminación LED, etc
La pantalla LCD Pines
A lo largo de un lado de la placa pequeña impresa de la pantalla LCD hay pasadores que permiten que se
conecta al microcontrolador.Hay un total de 14 pines marcados con los números (16, si hay una luz de
fondo está disponible). Sus funciones se describen en la tabla::
F U N C I Ó N N Ú M E R O D E P I N
N O M B R E S T A T E L O G I C
D E S C R I P C I Ó N
Suelo 1 Vss - 0V
Fuente de alimentación
2 Vdd - +5 V
Contraste 3 Vee - 0 - Vdd
El control de funcionamiento
4 RS 0
1
D0 - D7 considerado como comandos
D0 - D7 considerarse como datos
5 R / W 0 1
Escribir los datos (desde el controlador de LCD)
Leer los datos (de LCD para el controlador)
6 E 0 1
Del 1 al 0
El acceso a personas con discapacidad LCD
Normal de funcionamiento Los datos o comandos que se
transfieren a la pantalla LCD
Los datos o
comandos
7 D0 0/1 Bit 0 LSB
8 D1 0/1 El bit 1
9 D2 0/1 El bit 2
10 D3 0/1 El bit 3
11 D4 0/1 Bit 4
12 D5 0/1 El bit 5
13 D6 0/1 El bit 6
14 D7 0/1 Bit 7 MSB
Pantalla LCD
Una pantalla de LCD es un panel delgado y plano se utiliza para mostrar diferentes contenidos. Se
compone de dos líneas cada uno con hasta 16 caracteres de 5x8 píxeles o 5x11. El funcionamiento de
una pantalla LCD 5x8 se describe aquí, ya que es más frecuentemente utilizado.
Contraste de la pantalla depende de la tensión de alimentación y si los mensajes se muestran en una o
dos líneas. Por esta razón, un voltaje variable (0-Vdd) se aplica a la clavija marcada como Vee mediante
un potenciómetro de ajuste. Algunas pantallas LCD tienen una luz de fondo integrada (LED de color azul
o verde). Cuando la luz se utiliza, una resistencia limitadora de corriente debe ser conectado en serie con
uno de los pasadores para el suministro de luz de fondo de potencia (similar a los LED).
Si no hay caracteres de la imagen o si se atenúan cuando la pantalla se enciende, lo primero que se debe
hacer es comprobar el potenciómetro de ajuste de contraste. ¿Está ajustado correctamente? Lo mismo se
aplica si el modo de funcionamiento de la pantalla se ha cambiado (escribir en una o dos líneas).
LCD Memoria
Pantalla LCD contiene tres bloques de memoria:
DDRAM Display Data RAM;
CGRAM Generador de caracteres de RAM, y
Carácter CGROM Generador de ROM. Memoria DDRAM
La memoria DDRAM se utiliza para almacenar los caracteres que se mostrará. Es capaz de almacenar
hasta 80 caracteres. Algunas posiciones de memoria están directamente relacionados con los campos de
caracteres en la pantalla.
El principio de funcionamiento de la memoria DDRAM es muy sencillo: basta con configurar una pantalla
para incrementar direcciones automáticamente (desplazamiento a la derecha) y establecer la dirección de
partida para el mensaje que se mostrará (por ejemplo, 00 hexadecimal).
Después de eso, todos los caracteres enviados a través de líneas D0-D7 se mostrará en la pantalla como
un mensaje que se utilizan para - de izquierda a derecha. En este caso, mostrando aperturas desde el
campo primer carácter en la primera línea porque la dirección de partida es 00 hexadecimal. No importa
cuántos caracteres se envían, sólo los dieciséis primeros serán visibles en la pantalla, mientras que el
resto de ellos se guarda y se muestra posteriormente con el comando de cambio. En la práctica, la
pantalla LCD es como una ventana en el cambio de dirección izquierda-derecha en las posiciones de
memoria que contengan caracteres distintos. Esto es, de hecho, cómo el efecto del mensaje
desplazamiento sobre la pantalla se ha creado.
Si el cursor está activado, siempre se coloca en el campo de caracteres actualmente dirigida. En otras
palabras, tan pronto como el carácter apropiado aparece en la posición del cursor, la coursor se mueve
automáticamente al siguiente campo requerido.
Como su nombre indica, la memoria DDRAM es un tipo de memoria RAM, lo que significa que los datos
se pueden escribir y leer de ella, mientras que su contenido se pierde irremediablemente cuando se
desconecta la alimentación.
CGROM memoria
CGROM la memoria contiene un mapa de carácter estándar con todos los caracteres que se pueden
visualizar en la pantalla. Cada personaje se le asigna una ubicación de memoria:
Las direcciones de las ubicaciones de memoria CGROM coincidir con los caracteres ASCII
estándar. Vamos a ver lo que significa acctually. Si el programa es ejecutado por el microcontrolador se
encuentra con "P carácter de envío a puerto un comando, el valor binario 0101 0000 aparecerá en el
puerto. Este valor es equivalente ASCII de carácter P. Como resultado, el símbolo correspondiente al
0101 0000 ubicación de memoria CGROM, es decir, la letra P, se visualiza en la pantalla. Lo mismo
sucede con todas las letras del alfabeto (mayúsculas y pequeñas), pero no a los números.
Si usted mira cuidadosamente el mapa de la página anterior, te darás cuenta de que las direcciones de
todos los dígitos se desplaza hacia adelante en un 48 en relación con sus valores (dígito 0 es la dirección
48, el dígito 1 dirección es 49, el dígito 2 dirección es 50, etc) . Por lo tanto, con el fin de mostrar los
dígitos correctamente, es necesario añadir número decimal 48 a cada uno de ellos antes de enviarlo a
una pantalla LCD.
¿Qué es ASCII? Desde sus inicios hasta la actualidad, los ordenadores pueden reconocer los números
solamente, pero no las letras.Esto significa que todos los datos de un permutas PC con un dispositivo
periférico se convierte en formato binario, aunque el mismo es reconocido por los seres humanos como
cartas (teclado es un ejemplo excelente). En otras palabras, cada carácter coincide con una combinación
única de ceros y unos. ASCII es la codificación de caracteres basado en el alfabeto Inglés. El código
ASCII especifica una correspondencia entre los símbolos de caracteres estándar y sus equivalentes
numéricos.
CGRAM MEMORIA
Además de los caracteres estándar, la pantalla LCD también se pueden mostrar símbolos definidos por el
usuario en el tamaño de los píxeles 5x8. Se habilita por un tipo especial de memoria RAM llamada
CGRAM (64 bytes).
Los registros de memoria de 8 bits de ancho, pero sólo 5 bits más bajos se utilizan. Lógica uno (1) en
cada registro representa un campo atenuado, mientras que 8 localidades agrupados juntos representan
un carácter. Refiérase a la figura a continuación:
Los símbolos se define generalmente En un principio del programa por ceros y unos simples de escritura
a los registros de la memoria CGRAM con el fin de formar las formas deseadas. Con el fin de mostrarlos,
es suficiente para especificar la dirección de memoria adecuada. Preste atención a la primera columna de
la hoja de CGROM de caracteres. No contiene las direcciones de memoria RAM, pero los símbolos que
se debate aquí. En este ejemplo, los medios 'display 0' - pantalla 'smiley', significa 'una pantalla símbolo "-
" ancla "de pantalla, etc
LCD Comandos básicos
Todos los datos enviados a un LCD a través de los pasadores de D0-D7 serán interpretados ya sea como
un comando o datos a, que depende del estado lógico de la clavija de RS:
RS = 1 - Los bits D0-D7 son las direcciones de los caracteres que se muestran. Un procesador incorporado en la pantalla LCD se dirige a un personaje de el mapa de caracteres y la muestra. La dirección DDRAM especifica la ubicación en la pantalla en la que el personaje se va a mostrar. Esta dirección está predefinida o la dirección del carácter enviado anteriormente se incrementa automáticamente.
RS = 0 - bits D0 - D7 son los comandos utilizados para establecer el modo de funcionamiento de la pantalla.
Aquí está una lista de comandos relacionados con el funcionamiento de la pantalla LCD:
C O M A ND O
RS
RW
D7
D6
D5
D4
D3
D2
D1
D0
T I E M P O D E
E J E C U C IÓ N
Borrar
pantalla 0 0 0 0 0 0 0 0 0 1 1.64mS
Inicio del cursor
0 0 0 0 0 0 0 0 1 x 1.64mS
Entrada modo de
juego 0 0 0 0 0 0 0 1
I / D
S 40US
Mostrar control on /
off
0 0 0 0 0 0 1 D U B 40US
Cursor / Pantalla de
cambio
0 0 0 0 0 1 D / C
R / L
x x 40US
Función de conjunto
0 0 0 0 1 DL N F x x 40US
Establezca la dirección
CGRAM 0 0 0 1 CGRAM dirección 40US
Establezca la dirección
DDRAM
0 0 1 Dirección DDRAM 40US
Lea "BUSY"
bandera
(BF)
0 1 BF Dirección DDRAM -
Escriba a CGRAM o
DDRAM
1 0 D7 D6 D5 D4 D3 D2 D1 D0 40US
Leer de CGRAM o
DDRAM
1 1 D7 D6 D5 D4 D3 D2 D1 D0 40US
I / D 1 = Incremento (por 1) R / L 1 = Desplazamiento a la
derecha
0 = Disminución (por 1) 0 = Desplazamiento a la izquierda
S 1 = Pantalla cambio de DL 1 = 8-bit de interfaz
0 = Mostrar cambio de 0 = 4-bit de interfaz
D 1 = Pantalla en la N 1 = Pantalla de dos líneas
0 = 0 = apagado de pantalla de visualización en una sola
línea
U 1 = cursor en la F 1 = formato de caracteres puntos 5x10
0 = 0 = cursor fuera de formato de caracteres puntos 5x7
B 1 = parpadeo del cursor en D / C 1 = cambio de pantalla
0 = parpadeo del cursor apagado 0 = Desplazamiento del cursor
¿QUÉ ES UNA bandera de ocupado?
En comparación con el microcontrolador, el LCD es un componente extremadamente lento. Por esta
razón, era necesario para proporcionar una señal que, en cada ejecución del comando, indican que la
pantalla está lista para recibir siguiente pieza de datos. Esta señal se llama la bandera de ocupado y
puede ser leído desde la línea de D7. Pantalla LCD está preparado para recibir nuevos datos cuando la
tensión en esta línea es 0V (BF = 0).
LCD Conexión
Dependiendo de cuántas líneas se utilizan para conectar un LCD al microcontrolador, hay de 8 bits y 4
bits de modos de funcionamiento de la pantalla LCD. El modo apropiado se selecciona al comienzo de la
operación en el proceso llamado "inicialización". El modo de 8 bits LCD utiliza los pines D0-D7 para
transferir datos, como se explica en la página anterior.
El propósito principal del modo de 4-bit LCD es valiosa para salvar pines I / O del microcontrolador. Sólo
los 4 bits más altos (D4-D7) se utilizan para la comunicación de aquí, mientras que otros pueden dejarse
sin conectar. Cada pieza de datos se envían a la pantalla LCD en dos pasos - cuatro bits superiores son
enviadas primero (normalmente a través de líneas D4-D7), entonces cuatro bits más bajos.Como
resultado del proceso de inicialización, la pantalla LCD es capaz de enlazar e interpretar bits recibidos
correctamente.
Además, los datos rara vez se lee de la pantalla LCD. En la mayoría de los casos, el microcontrolador
envía datos a la pantalla LCD, lo que significa que es posible ahorrar un adicional pin I / O por simple
conectando el pin R / W a tierra. Este ahorro tiene su precio, por supuesto. Aunque el proceso de
visualización de datos se realiza normalmente, no será posible leer la bandera de ocupado, ya que no es
posible leer la pantalla o bien. La buena noticia es que hay una solución simple a este problema. Después
de enviar un carácter o un comando de la pantalla LCD, es necesario darle el tiempo suficiente para
prepararse para recibir otra. Debido al hecho de que se tarda aproximadamente 1.64mS para un comando
para que sea ejecutado, será suficiente para esperar alrededor de 2 ms.
LCD de inicialización
Tan pronto como la fuente de alimentación pasa, la pantalla LCD se desactiva automáticamente. Todo el
proceso dura aproximadamente 15 ms. Después de eso, la pantalla está lista para funcionar y su modo de
funcionamiento está configurado por defecto. Esto significa que:
1. Pantalla se borra. 2. Modo
DL = 1 - Comunicación a través de la interfaz de 8 bits N = 0 - Los datos se muestran en una línea F = 0 - Formato de caracteres de la fuente es de 5 x 8 píxeles
3. Mostrar / cursor de encendido / apagado D = 0 - Display apagado U = 0 - fuera del cursor B = 0 - Parpadeo del cursor apagado
4. Entrada de caracteres ID = 1 direcciones de la pantalla se incrementa automáticamente en 1 S = 0 Pantalla desplazar fuera
En la mayoría de los casos de auto-rearme ocurre normalmente. Sobre todo, pero no siempre. Si por
alguna razón la tensión de alimentación no llega al máximo dentro de 10 ms, la pantalla empezará a llevar
a cabo completamente imprevisible. Si la fuente de alimentación no es capaz de cumplir esta condición, o
si es necesario para proporcionar un funcionamiento seguro, el proceso de inicialización se requiere. Se
produce una condición de reposición nuevo, permitiendo así la visualización para operar normalmente.
Hay dos algoritmos de inicialización. Cuál se va a realizar depende de si la conexión con el
microcontrolador se establece a través de 4 - o interfaz de 8-bits. La inicialización siguiente proceso es el
mismo para ambos algoritmos. Usted sólo tiene que especificar algunos comandos básicos y después de
eso, usted será capaz de enviar masajes para la pantalla LCD.
La figura siguiente ilustra la inicialización de 8-bits de la pantalla LCD:
No es un error! En este algoritmo, el mismo valor es tres veces sucesivamente, envía y se muestra en la
pantalla LCD.
El procedimiento descrito en la inicialización de 4-bit es el siguiente:
Vamos a hacerlo en mikroBasic ...
'In mikroBasic for PIC, it is sufficient to write only one
function to perform the
'whole process of LCD initialization. Prior to calling this
function it is necessary
'to declare bits LCD_D4-LCD_D7, LCD_RS and LCD_EN.
...
sub procedure Lcd_Init ' Initialize LCD
...
EJEMPLOS PRÁCTICOS
El proceso de creación de un nuevo proyecto es muy simple. Seleccione la opción Nuevo
proyecto en el menú Proyecto, como se muestra en la figura de la derecha.
Aparecerá una ventana llamada Asistente para nuevo proyecto, que le guiará a través del
proceso de creación de un nuevo proyecto, parece. La ventana de introducción de esta
aplicación contiene una lista de acciones a realizar cuando se crea un nuevo proyecto. Haga
clic en Siguiente.
El proceso de creación de un nuevo proyecto se puede dividir en cinco pasos:
1. Selección del microcontrolador para escribir un programa para. En este caso, es PIC16F887.
2. Selección del reloj del dispositivo. En este caso, es 8 MHz de reloj. 3. La selección del nombre y la ubicación del proyecto. En este caso, el nombre del proyecto
es la primera _Project y se guardará en la carpeta C: \ Mis proyectos. El compilador añade automáticamente la extensión. Mbppi al nombre del proyecto y un archivo de código fuente con el mismo nombre (First_Project. MBA) se creará en su seno.
4. En caso de que el proyecto consta de varios archivos de código fuente, es necesario especificar todos ellos e incluir en el proyecto haciendo clic en el botón Agregar. En este ejemplo, no hay archivos de origen adicionales dentro del proyecto.
5. Por último, es necesario aprobar todas las opciones seleccionadas, haga clic en Finalizar.
Después de crear el proyecto, una nueva ventana en blanco para escribir un programa en el que
aparecen. Consulte la figura siguiente.
Cuando el programa está escrito, es necesario compilarlo en un código hexadecimal, seleccionando una
de las opciones de generación en el menú Proyecto.:
Para crear un archivo. Hexagonal, seleccione Build (Ctrl + F9) en el menú Proyecto o haga clic en el icono de la barra de herramientas de generación de proyectos.
La construcción todos los proyectos (Shift + F9) opción genera todos los archivos dentro del proyecto, las bibliotecas (si hay un código fuente para ellos) y los archivos def para el chip en uso.
La opción Build + Program (Ctrl + F11) es especial, ya que permite que el PRO mikroBasic para PIC compilador para cargar automáticamente el programa en el microcontrolador después de la compilación. El proceso de programación se realiza mediante el programador PICFlash.
Todos los errores detectados durante la compilación se muestran en la ventana de mensajes. Si no se
encuentran errores, el PRO mikroBasic para PIC compilador genera archivos de salida.
4,3 Ejemplo 1 Escribir cabecera, configurar pines de E / S y utilizar la función de retardo
Aquí es un sencillo programa que tiene por objeto simplemente para encender un LED pocos
PORTB. Utilice este ejemplo para estudiar lo que es un programa real parece. La siguiente figura muestra
el esquema de conexión adecuado, mientras que el programa correspondiente se encuentra en la página
siguiente.
Cuando la fuente de alimentación pasa, cada segundo el LED emite luz PORTB, lo que indica que el
microcontrolador está correctamente conectado y funciona normalmente.
Este ejemplo muestra cómo una cabecera escritas correctamente parece. Cabecera es el mismo para
todos los programas descritos en este documento por lo que se omiten en los siguientes ejemplos. De
todos modos, se considera que al comienzo de cada programa marcado como cabecera.
Para hacer este ejemplo más interesante, que permitirá a los LEDs conectados a PORTB a
parpadear. Hay varias maneras de hacerlo:
1. Tan pronto como el microcontrolador está activada, todos los LEDs se emiten luz para un segundo. La función de retardo está a cargo de la misma en el programa. Sólo tienes que configurar retardo expresado en milisegundos.
2. Después de un segundo, el programa entra en el bucle y permanece allí mientras variable k es menor que 20. La variable se incrementa en 1 después de cada iteración. Dentro del bucle for, el ciclo de trabajo de los pulsos es de 5:1 (500 ms: 100 ms) y cualquier cambio de estado lógico de los pines de salida hace que todos los LED parpadeen.
3. Cuando el programa se cierra el bucle, los cambios en la lógica del Estado (PORTB 0xb 01.010.101) y el programa entra en el bucle while infinito y permanece allí tanto tiempo como 1 = 1 (bucle infinito). En este circuito el estado lógico PORTB se invierte cada 200 ms.
4,4 Ejemplo 2 Utilice las instrucciones de montaje y LFINTOSC oscilador interno ...
Este ejemplo es en realidad una secuela de la anterior. Se trata de un problema poco más complicado
... La idea es hacer que los LEDs en un abrir y cerrar PORTB lentamente. Se puede hacer mediante el
establecimiento de parámetro de retardo a ser grande en la función de retardo. Pero también hay otra
forma más eficiente de hacerlo. ¿Te acuerdas de que este microcontrolador tiene un oscilador de
LFINTOSC integrada que opera en la frecuencia de 31kHz? Ahora, es hora de darle una oportunidad.
El programa comienza con el bucle do-hasta y se mantiene esta memoria para 20 ciclos. Después de
cada iteración, se proporciona retraso de 100ms, lo cual se refleja como un LED PORTB relativamente
rápido parpadeo. Cuando el programa se sale de este bucle, el microcontrolador inicia mediante el
oscilador LFINTOSC como una fuente de señal de reloj. LED parpadea mucho más lento ahora, a pesar
de que el programa ejecuta el mismo do-while con 10 veces menor demora.
Para demostrar una situación potentionally peligroso, bits de control son activados por instrucciones de
montaje. En pocas palabras, al entrar o salir de una secuencia de montaje en el programa, el compilador
no guardar los datos en el activo del banco de RAM, lo que significa que en esta sección del programa, la
selección del banco depende de francos suizos se inscribe en el uso. Al volver a la sección de programa
escrito en Basic, los bits de control RP0 y RP1 deben regresar al estado que tenían antes de entrar en la
secuencia de montaje. En este caso, la variable saveBank auxiliar se utiliza para guardar el estado de
estos dos bits.
Header *********************************************
program example_2 ' Program name
dim k as byte ' Variable k is of byte type
dim saveBank as byte ' Variable saveBank is of byte type
main: ' Start of program
k = 0 ' Initial value of variable k
ANSEL = 0 ' All I/O pins are configured as digital
ANSELH = 0
PORTB = 0 ' All PORTB pins are set to 0
TRISB = 0 ' PORTB pins are configured as outputs
do
PORTB = not PORTB ' Invert PORTB logic state
Delay_ms(100) ' 100mS delay
k = k+1 ' Increment k by 1
loop until k=20 ' Remain in loop while k<20
k=0 ' Reset variable k
saveBank = STATUS and %01100000 ' Save the state of bits RP0
and RP1
' (bits 5 and 6 of the STATUS register)
asm ' Start of assembly sequence
bsf STATUS,RP0 ' Select memory bank containing
bcf STATUS,RP1 ' the OSCCON register
bcf OSCCON,6 ' Select internal oscillator LFINTOSC
bcf OSCCON,5 ' with a frequency of 31KHz
bcf OSCCON,4
bsf OSCCON,0 ' Microcontroller uses internal oscillator
end asm ' End of assembly sequence
STATUS = STATUS and %10011111 ' Bits RP0 and RP1 return their
original state
STATUS = STATUS or saveBank
do
PORTB = not PORTB ' Invert PORTB logic state
Delay_ms(10) ' 10 mS delay
k = k+1 ' Increment k by 1
loop until k=20 ' Remain in loop while k<20
stay_here: goto stay_here ' Endless loop
end.
Usted ha notado que la fuente de señal de reloj se cambia sobre la marcha. Si desea asegurarse de que,
quite cristal de cuarzo antes de encender el microcontrolador. El microcontrolador no empezará a
funcionar debido a la Palabra de configuración cargado con el programa requiere que el cristal de cuarzo
que se preste. Si se quita este cristal más tarde, durante una operación, no pasará nada, es decir que no
afectará al funcionamiento del microcontrolador en absoluto.
4,5 Ejemplo 3 TMR0 como contador, declarar nuevas variables, símbolos de uso, utilice un relé ...
En los dos ejemplos anteriores el microcontrolador ejecuta el programa sin verse afectada por su
entorno. Prácticamente, basados en microcontroladores los dispositivos que funcionan de esta manera
son muy raras (por ejemplo, un controlador de neón simple señal).Clavijas de entrada también se utilizan
en este ejemplo. El esquema que se da en la figura de abajo, mientras que el programa está en la página
siguiente. Todavía es muy simple. Temporizador TMR0 se utiliza como un contador. La entrada del
contador está conectado a un pulsador de tal manera que cualquier presión botón hace que el
temporizador TMR0 para contar un pulso. Cuando el número de impulsos coincide con el número
almacenado en el registro de prueba, un uno lógico (5V) aparecerá en el pasador PORTD.3. Esta tensión
se utiliza para activar un relé electromecánico, y esto un poco por eso se llama 'relay' en el programa.
Aquí, la prueba de registro de número de tiendas 5. Por supuesto, puede ser cualquier número que se
obtiene ya sea por la computación o define como una constante. Además, el microcontrolador puede
ejecutar algún otro dispositivo en lugar de relé, mientras que un sensor puede ser usado en lugar del
botón pulsador. Este ejemplo ilustra una de las aplicaciones más comunes del microcontrolador en la
industria, cuando algo se lleva a cabo tantas veces como sea necesario, entonces algo más debe estar
encendido o apagado ....
' Header******************************************************
program example_3 ' Program name
symbol RELAY = PORTD.3 ' Pin PORTD.3 is named RELAY
dim TEST as byte ' Variable TEST is of byte type
main: ' Start of program
TEST = 5 ' Constant TEST = 5
ANSEL = 0 ' All I/O pins are configured as digital
ANSELH = 0
PORTA = 0 ' Reset PORTA
TRISA = 0xFF ' All portA pins are configured as
inputs
PORTD = 0 ' Reset PORTD
TRISD = %11110111 ' Pin RD3 is configured as an output,
while other pins are
' configured as inputs
OPTION_REG.5 = 1 ' Counter TMR0 receives pulses through
the RA4 pin
OPTION_REG.3 = 1 ' Prescaler rate is 1:1
TMR0 = 0 ' Reset timer/counter TMR0
while 1
if TMR0 = TEST then ' Does the number in timer match
constant TEST?
RELAY = 1 ' Numbers match. Set the RD3 bit (output
RELAY)
end if
wend ' Remain in endless loop
end. ' End of program
Sólo un símbolo (Relay) se utiliza aquí. Se le asigna el tercer pin del PORTD en la declaración.
symbol RELAY = PORTD.3 ' Symbol RELAY = PORTD.3
Si varios pines del puerto D se conectan a los relés, la expresión anterior se puede escribir de esta
manera, así:
4,6 Ejemplo 4 Utilice Timer0, Timer1 y Timer2. Utilice las interrupciones, declarar el nuevo procedimiento ...
Si usted ha leído los ejemplos anteriores, es probable que haya notado una desventaja del uso de las
demoras. En todos estos casos, el microcontrolador es "cautivo" y no hace nada. Simplemente espera a
que un cierto tiempo para pasar. Tales residuos de tiempo a menudo es un lujo inaceptable y algún otro
método debe ser empleado aquí.
¿Te acuerdas de la historia de los temporizadores? Las interrupciones? En este ejemplo se hace la
conexión entre ellos de una manera práctica. El esquema sigue siendo el mismo y el desafío también. Es
necesario proporcionar un retardo de tiempo suficientemente largo para observar cambios en un
puerto. Temporizador TMR0 con pre-escalador asignado se utiliza para este propósito. Se genera una
interrupción en cada registro de desbordamiento del temporizador y cada incrementos de rutina de
interrupción de la variable cnt por 1.Cuando llegue a 50, el PORTB se incrementa en 1. Todo el
procedimiento se lleva a cabo "entre bastidores", que permite al microcontrolador para hacer otra cosa.
' Header******************************************************
program example_4a ' Start of program
dim cnt as byte ' Define variable cnt as byte
sub procedure interrupt ' This subprocedure determines what
should
' be done when an interrupt is
generated
cnt = cnt + 1 ' Interrupt causes cnt to be
incremented by 1
TMR0 = 96 ' Timer TMR0 is returned its initial
value
INTCON = 0x20 ' Bit T0IE is set, bit T0IF is cleared
end sub ' End of interrupt routine
main: ' Start of program
OPTION_REG = 0x84 ' Prescaler is assigned to timer TMR0
ANSEL = 0 ' All I/O pins are configured as
digital
ANSELH = 0
TRISB = 0 ' All PORTB pins are configured as
outputs
PORTB = 0x0 ' Reset PORTB
TMR0 = 96 ' Timer T0 counts from 96 to 255
INTCON = 0xA0 ' Enable interrupt TMR0
cnt = 0 ' Variable cnt is assigned a 0
while 1 ' Endless loop
if cnt = 50 then ' Increment PORTB after 50 interrupts
PORTB = PORTB + 1 ' Increment number on PORTB by 1
cnt = 0 ' Reset variable cnt
end if
wend
end. ' End of program
Se genera una interrupción en cada temporizador registro TMR0 desbordamiento.
'Header******************************************************
program example_4b ' Program name
dim cnt as byte ' Define variable cnt
sub procedure interrupt ' Define interrupt subprocedure
cnt = cnt+1 ' Interrupt causes cnt to be
incremented by 1
PIR1.TMR1IF = 0 ' Reset bit TMR1IF
TMR1H = 0x80 ' TMR1H and TMR1L timer registers are
returned
TMR1L = 0x00 ' their initial values
end sub ' End of interrupt routine
main: ' Start of program
ANSEL = 0 ' All I/O pins are configured as
digital
ANSELH = 0
PORTB = 0xF0 ' Initial value of PORTB bits
TRISB = 0 ' PORTB pins are configured as outputs
T1CON = 1 ' Set timer TMR1
PIR1.TMR1IF = 0 ' Reset bit TMR1IF
TMR1H = 0x80 ' Set initial value for timer TMR1
TMR1L = 0x00
PIE1.TMR1IE = 1 ' Enable interrupt on overflow
cnt = 0 ' Reset variable cnt
INTCON = 0xC0 ' Enable interrupt (bits GIE and PEIE)
while 1 ' Endless loop
if cnt = 76 then ' Change PORTB state after 76
interrupts
PORTB = not PORTB ' Number in PORTB is inverted
cnt = 0 ' Reset variable cnt
end if
wend
end. ' End of program
En este caso, una interrupción se habilita después de que el temporizador registro TMR1
(TMR1H y TMR1L) de desbordamiento. La combinación de bits cambiantes en PORTB es
diferente de la que en el ejemplo anterior.
'Header******************************************************
program example_4c ' Program name
dim cnt as byte ' Define variable cnt as byte
sub procedure Replace ' Define procedure Replace
PORTB = not PORTB ' Define new procedure ‘Replace’
end sub ' Procedure inverts port state
sub procedure interrupt ' Define interrupt subprocedure
if PIR1.TMR2IF then ' If bit TMR2IF = 1,
cnt = cnt +1 ' Increment variable cnt by 1
PIR1.TMR2IF = 0 ' Reset bit and
TMR2 = 0 ' reset register TMR2
end if
end sub ' End of interrupt routine
main: ' Start of program
cnt = 0 ' Reset variable cnt
ANSEL = 0 ' All I/O pins are configured as
digital
ANSELH = 0
PORTB = %10101010 ' Logic state on PORTB pins
TRISB = 0 ' All PORTB pins are configured as
outputs
T2CON = 0xFF ' Set timer T2
TMR2 = 0 ' Initial value of timer register TMR2
PIE1.TMR2IE = 1 ' Enable interrupt
INTCON = 0xC0 ' Set bits GIE and PEIE
while 1 ' Endless loop
if cnt > 30 then ' Change PORTB after more than 30
interrupts
Replace ' Function Replace inverts the PORTB
state
cnt = 0 ' Reset variable cnt
end if
wend
end. ' End of program
Esta vez, se genera una interrupción después de temporizador registro de desbordamiento
TMR2 se produce. El procedimiento Reemplazar, que normalmente no pertenece a mikroBasic,
se utiliza en este ejemplo para invertir puerto estado pasadores.
4,7 Ejemplo 5 Utilice el temporizador perro guardián
Este ejemplo ilustra cómo el temporizador de reloj perro no debe ser utilizado. Un comando que se utiliza
para reiniciar el contador se ha dejado intencionadamente en el bucle principal del programa, lo que le
permitió ganar la batalla del tiempo y hacer que el microcontrolador que se restablezca. Como resultado,
el microcontrolador se restablece cada vez, que es indicado por los LEDs PORTB parpadear.
'Header******************************************************
program example_5 ' Program name
main: ' Start of program
OPTION_REG = 0x0E ' Prescaler is assigned to timer WDT (1:64)
asm CLRWDT ' Assembly command to reset WDT timer
end asm
PORTB = 0x0F ' Initial value of the PORTB register
TRISB = 0 ' All PORTB pins are configured as outputs
Delay_ms(300) ' 30mS delay
PORTB = 0xF0 ' Port PORTB value different from initial
while 1 ' Endless loop. Program remains here until
WDT
wend ' timer resets the microcontroller
end. ' End of program
Con el fin de que este ejemplo funcione correctamente, es necesaria para que el temporizador
de vigilancia mediante la selección deltemporizador Watchdog - opción Activado en mí
programador.
4.8 Ejemplo 6 Módulo CCP1 como un generador de señal PWM
Este ejemplo ilustra el uso de CCP1 módulo en modo PWM. Para hacerlo más interesante, la anchura de
impulsos de salida P1A (PORTC, 2) se puede cambiar con los pulsadores simbólicamente marcado como
"oscura" y "brillante", mientras que la anchura conjunto es visible como una combinación binaria en
PORTB. El funcionamiento de este módulo está bajo el control de los procedimientos pertenecientes a la
Biblioteca especializada PWM. Tres de ellos se utilizan aquí:
1. PWM1_init tiene el prototipo: sub procedure PWM1_Init( const freq as
longint )
Parámetro de frecuencia fija la frecuencia de la señal PWM expresada en Herz. En este ejemplo es 5 KHz.
2. PWM1_Start tiene el prototipo: sub procedure PWM1_Start()
3. PWM1_Set_Duty tiene el prototipo: sub
procedure PWM1_Set_Duty( dim duty_ratio as byte )
Duty_ratio parámetro establece la duración del pulso en una secuencia de pulsos.
La biblioteca de PWM también contiene el procedimiento PWM_Stop utiliza para desactivar este
modo. Su prototipo es: sub procedurePWM1_Stop()
' Header ******************************************************
program example_6 ' Program name
dim current_duty, old_duty, oldstate as byte ' Define variables
current_duty
' old_duty and
oldstate
main: ' Start of program
ANSEL = 0 ' All I/O pins are configured as digital
ANSELH = 0
PORTA = 255 ' PORTA initial state
TRISA = 255 ' All PORTA pins are configured as inputs
PORTB = 0 ' Initial state of PORTB
TRISB = 0 ' All PORTB pins are configured as outputs
PORTC = 0 ' PORTC initial state
TRISC = 0 ' All PORTC pins are configured as outputs
PWM1_Init(5000) ' PWM module initialization (5 KHz)
current_duty = 16 ' Initial value of variable current_duty
old_duty = 0 ' Reset variable old_duty
PWM1_Start() ' Start PWM1 module
while 1 ' Endless loop
if oldstate and Button(PORTA, 0,1,1) then ' If the button
connected to RA0 is pressed
current_duty = current_duty + 1 ' increment
variable current_duty
if Button(PORTA, 0, 1, 1) then
oldstate = 255
end if
end if
if oldstate and Button(PORTA, 1,1,1) then ' If the button
connected to RA1 is pressed
current_duty = current_duty - 1 ' decrement value
current_duty
if Button(PORTA, 1, 1, 1) then
oldstate = 255
end if
end if
if old_duty <> current_duty then ' If current_duty
and old_duty are not
PWM1_Set_Duty(current_duty) ' equal set PWM to
a new value,
old_duty = current_duty ' save the new
value
PORTB = old_duty ' and show it on
PORTB
end if
Delay_ms(200) ' 200mS delay
wend
end.
Con el fin de que este ejemplo funcione correctamente, es necesario comprobar las siguientes librerías en
el Library Manager antes de compilar:
PWM
Botón
4,9 Ejemplo 7 Use un convertidor A / D
Un convertidor A / D, previsto en el PIC16F887 se utiliza en este ejemplo. ¿Es necesario decir que todo
es sencillo? Una señal analógica variable se aplica a la patilla AN2, mientras que el 10 - resultado poco de
conversión se muestra en los puertos PORTB y PORD (8 bits menos significativos en PORTD y 2 MSB en
PORTB). GND se utiliza como una tensión de referencia Vref negativo, mientras que el VCC se utiliza
como una referencia de tensión positiva.
Si utiliza una tensión varriable como Vref + (refiérase a la parte discontinua del esquema) que será capaz
de "estirar y encoger" el rango de medición de tensión.
En otras palabras, el convertidor A / D siempre genera un número binario de 10-bits, lo que significa que
detecta 1024 niveles de voltaje (210 = 1.024) en total. La diferencia entre dos niveles de tensión no es
siempre la misma. Cuanto menor es la diferencia entre Vref + y Vref-, menor es la diferencia entre dos
niveles de 1024. Como se puede ver, el convertidor A / D es capaz de detectar ligeros cambios en el
voltaje.
'Header******************************************************
program example_7 ' Program name
dim temp_res as word ' Variable temp_res is of word type
main: ' Start of program
ANSEL = 0x0C ' Pin AN2 is configured as analog
TRISA = 0xFF ' All PORTA pins are configured as inputs
ANSELH = 0 ' Other pins are configured as digital
TRISB = 0x3F ' PORTB pins RB7 and RB6 are configured as
' outputs
TRISD = 0 ' All PORTD pins are configured as outputs
ADCON1.B4 = 0 ' Positive voltage reference is VCC.
while 1 ' Endless loop
temp_res = ADC_Read(2) ' Result of A/D conversion is copied
to temp_res
PORTD = temp_res ' 8 LSBs are moved to PORTD
PORTB = temp_res >> 2 ' 2 MSBs are moved to bits RB6 and RB7
wend
end. ' End of program
Con el fin de que este ejemplo funcione correctamente, es necesario comprobar la biblioteca de ADC en
el Library Manager antes de compilar:
ADC
4,10 Ejemplo 8 El uso de memoria EEPROM
Este ejemplo ilustra escribir y leer desde incorporada en la memoria EEPROM. El programa funciona
como sigue. El ciclo principal se lee la ubicación de la memoria EEPROM en la dirección 5. El programa
entra entonces en un bucle sin fin en el que PORTB se incrementa y el estado de PORTA.2 entrada se
comprueba. En el momento de pulsar la tecla marcada MEMO, un número almacenado en PORTB será
guardado en la memoria EEPROM en la dirección 5 y leer directamente de él y se muestra en PORTD en
formato binario.
'Header******************************************************
program example_8 ' Program name
main: ' Start of program
ANSEL = 0 ' All I/O pins are configured as digital
ANSELH = 0
PORTB = 0 ' PORTB initial value
TRISB = 0 ' All PORTB pins are configured as
outputs
PORTD = 0 ' PORTB initial value
TRISD = 0 ' All PORTD pins are configured as
outputs
TRISA = 0xFF ' All PORTA pins are configured as
inputs
PORTD = EEPROM_Read(5) ' Read EEPROM memory at address 5
while 1 ' Endless loop
PORTB = PORTB + 1 ' Increment PORTB by 1
Delay_ms(100) ' 100mS delay
while not PORTA.B2 ' Remain in this loop as long as the
button is pressed
if not PORTA.B2 then
EEPROM_Write(5,PORTB) ' If MEMO is pressed, save PORTB
PORTD = EEPROM_Read(5) ' Read written data
end if
wend
wend
end. ' End of program
Con el fin de que este ejemplo funcione correctamente, es necesario comprobar la librería EEPROM en el
Library Manager antes de compilar:
EEPROM
Con el fin de comprobar si este programa funciona correctamente, basta con pulsar el botón MEMO y
luego apagar el microcontrolador.Después de reiniciarlo, el programa mostrará el PORTD el valor
almacenado en la memoria EEPROM en addrsess 5. Recuerde que en el momento de la escritura, este
valor se muestra en PORTB.
4,11 Ejemplo 9 Cuatro dígitos LED contra, la multiplexación
El microcontrolador funciona como un contador de cuatro dígitos aquí. Variable i se incrementa (lo
suficientemente lento como para ser notado) y su valor se muestra en un display de cuatro dígitos LED
(9999-0). El objetivo es convertir un número binario a decimal, que se dividió en cuatro dígitos (miles,
centenas, decenas y unidades). Dado que los segmentos de la pantalla LED están conectados en
paralelo, es necesario asegurarse de que cambian lo suficientemente rápido para hacer impresión de
emisión de luz simultánea (tiempo multiplexado por división).
En este ejemplo, el temporizador TMR0 está a cargo de la multiplexación de tiempo, mientras que la
función de máscara se utiliza para convertir un número binario a decimal.
'Header******************************************************
program example_9 ' Program name
dim shifter, portd_index as byte ' Variables shifter and
portd_index are of byte type
digit, number as word ' Variables digit and number
are of word type
portd_array as word[4] ' Array portd_array has 4
members of word type
sub function mask (dim num as Word) as Word ' Subroutine for
masking
select case num ' used to convert binary
case 0 result = $3F ' numbers into appropriate
case 1 result = $06 ' combination of bits to be
case 2 result = $5B ' displayed on LED display
case 3 result = $4F
case 4 result = $66
case 5 result = $6D
case 6 result = $7D
case 7 result = $07
case 8 result = $7F
case 9 result = $6F
end select ' Case end
end sub ' End of subroutine
sub procedure interrupt ' Start of interrupt routine
PORTA = 0 ' Turn off all 7-segment displays
PORTD = portd_array [portd_index] ' Send appropriate value to
PORTD
PORTA = shifter ' Turn on appropriate 7-segment
display
shifter = shifter << 1 ' Move shifter to the next digit
if (shifter > 8) then
shifter = 1
end if
Inc(portd_index) ' Increment portd_index
if (portd_index > 3) then
portd_index = 0 ' Turn on 1st, turn off 4th 7segment
display
end if
TMR0 = 0 ' Reset TIMER0 value
T0IF_bit = 0 ' Clear Timer0 interrupt flag
end sub ' End of interrupt routine
main: ' Start of program
ANSEL = 0 ' Configure analog pins as digital I/O
ANSELH = 0
OPTION_REG = $80 ' Timer0 settings (Timer0 work as timer with
prescaler)
digit = 0 ' Initial value of variable digit
portd_index = 0 ' Turn on 1st LED display
shifter = 1 ' Initial value of variable shifter
TMR0 = 0 ' Clear Timer0
INTCON = $A0 ' Enable interrupt with GIE and T0IE bits
PORTA = 0 ' Clear PORTA
TRISA = 0 ' Set PORTA as output
PORTD = 0 ' Clear PORTD
TRISD = 0 ' Set PORTD as output
number = 6789 ' Some initial value on LED display
while TRUE ' Endless loop
digit = number / 1000 ' Extract thousands
portd_array[3] = mask(digit) ' and store it to PORTD array
digit = (number / 100) mod 10 ' Extract hundreds
portd_array[2] = mask(digit) ' and store it to PORTD array
digit = (number / 10) mod 10 ' Extract tens
portd_array[1] = mask(digit) ' and store it to PORTD array
digit = number mod 10 ' Extract ones
portd_array[0] = mask(digit) ' and store it to PORTD array
Delay_ms(1000) ' One second delay
Inc(number) ' Increment number
if (number > 9999) then ' Start to count from zero
number = 0
end if
wend
end. ' End of program
4,12 Ejemplo 10 Utilice la pantalla LCD
Este ejemplo ilustra el uso de una pantalla LCD alfanumérica. Las bibliotecas de funciones que este
programa sea más sencillo.
Dos mensajes escritos en dos líneas en la pantalla:
mikroElektronika
LCD de ejemplo
Dos segundos más tarde, el segundo mensaje se sustituye con la tensión presente en la entrada
convertidor A / D (el pasador RA2). Por ejemplo:
mikroElektronika
Voltaje: 3.141V
De todos modos, la temperatura actual o algún otro valor medido se puede visualizar en vez de la tensión.
Con el fin de que este ejemplo funcione correctamente, es necesario comprobar las siguientes librerías en
el Library Manager antes de compilar:
ADC
LCD
'Header***************************************************
***
program example_10 ' Program name
dim LCD_RS as sbit at RB4_bit ' Lcd module connections
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit ' End Lcd module
connections
dim text as string [16] ' Variable text is of string
type
dim ch, adc_rd as word ' Variables ch and adc_rd are of
word type
dim tlong as longword ' Variable tlong is of longword
type
main: ' Start of program
TRISB = 0 ' All port PORTB pins are
configured as outputs
PORTB = 0xFF
INTCON = 0 ' All interrupts disabled
ANSEL = 0x04 ' Pin RA2 is configured as an
analog input
TRISA = 0x04
ANSELH = 0 ' Rest of pins is configured as
digital
Lcd_Init() ' LCD display initialization
Lcd_Cmd(_LCD_CURSOR_OFF) ' LCD command (cursor off)
Lcd_Cmd(_LCD_CLEAR) ' LCD command (clear LCD)
text = "mikroElektronika" ' Define the first message
Lcd_Out(1,1,text) ' Write the first message in the
first line
text = "LCD example" ' Define the second message
Lcd_Out(2,1,text) ' Write the second message in
the second line
ADCON1 = 0x80 ' A/D voltage reference is VCC
TRISA = 0xFF ' All PORTA pins are configured
as inputs
Delay_ms(2000)
text = "Voltage=" ' Define the third message
while 1 ' Endless loop
adc_rd = ADC_Read(2) ' A/D conversion. Pin RA2 is an
input.
Lcd_Out(2,1,text) ' Write result in the second
line
tlong = adc_rd * 5000 ' Convert the result in
millivolts
tlong = tlong / 1023 ' 0..1023 -> 0-5000mV
ch = (tlong / 1000) mod 10 ' Extract volts (thousands of
millivolts)
' from result
Lcd_Chr(2,9,48+ch) ' Write result in ASCII format
Lcd_Chr_CP(".") ' Write the decimal pint
ch = (tlong / 100) mod 10 ' Extract hundreds of
millivolts
Lcd_Chr_CP(48+ch) ' Write result in ASCII format
ch = (tlong / 10) mod 10 ' Extract tens of millivolts
Lcd_Chr_CP(48+ch) ' Write result in ASCII format
ch = tlong mod 10 ' Extract digits for
millivolts
Lcd_Chr_CP(48+ch) ' Write result in ASCII format
Lcd_Chr_CP("V") ' Write a mark for voltage "V"
Delay_ms(1) ' 1mS delay
wend
end. ' End of program
4,13 Ejemplo 11 Comunicación serie RS232
Este ejemplo ilustra el uso de módulo EUSART del microcontrolador. La conexión entre el
microcontrolador y un PC se elabora en cumplimiento con el estándar de comunicación RS232. El
programa funciona como sigue. Cada byte recibido la comunicación serie se muestra mediante diodos
LED conectados al PORTB y se envía automáticamente al remitente sobre el mismo. La forma más fácil
de probar el funcionamiento del programa es el uso de un programa estándar de Windows llamado Hyper
Terminal.
' Header******************************************************
program example_11 ' Program name
dim i as byte ' Variable is of byte type
main: ' Start of program
UART1_Init(19200) ' Initialize USART module
' (8 bit, 19200 baud rate, no parity bit...)
while 1 ' Endless loop
if UART1_Data_Ready() then ' If data has been received
i = UART1_Read() ' read it
UART1_Write(i) ' and send it back
end if
wend
end. ' End of program
Con el fin de que este ejemplo funcione correctamente, es necesario comprobar la biblioteca UART en el
Library Manager antes de compilar:
UART
4,14 Ejemplo 12 Medir la temperatura con el sensor DS1820. El uso del protocolo '1-wire '...
La medición de temperatura es una de las operaciones más comunes realizadas por el
microcontrolador. Un sensor de temperatura DS1820 se utiliza aquí para medir. Es capaz de medir la
temperatura dentro del intervalo de -55 ° C a 125 ° C con un 0,5 ° C de exactitud.Para transferir datos al
microcontrolador, un tipo especial de comunicación serial denominado 1-wire se utiliza. Debido a su
aplicación simple y ancho, tales sensores son dirigidos y controlados por las funciones almacenados en la
biblioteca One_Wire.
Esta biblioteca contiene tres funciones en total:
Ow_Reset se utiliza para reiniciar el sensor;
Ow_Read se utiliza para recibir los datos del sensor, y
Ow_Write se utiliza para enviar comandos al sensor.
Aquí puede ver la ventaja de utilizar las bibliotecas con listas para usar las funciones. Usted,
evidentemente, no es necesario estudiar la documentación aportada por el fabricante a fin de utilizar este
sensor adecuadamente. Es suficiente para copiar las funciones apropiadas para el programa. Si usted
quiere saber cómo cualquiera de estas funciones se declara, simplemente haga clic derecho sobre él y
seleccione la opción de ayuda.
' Header******************************************************
program example_12 ' Program name
dim LCD_RS as sbit at RB4_bit ' Lcd module connections
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit ' End Lcd module
connections
' Set TEMP_RESOLUTION to the corresponding resolution of the
DS18x20 sensor in use:
' 18S20: 9 (default setting can be 9,10,11 or 12); 18B20: 12
const TEMP_RESOLUTION as byte = 9 ' Constant TEMP_RESOLUTION is
of byte type
dim text as char[9] ' Variable text is of char
type
temp as word ' Variable temp is of word
type
sub procedure Display_Temperature( dim temp2write as word )
const RES_SHIFT = TEMP_RESOLUTION - 8
dim temp_whole as byte ' Variable temp_whole is of
byte type
temp_fraction as word ' Variable temp_fraction is
of word type
text = "000.0000"
if (temp2write and 0x8000) then ' Check if temperature is
negative
text[0] = "-"
temp2write = not temp2write + 1
end if
temp_whole = word(temp2write >> RES_SHIFT) ' Extract
temp_whole
if ( temp_whole div 100 ) then ' Convert temp_whole to
characters
text[0] = temp_whole div 100 + 48
else
text[0] = "0"
end if
text[1] = (temp_whole div 10) mod 10 + 48 ' Extract
tens
text[2] = temp_whole mod 10 + 48 ' Extract
ones
temp_fraction = word(temp2write << (4-RES_SHIFT)) ' Extract
temp_fraction
temp_fraction = temp_fraction and 0x000F ' and
convert it to
temp_fraction = temp_fraction * 625 ' unsigned
int
text[4] = word(temp_fraction div 1000) + 48 ' Extract
thousands
text[5] = word((temp_fraction div 100) mod 10 + 48) ' Extract
hundreds
text[6] = word((temp_fraction div 10) mod 10 + 48) ' Extract
tens
text[7] = word(temp_fraction mod 10) + 48 ' Extract
ones
Lcd_Out(2, 5, text) ' Print
temperature on Lcd
end sub
main: ' Start of program
ANSEL = 0 ' Configure analog pins as digital I/O
ANSELH = 0
text = "000.0000"
Lcd_Init() ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR) ' Clear Lcd
Lcd_Cmd(_LCD_CURSOR_OFF) ' Turn off cursor
Lcd_Out(1, 1, " Temperature: ")
Lcd_Chr(2,13,178) ' Print degree character, "C" for Centigrades
' Different LCD displays have different char code for degree
Lcd_Chr(2,14,"C") ' If you see greek letter ‘alpha’ type 178
instead of 223
while 1 ' Temperature is read in the main loop
Ow_Reset(PORTE, 2) ' Onewire reset signal
Ow_Write(PORTE, 2, 0xCC) ' Issue command SKIP_ROM
Ow_Write(PORTE, 2, 0x44) ' Issue command CONVERT_T
Delay_us(120)
Ow_Reset(PORTE, 2)
Ow_Write(PORTE, 2, 0xCC) ' Issue command SKIP_ROM
Ow_Write(PORTE, 2, 0xBE) ' Issue command READ_SCRATCHPAD
temp = Ow_Read(PORTE, 2)
temp = (Ow_Read(PORTE, 2) << 8) + temp
Display_Temperature(temp) ' Format and display result on Lcd
Delay_ms(520) ' 520 mS delay
wend
end. ' End of program
Con el fin de que este ejemplo funcione correctamente, es necesario comprobar las siguientes librerías en
el Library Manager antes de compilar:
One_Wire
LCD
4,15 Ejemplo 13 La generación de sonido, librería de sonidos ...
Las señales de audio a menudo se utiliza cuando es necesario llamar la atención del usuario para hacer
algo, para confirmar que uno de los botones es presionado, para advertir que los valores mínimos y
máximos se alcanzan, etc Puede ser sólo un "beep" como señal de así como melodías más largos o más
cortos. Este ejemplo muestra cómo generar un sonido con las funciones que pertenecen a la biblioteca de
sonido.
Adicionalmente a estas funciones, la función del botón también se utiliza para probar los pulsadores.
'Header******************************************************
program example_13 ' Program name
sub procedure Tone1()
Sound_Play(659, 250) ' Frequency = 659Hz, duration = 250ms
end sub
sub procedure Tone2()
Sound_Play(698, 250) ' Frequency = 698Hz, duration = 250ms
end sub
sub procedure Tone3()
Sound_Play(784, 250) ' Frequency = 784Hz, duration = 250ms
end sub
sub procedure Melody() ' Play the melody "Yellow house"
Tone1() Tone2() Tone3() Tone3()
Tone1() Tone2() Tone3() Tone3()
Tone1() Tone2() Tone3()
Tone1() Tone2() Tone3() Tone3()
Tone1() Tone2() Tone3()
Tone3() Tone3() Tone2() Tone2() Tone1()
end sub
sub procedure ToneA() ' Tones used in Melody2 function
Sound_Play( 880, 50)
end sub
sub procedure ToneC()
Sound_Play(1046, 50)
end sub
sub procedure ToneE()
Sound_Play(1318, 50)
end sub
sub procedure Melody2() ' Play Melody2
dim counter as byte
for counter = 9 to 1 step -1
ToneA()
ToneC()
ToneE()
next counter
end sub
main: ' Start of program
ANSEL = 0 ' Configure analog pins as digital I/O
ANSELH = 0
C1ON_bit = 0 ' Disable comparators
C2ON_bit = 0
TRISB = 0xF0 ' Configure RB7..RB4 as inputs and RB3 as output
Sound_Init(PORTD, 3)
Sound_Play(880, 5000)
while TRUE ' Endless loop
if (Button(PORTB,7,1,1)) then ' If PORTB.7 is pressed play
Tone1
Tone1()
while (RB7_bit <> 0)
nop ' Wait for the button to be released
wend
end if
if (Button(PORTB,6,1,1)) then ' If PORTB.6 is pressed play
Tone1
Tone2()
while (RB6_bit <> 0)
nop ' Wait for the button to be released
wend
end if
if (Button(PORTB,5,1,1)) then ' If PORTB.5 is pressed play
Tone1
Melody2()
while (RB5_bit <> 0)
nop ' Wait for the button to be released
wend
end if
if (Button(PORTB,4,1,1)) then ' If PORTB.4 is pressed play
Tone1
Melody()
while (RB4_bit <> 0)
nop ' Wait for the button to be released
wend
end if
wend
end. ' End of program
Con el fin de que este ejemplo funcione correctamente, es necesario comprobar las siguientes librerías en
el Library Manager antes de compilar:
Botón
Sonido
4,16 Ejemplo 14 Use pantalla LCD gráfica
Una pantalla gráfica LCD (GLCD) proporciona un método avanzado para la visualización de los mensajes
visuales. Mientras que la pantalla LCD de carácter sólo puede mostrar caracteres alfanuméricos, el GLCD
también puede mostrar los mensajes en forma de dibujos y mapas de bits. Los más comúnmente
utilizados gráfica LCD tiene una resolución de pantalla de 128x64 píxeles. El contraste GLCD se puede
ajustar por medio de potenciómetro P1.
Aquí, el GLCD muestra un camión del mapa de bits de los cuales se almacena en
la truck_bmp.mbas archivo.
'Header******************************************************
program example_14 ' Program name
dim GLCD_DataPORT as byte at PORTD
dim GLCD_CS1 as sbit at RB0_bit ' Glcd module connections
GLCD_CS2 as sbit at RB1_bit
GLCD_RS as sbit at RB2_bit
GLCD_RW as sbit at RB3_bit
GLCD_EN as sbit at RB4_bit
GLCD_RST as sbit at RB5_bit
dim GLCD_CS1_Direction as sbit at TRISB0_bit
GLCD_CS2_Direction as sbit at TRISB1_bit
GLCD_RS_Direction as sbit at TRISB2_bit
GLCD_RW_Direction as sbit at TRISB3_bit
GLCD_EN_Direction as sbit at TRISB4_bit
GLCD_RST_Direction as sbit at TRISB5_bit ' End Glcd module
connections
dim counter as byte
someText as char[18]
sub procedure Delay2S() ' 2 seconds delay sub function
Delay_ms(2000)
end sub
main: ' Start of program
ANSEL = 0 ' Configure analog pins as digital I/O
ANSELH = 0
Glcd_Init() ' Initialize Glcd
Glcd_Fill(0x00) ' Clear Glcd
while TRUE ' Endless loop
Glcd_Image(@truck_bmp) ' Draw image
Delay2S() delay2S()
Glcd_Fill(0x00) ' Clear Glcd
Glcd_Box(62,40,124,63,1) ' Draw box
Glcd_Rectangle(5,5,84,35,1) ' Draw rectangle
Glcd_Line(0, 0, 127, 63, 1) ' Draw line
Delay2S()
counter = 5
while (counter <= 59) ' Draw horizontal and vertical
lines
Delay_ms(250)
Glcd_V_Line(2, 54, counter, 1)
Glcd_H_Line(2, 120, counter, 1)
Counter = counter + 5
wend
Delay2S()
Glcd_Fill(0x00) ' Clear Glcd
Glcd_Set_Font(@Character8x7, 8, 7, 32) ' Choose font
"Character8x7"
Glcd_Write_Text("mikroE", 1, 7, 2) ' Write string
for counter = 1 to 10 ' Draw circles
Glcd_Circle(63,32, 3*counter, 1)
next counter
Delay2S()
Glcd_Box(10,20, 70,63, 2) ' Draw box
Delay2S()
Glcd_Fill(0xFF) ' Fill Glcd
Glcd_Set_Font(@Character8x7, 8, 7, 32) ' Change font
someText = "8x7 Font"
Glcd_Write_Text(someText, 5, 0, 2) ' Write string
delay2S()
Glcd_Set_Font(@System3x5, 3, 5, 32) ' Change font
someText = "3X5 CAPITALS ONLY"
Glcd_Write_Text(someText, 60, 2, 2) ' Write string
delay2S()
Glcd_Set_Font(@font5x7, 5, 7, 32) ' Change font
someText = "5x7 Font"
Glcd_Write_Text(someText, 5, 4, 2) ' Write string
delay2S()
Glcd_Set_Font(@FontSystem5x7_v2, 5, 7, 32) ' Change font
someText = "5x7 Font (v2)"
Glcd_Write_Text(someText, 5, 6, 2) ' Write string
delay2S()
wend
end. ' End of program
truck_bmp.mbas file:
module bitmap ' Module with bitmap code
const truck_bmp as byte[1024] =
(0,0,0,0,0,248,8,8,8,8,8,8,12,12,12,12,12,10,10,10,10,10,10,9,9
,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,137,137,137,137,137,137,137,137,137,137,137,1
37,137,9,9,9,9,9,
9,9,9,9,9,9,13,253,13,195,6,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,255,0,
0,0,0,0,0,0,0,0,0,240,240,240,240,240,224,224,240,240,240,240,2
40,224,192,192,22
4,240,240,240,240,240,224,192,0,0,0,255,255,255,255,255,195,195
,195,195,195,195,
195,3,0,0,0,0,0,0,0,0,0,0,0,0,255,240,79,224,255,96,96,96,32,32
,32,32,32,32,32,3
2,32,32,32,32,32,64,64,64,64,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,25
5,255,255,255,0,0
,0,0,255,255,255,255,255,0,0,0,0,255,255,255,255,255,0,0,0,255,
255,255,255,255,1
29,129,129,129,129,129,129,128,0,0,0,0,0,0,0,0,0,0,0,0,255,1,24
8,8,8,8,8,8,8,8,8
,8,8,8,8,8,8,16,224,24,36,196,70,130,130,133,217,102,112,160,19
2,96,96,32,32,160
,160,224,224,192,64,64,128,128,192,64,128,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,
63,96,96,96,224,96,96,96,96,96,96,99,99,99,99,99,96,96,96,96,99
,99,99,99,99,96,9
6,96,96,99,99,99,99,99,96,96,96,99,99,99,99,99,99,99,99,99,99,9
9,99,99,96,96,96,
96,96,96,96,64,64,64,224,224,255,246,1,14,6,6,2,2,2,2,2,2,2,2,2
,2,2,130,67,114,6
2,35,16,16,0,7,3,3,2,4,4,4,4,4,4,4,28,16,16,16,17,17,9,9,41,112
,32,67,5,240,126,
174,128,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,12
7,127,127,127,255
,255,247,251,123,191,95,93,125,189,189,63,93,89,177,115,243,229
,207,27,63,119,25
5,207,191,255,255,255,255,255,255,255,255,127,127,127,127,127,1
27,127,127,255,25
5,255,127,127,125,120,120,120,120,120,248,120,120,120,120,120,1
20,248,248,232,14
3,0,0,0,0,0,0,0,0,128,240,248,120,188,220,92,252,28,28,60,92,92
,60,120,248,248,9
6,192,143,168,216,136,49,68,72,50,160,96,0,0,0,0,0,0,0,0,0,128,
192,248,248,248,2
48,252,254,254,254,254,254,254,254,254,254,254,254,255,255,255,
255,255,246,239,2
08,246,174,173,169,128,209,208,224,247,249,255,255,252,220,240,
127,255,223,255,2
55,255,255,255,255,254,254,255,255,255,255,255,255,255,254,255,
255,255,255,255,2
55,255,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
255,255,255,255,2
55,255,254,255,190,255,255,253,240,239,221,223,254,168,136,170,
196,208,228,230,2
48,127,126,156,223,226,242,242,242,242,242,177,32,0,0,0,0,0,0,0
,0,0,0,1,1,1,1,3,
3,3,7,7,7,7,7,15,15,15,7,15,15,15,7,7,15,14,15,13,15,47,43,43,4
3,43,43,47,111,23
9,255,253,253,255,254,255,255,255,255,255,191,191,239,239,239,1
91,255,191,255,25
5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2
55,255,255,255,25
5,255,255,255,255,255,255,127,127,127,127,255,255,191,191,191,1
91,255,254,255,25
3,255,255,255,251,255,255,255,127,125,63,31,31,31,31,31,31,63,1
5,15,7,7,3,3,3,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1
,1,3,3,3,11,11,11
,11,7,3,14,6,6,6,2,18,19,19,3,23,21,21,17,1,19,19,3,6,6,14,15,1
5,7,15,15,15,11,2
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
implements
end. ' End of module
Con el fin de que este ejemplo funcione correctamente, es necesario comprobar la biblioteca
GLCD en el Administrador de la Biblioteca antes de la compilación. Además, es necesario
incluir el Bitmap.mbas documento en el proyecto.
4,17 Ejemplo 15 El uso de un panel táctil
Un panel táctil es un fino, autoadhesivo panel transparente colocado sobre la pantalla de un LCD
gráfico. Es muy sensible a la presión de modo que incluso un toque suave hace que algunos cambios en
la señal de salida. Hay unos pocos tipos de panel táctil. La más simple es un panel táctil resistivo.
Se compone de dos láminas transparentes rígidas, formando un "sandwich" estructura, que tienen capas
resistivas en sus lados interiores. La resistencia de estas capas generalmente no excede de 1K. Los lados
opuestos de estas láminas tienen contactos disponibles para su uso a través de un cable plano.
El proceso de determinación de las coordenadas del punto en el que se pulsa el panel táctil se puede
dividir en dos etapas. El primero es la determinación de la coordenada X y la segunda es la determinación
de la coordenada Y del punto.
Con el fin de determinar la coordenada X, es necesario conectar el contacto izquierdo en la superficie del
suelo a una y el contacto adecuado para la fuente de alimentación. Esto permite un divisor de tensión que
se forman prensando el panel táctil. El valor del divisor se lee en el contacto con el fondo de la tensión
superficial B. puede ir dentro del rango de 0 V a la fuente de alimentación (5V) y depende de la
coordenada X. Si el punto está más cerca del contacto izquierdo de la superficie A, la tensión será más
cercano a 0V.
Con el fin de determinar la coordenada Y, es necesario conectar el contacto con el fondo en la superficie
B a tierra, y el contacto superior a la fuente de alimentación. En este caso, el voltaje se lee en el contacto
izquierdo de la superficie A.
Con el fin de conectar un panel táctil al microcontrolador es necesario proporcionar un circuito de control
del panel táctil. Por medio de este circuito, el microcontrolador conecta los contactos adecuados del panel
táctil al suelo y la fuente de alimentación (como se describió anteriormente) a fin de determinar las
coordenadas X e Y. El contacto inferior de la superficie B y el contacto izquierdo de la superficie A están
conectados al microcontrolador es un convertidor A / D. Las coordenadas X e Y se determina midiendo la
tensión en estos contactos, respectivamente. El programa relacionado describe un menú en la pantalla
gráfica LCD, vuelve el circuito de control del panel táctil de encendido / apagado (panel sensible al tacto
de conducción) y lee los resultados de la conversión A / D, que en realidad representan las coordenadas
X e Y del punto.
Sobre la base de estas coordenadas es posible decidir lo que quiere el microcontrolador que hacer. En
este ejemplo, el microcontrolador se activa / desactiva dos pines digitales conectados a los LEDs A y B.
Funciones pertenecientes a la GLCD, librares Glcd_Fonts y ADC se utilizan en este ejemplo.
Como la superficie del panel táctil es ligeramente más grande que la superficie de la pantalla LCD gráfico,
es necesario realizar la calibración del software del panel de toque con el fin de proporcionar una mayor
precisión al determinar las coordenadas
'Header******************************************************
program example_15 ' Name of program
dim GLCD_DataPORT as byte at PORTD ' GLCD module connections
dim GLCD_CS1 as sbit at RB0_bit
GLCD_CS2 as sbit at RB1_bit
GLCD_RS as sbit at RB2_bit
GLCD_RW as sbit at RB3_bit
GLCD_EN as sbit at RB4_bit
GLCD_RST as sbit at RB5_bit
dim GLCD_CS1_Direction as sbit at TRISB0_bit
GLCD_CS2_Direction as sbit at TRISB1_bit
GLCD_RS_Direction as sbit at TRISB2_bit
GLCD_RW_Direction as sbit at TRISB3_bit
GLCD_EN_Direction as sbit at TRISB4_bit
GLCD_RST_Direction as sbit at TRISB5_bit ' End Glcd module
connections
dim x_coord, y_coord,
x_coord128, y_coord64 as longint ' Scaled x-y position
sub function GetX() as word ' Reading X
PORTC.0 = 1 ' DRIVEA = 1 (LEFT drive on, RIGHT
drive on, TOP drive off)
PORTC.1 = 0 ' DRIVEB = 0 (BOTTOM drive off)
Delay_ms(5)
result = ADC_Read(0) ' READ-X (BOTTOM)
end sub
sub function GetY() as word ' Reading Y
PORTC.0 = 0 ' DRIVEA = 0 (LEFT drive off, RIGHT
drive off, TOP drive on)
PORTC.1 = 1 ' DRIVEB = 1 (BOTTOM drive on)
Delay_ms(5)
result = ADC_Read(1) ' READ-X (LEFT)
end sub
main: ' Start of program
PORTA = 0x00
TRISA = 0x03 ' RA0 i RA1 are analog inputs
ANSEL = 0x03
ANSELH = 0 ' Configure other analog pins as digital I/O
PORTC = 0
TRISC = 0 ' PORTC pins are configured as outputs
Glcd_Init() ' Glcd_Init_EP5
Glcd_Set_Font(@font5x7, 5, 7, 32) ' Choose font size 5x7
Glcd_Fill(0) ' Clear GLCD
Glcd_Write_Text("TOUCHPANEL EXAMPLE",10,0,1)
Glcd_Write_Text("MIKROELEKTRONIKA",17,7,1)
Glcd_Rectangle(8,16,60,48,1) ' Outline two ‘buttons’ on GLCD:
Glcd_Rectangle(68,16,120,48,1)
Glcd_Box(10,18,58,46,1)
Glcd_Box(70,18,118,46,1)
Glcd_Write_Text("BUTTON1",14,3,0)
Glcd_Write_Text("RC6 OFF",14,4,0)
Glcd_Write_Text("BUTTON2",74,3,0)
Glcd_Write_Text("RC7 OFF",74,4,0)
while TRUE ' Read X-Y and convert it to 128x64 space
x_coord = GetX()
y_coord = GetY()
x_coord128 = (x_coord * 128) / 1024
y_coord64 = 64 -((y_coord *64) / 1024)
' If BUTTON1 is selected:
if ((x_coord128 >= 10) and (x_coord128 <= 58) and (y_coord64 >=
18) and (y_coord64 <= 46)) then
if(PORTC.6 = 0) then
PORTC.6 = 1
Glcd_Write_Text("RC6 ON ",14,4,0)
else
PORTC.6 = 0
Glcd_Write_Text("RC6 OFF",14,4,0)
end if
end if
' If BUTTON2 is selected:
if ((x_coord128 >= 70) and (x_coord128 <= 118) and (y_coord64
>= 18) and (y_coord64 <= 46)) then
if(PORTC.7 = 0) then
PORTC.7 = 1
Glcd_Write_Text("RC7 ON ",74,4,0)
else
PORTC.7 = 0
Glcd_Write_Text("RC7 OFF",74,4,0)
end if
end if
Delay_ms(100)
wend ' While true
end. ' End of program
Con el fin de que este ejemplo funcione correctamente, es necesario comprobar las siguientes librerías en el Library Manager antes de compilar:GLCD
ADC
C_Stdlib
4.18 Ejemplo 16 Utilice un teclado 4x4
Un teclado es sólo un conjunto de pulsadores conectados de tal manera para formar los filas 'y' columnas
', reduciendo así un número de pines I / O necesarias para su conexión. Un teclado con 16 pulsadores
dispuestos en 4 filas y 4 columnas se utiliza en este ejemplo. El teclado 4x4 biblioteca contiene todas las
funciones necesarias para la lectura de este teclado, así como para inicializar el puerto que está
conectado. A fin de demostrar el funcionamiento del teclado 4x4, el mensaje se muestra en una pantalla
LCD.
'Header******************************************************
program example_16 ' Program name
dim kp, curX, curY as byte
dim keypadPORT as byte at PORTD ' This variable must be defined
in all projects using Keypad Lib.
' It define the port used for
keypad connection
dim LCD_RS as sbit at RB4_bit ' Lcd module connections
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit ' End Lcd module
connections
main: ' Start of program
curX=1 ' For keeping a record of the 2x16 LCD
cursor position
curY=1
ANSEL = 0 ' Configure analog pins as digital I/O
ANSELH = 0
TRISB = 0
PORTB = 0xFF
Keypad_Init() ' Initialize keypad on PORTC
Lcd_Init() ' Initialize LCD on PORTB,
Lcd_Cmd(_LCD_CLEAR) ' Clear display
while true ' Wait for some key to be pressed and
released
kp = 0
while kp = 0
kp = Keypad_Key_Click()
Delay_ms(10)
wend
select case kp ' Prepare value for output
case 1 kp = "1"
case 2 kp = "2"
case 3 kp = "3"
case 4 kp = "A"
case 5 kp = "4"
case 6 kp = "5"
case 7 kp = "6"
case 8 kp = "B"
case 9 kp = "7"
case 10 kp = "8"
case 11 kp = "9"
case 12 kp = "C"
case 13 kp = "*"
case 14 kp = "0"
case 15 kp = "#"
case 16 kp = "D"
end select
if (curY > 16) then ' Change cursor position
if (curX = 1) then
Lcd_Cmd(_LCD_SECOND_ROW)
curX = 2
curY = 1
else
Lcd_Cmd(_LCD_FIRST_ROW)
curX = 1
curY = 1
end if
end if
Lcd_Chr_CP(kp) ' Display on LCD
Inc(curY)
wend
end. ' End of program
Con el fin de que este ejemplo funcione correctamente, es necesario comprobar las siguientes librerías en el Library Manager antes de compilar:
Keypad4x4
LCD