Sistemas Embebidos MCT

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 73

UNIVERSIDAD DE LAS FUERZAS

ARMADAS ESPE
SEDE LATACUNGA

SISTEMAS EMBEBIDOS MCT

Ing. Andrés Gordón Garcés


INTRODUCCIÓN A SISTEMAS
EMBEBIDOS
En la actualidad, hemos sido testigos de la aparición de importantes avances
tecnológicos en los campos de la computación y de las comunicaciónes. Estos
avances han dado lugar al desarrollo de varias tecnologías, como por ejemplo,
sensores y actuadores inalámbricos, redes de comunicación de tipo alámbrica o
inalámbrica, comunicaciones M2M o máquina a máquina; las mismas que han
dado lugar a la unión de los sistemas físicos con los sistemas cibernéticos.
Siempre ha habido un interés dentro de la academia y la industria, de conseguir
una integración más profunda entre las tecnologías de computación y
comunicaciones de los sistemas cibernéticos con el control y monitoreo de
componentes de automatización y control de procesos como sensores,
actuadores, controladores, etc., obteniendo como resultado final el desarrollo de
sistemas ciberfísicos o en ingles, cyber physical systems (CPS).

Los sistemas computacionales proveen una forma de trabajar, organizar o


ejecutar una o más tareas de acuerdo a un conjunto establecido de reglas, un
programa o un plan. En otras palabras, el objetivo principal de las computadoras
y de los programas computacionales o software es el de procesar información
para tomar mejores decisiones. A parte de procesar información, los dispositivos
de cómputo también se encuentran dentro de otros sistemas como por ejemplo
en vehículos, plantas de manufactura, teléfonos móviles, electrodomésticos,
equipos médicos, etc.
Con el paso del tiempo y además el avance tecnológico, estos sistemas se
volvieron cada vez más interactivos e inteligentes; como por ejemplo, en la
actualidad tenemos plantas de manufactura que son capaces de trabajar
continuamente sin la intervención directa del ser humano, e inclusive si se
presenta una falla en el sistema, este pausa la producción automáticamente;
tenemos electrodomésticos tales como los sistemas de aire acondicionado que
trabajan considerando ciertos aspectos como la temperatura ambiente, gustos o
preferencias del usuario y su presencia en la casa, etc. Este tipo de sistema
computacional se denomina sistema embebido y el software diseñado para
correr en dicho sistema se denomina software embebido.
Un sistema embebido interactúa con el proceso físico o el medio ambiente y
reacciona de acuerdo a ciertos parámetros definidos. Esta diseñado para
aplicaciones específicas, una subsección de una aplicación o producto, o parte
de un sistema mas grande.

Algunas aplicaciones exitosas incluyen sistemas de control en aeronaves,


electrónica automotriz, electrodomésticos, sistemas de seguridad y defensa,
juegos, juguetes, etc.

Sin embargo la mayoría de estos sistemas embebidos son “cajas negras”, que
no muestran la capacidad de su hardware y software, ni tampoco poseen
características para expandir (modificar) su hardware o reprogramar su software
para diferentes tareas. El componente de software puede ser solamente
proporcionado por el fabricante, en forma de imagen binaria compilada,.
Una versión simplificada de un sistema embebido se muestra en la siguiente
figura:
Un sistema embebido, ya sea considerado como un sistema global o un
subsistema, debe presentar las siguientes características:

1. El sistema embebido debe reaccionar al entorno físico, esto se puede


conseguir por medio de un monitoreo continuo del entorno y a la vez ejecutando
acciones con el mismo a través de sensores y actuadores.

2. La reacción del sistema debe estar dentro de límites de tiempo, lo cual


significa que el sistema embebido debe responder a los cambios en el entorno
en un intervalo de tiempo específico o en tiempo real, una respuesta tardía
aunque correcta, se considera como respuesta incorrecta.

3. El sistema embebido debería presentar un alto grado de robustez


empleando recursos mínimos (costos, energía, mínimo tamaño de código,
etc.)

4. El sistema embebido debería ser seguro, confiable, expandible y


disponible.
Una vez que se consolidaron los sistemas embebidos, se vio la necesidad de
que exista un mecanismo por medio del cual estos sistemas autónomos puedan
interactuar unos con otros, consecuentemente, aparece la tecnología de redes
de comunicación. Con este sistema de comunicación, los sistemas automáticos
pueden intercambiar información de forma remota a traves de cables o de forma
inalámbrica, dicha información puede ser datos digitales, texto, video, audio,
imágenes, etc.

La comunidad investigativa ha ido explorando intensamente las redes de


comunicación debido a su gran variedad de aplicaciones; se han hecho grandes
descubrimientos y mejoras en ambas tecnologías de tipo cableada e
inalámbrica, lo cual nos ha llevado a los nuevos paradigmas de comunicación
tales como la computación ubicua y pervasiva (ubiquitous and pervasive
computing), redes de sensores inalámbricos (wireless sensor networks WSNs),
redes de sensores submarinos (underwater sensor networks UWSNs) y sistemas
de comunicación máquina a máquina (M2M machine to machine communication
systems.)

Leer y hacer resumen del artículo científico:


Wireless sensor networks: basics and fundamentals. O. Yalgashev et al.
Del libro: Cyber-Physical System Design with Sensor Networking Technologies
SISTEMA CIBERFÍSICO
La integración de dispositivos computacionales en red con procesos físicos o
reales ha surgido como el nuevo paradigma en sistemas automáticos y es
llamado sistemas ciberfísicos o cyber physical systems (CPSs).

El CPS establece una conectividad entre la computadora, la red, el control y los


sistemas físicos. Por lo tanto, el CPS no es solamente un simple sistema de
control sino un sistema de control en tiempo real, inteligente, predictivo,
adaptativo, distribuido y en red con una mínima intervención humana.
INTRODUCCIÓN AL
MICROCONTROLADOR
Un poco de historia:

Inicialmente cuando no existían los microprocesadores, se requería para el


diseño de circuitos electrónicos muchos componentes y cálculos matemáticos.
Un circuito lógico básico requería de una gran cantidad de elementos
electrónicos basados en transistores, resistencias, etc.
En el año 1971 apareció el primer microprocesador el cual originó un cambio
decisivo en las técnicas de diseño de la mayoría de los equipos.
Entre los microprocesadores mas conocidos tenemos el popular Z-80 y el 8085.

Sinclair ZX 80
Radio Shack TRS 80
Los diseñadores de equipos electrónicos ahora tenían equipos que podían
realizar mayor cantidad de tareas en menos tiempo y su tamaño se redujo
considerablemente.

Sin embargo, después de cierto tiempo aparece una nueva tecnología llamada
microcontrolador que simplifica aun mas el diseño electrónico.
Diferencia entre Microcontrolador y
Microprocesador
Microprocesador:

Es un sistema abierto con el que puede construirse un computador con las


características que se desee, acoplándole los módulos necesarios.

La Unidad Central de Proceso (UCP), interpreta las instrucciones y el cambio de


datos que las ejecuta.
Microprocesador:

Estructura de un sistema abierto basado en un microprocesador. La


disponibilidad de los buses en el exterior permite que se configure a la medida
de la aplicación deseada.
Microcontrolador:

Es un sistema cerrado que contiene un computador completo.

Todas las partes del computador están contenidas en su interior y solo salen al
exterior las líneas que gobiernan los periféricos.

Cada fabricante de microcontroladores oferta un elevado número de modelos


diferentes, desde los más sencillos hasta los más sofisticados.
Arquitectura interna de un microcontrolador
Un microcontrolador posee todos los componentes de un computador, pero con
unas características fijas que no pueden alterarse:


Procesador

Memoria de programa (No volátil)

Memoria datos (lectura y escritura)

Líneas E/S para los controladores de periféricos

Recursos auxiliares


Procesador o CPU.

Memoria no volátil para contener el programa.

Memoria de lectura y escritura para guardar los datos.

Líneas de E/S para los controladores de periféricos.

Recursos auxiliares (Módulos para el control de periféricos)
Procesador o CPU:

Es el elemento más importante del microcontrolador y determina sus principales


características, tanto a nivel de hardware como de software.

Un microprocesador está compuesto por varios bloques interconectados entre sí


pero cada uno de ellos tiene una función específica que cumplir, al diseño e
interconexión de estos bloques se le denomina arquitectura.

Existen dos arquitecturas, se diferencian en la forma de conexión de la memoria


al procesador y en los buses que cada una necesita:

 Arquitectura Von Neumann


 Arquitectura Harvad
Partes de un microprocesador:

En la figura vemos la estructura básica de este dispositivo se puede apreciar que


pese a la complejidad de los microprocesadores su diagrama de bloques es muy
sencillo. A grandes rasgos, esta es la estructura básica de los
microprocesadores.

1. La Unidad Aritmética Lógica (ALU), ejecuta todas las operaciones solicitadas.


2. Un serie de registros, donde se almacenan temporalmente los datos. De aquí
la ALU extrae las instrucciones sobre las operaciones específicas a realizar y
sobre el segmento de la memoria RAM donde vaciará sus resultados una vez
ejecutadas las instrucciones.
3. Una serie de bloques de control (direcciones, datos, memoria), para
comunicarse con el exterior. Estos bloques controlan el flujo de información y el
orden de ejecución del programa.
4. El circuito de reloj o Timer, sincroniza perfectamente la ejecución de todas las
operaciones señaladas anteriormente.
Arquitectura Von Neumann

Existe una sola memoria, donde coexisten las instrucciones de programa y los
datos, accedidos con un bus de dirección, uno de datos y uno de control.

Limitación:
Longitud de las instrucciones por el bus de datos (varios accesos a memoria
para instrucciones complejas).

velocidad de operación (bus único para datos e instrucciones) que impide


superponer ambos tiempos de acceso.
Arquitectura Harvard

Memoria de datos separada de la memoria de instrucciones


Conjunto reducido de instrucciones (RISC)
Ejecución de instrucciones en un ciclo de instrucción.
Paralelismo implícito, segmentación del procesador (pipe-line)
El alto rendimiento que poseen los microcontroladores se debe a tres
técnicas:

 Arquitectura Harvard
 Arquitectura RISC
 Segmentación
Memoria de Programa o ROM (Read Only Memory / Memoria Solo Lectura)

Esta diseñado para que en su memoria de programa se almacenen todas las


instrucciones del programa de control. No hay posibilidad de utilizar memorias
externas de amplicación. Como el programa a ejecutar siempre es el mismo,
debe estar grabado de forma permanente. Los tipos de memoria adecuados
para soportar esta función admiten cinco versiones diferentes.

 ROM con máscara: Esta memoria se conoce simplemente como ROM y se


caracteriza porque la información contenida en su interior se almacena durante
su construcción y no se puede alterar. Son memorias idelas para almacenar
microprogramas, sistemas operativos, tablas de conversión y caracteres.
Generalmente estas memorias utilizan transistores MOS para representar los
dos estados lógicos (1 o 0). La programación se desarrolla mediante el diseño
de un negativo fotográfico llamado máscara donde se especifican las
conexiones internas de la memoria.
EPROM: La grabación de esta memoria se realiza mediante un dispositivo físico
gobernado desde un computador personal, que recibe el nombre de grabador o
quemador. En la superficie de la cápsula del microcontrolador existe una
ventana de cristal por la que se puede someter al chip de la memoria a rayos
ultravioletas para producir su borrado y emplearla nuevamente. Es muy
importante la memoria EPROM en la fase de diseño y depuración de los
programas, pero su coste unitario es elevado. Su nombre proviene de las siglas
en inglés Erasable Programmable Read Only Memory
OTP (One Time Programmable / Una sola vez programable): Este modelo de
memoria sólo se puede grabar una vez por parte del usuario, utilizando el mismo
procedimiento que con la memoria EPROM. Posteriormente no se puede borrar.
Su bajo precio y la sencillez de la grabación aconsejan este tipo de memoria
para prototipos finales y series de producción cortas.

EEPROM: Electrical erasable programmable read only memory. La grabación es


similar a las memorias OTP y EPROM, pero el borrado es mucho más sencillo
al poderse efectuar de la misma forma que el grabado, o sea, eléctricamente.
Sobre el mismo zócalo del grabador puede ser programada y borrada tantas
veces como se quiera, lo cual la hace ideal en la enseñanza y en la creación de
nuevos proyectos.
Memoria Flash: Se trata de una memoria no volátil, de bajo consumo, que se
puede escribir y borrar en circuito al igual que las EEPROM, pero suelen
disponer de mayor capacidad que estas últimas. El borrado sólo es posible con
bloques completos y no se puede realizar sobre posiciones concretas.

En las FLASH se garantizan 1.000 ciclos de escritura-borrado. Son muy


recomendables en aplicaciones en las que sea necesario modificar el programa
a lo largo de la vida del producto, como consecuencia del desgaste o cambios de
piezas, como sucede con los vehículos.

Por sus mejores prestaciones está sustituyendo a la memoria EEPROM para


contener instrucciones. De esta forma Microchip comercializa dos
microcontroladores prácticamente iguales, que sólo se diferencian en que la
memoria de programa de uno de ellos es tipo EEPROM.
Memoria de Datos o memoria RAM (Random Access Memory o Memoría de
Acceso Aleatorio)

Los datos que manejan los programas varían continuamente, y esto exige que la
memoria que les contiene debe ser de lectura y escritura, por lo que la memoria
RAM estática (SRAM) es la más adecuada, aunque sea volátil.

Hay microcontroladores que también disponen como memoria de datos una de


lectura y escritura no volátil, del tipo EEPROM. De esta forma, un corte en el
suministro de la alimentación no ocasiona la pérdida de la información, que está
disponible al reiniciarse el programa.

El PIC16C84, el PIC16F83 y el PIC16F84 disponen de 64 bytes de memoria


EEPROM para contener datos.

La memoria RAM, es el elemento esencial para la multitarea. Si en un


dispositivo abrimos muchos programas, la RAM necesitará cargar las
instrucciones de todos ellos. Dependiendo de la memoria RAM se puede abrir
más o menos programas.
La memoria RAM es un dispositivo electrónico que es capaz de almacenar
instrucciones y datos, de forma temporal, pero pierde los datos cuando el equipo
se apaga. La gran ventaja de la memoria RAM es que tiene una alta velocidad
de transmisión de datos o de información.
Registros y Bits

Un registro es una posición de memoria en la cual se puede almacenar un dato o


el estado de un byte. Es decir que la memoria esta dividida en pequeñas partes
llamadas “Registros”.

El primer registro de una memoria corresponde a la dirección 00H.

Hay un conjunto de registros que ya vienen “Predefinidos” desde la fábrica.

Cada registro esta dividido en 8 partes, Bits.

Entonces, debido a que el microcontrolador contiene internamente diferentes


módulos por ejemplo de lectura escritura de puerto (o pines), módulo conversor
de señales analógicas a digitales (ADC), temporizadores, etc. Se hace
necesario configurar cada uno de los módulos que vayamos a usar para que el
microcontrolador entienda que próceso debe realizar, como y para que.
Como se puede notar, los puertos de un microcontrolador hacen referencia a un
conjunto o grupo de pines que pueden representar bits (1s y 0s que salen a
través de ellos), entonces lo que se hace con el registro que mencionábamos
anteriormente (registro DDRx) es indicarle al microcontrolador cuales pines del
puerto ‘X’ queremos que se comporten como entrada o salida , por lo tanto un
registro de configuración tiene la siguiente forma (normalmente los registros son
de 8 bits) tal como se muestra en la siguiente figura.
Cada bit de este registro (0,1,2,3,4…) va a representar el comportamiento como
entrada o como salida de cada uno de los pines de ese determinado puerto ‘X’,
por lo tanto, teniendo en cuenta que si se pone un ‘1’ significa que el pin se
comportará como entrada y un ‘0’ (cero) significa que el pin se comportará como
salida, entonces si queremos decir que todos los pines del ‘puerto A’ se
comportan como salidas, el registro de configuración del puerto A (DDRA) tendrá
el siguiente aspecto.
De esta forma de ahora en adelante todos los pines del puerto A se comportarán
como salida, es decir, que solo habrán valores de 0 y 5 voltios y no se realizará a
través de ellos ninguna lectura, un ejemplo más es, si por algún motivo quiero
que de los 8 pines del puerto B de mi microcontrolador, 4 se comporten como
entrada y 4 como salida.

Ahora ya hemos entendido, para que sirven los registros de configuración, su


comportamiento principal es ser modificados y decir entonces como van a operar
ciertos módulos, puertos, etc. A continuación vamos a ver un par de notaciones
que se utilizan a la hora de escribir en un registro, para esto vamos a tener que
recordar algo sobre los números en base 16 o números en representación
hexadecimal.

 Los números hexadecimales van del 0 a la F, donde F=15


 Cada valor hexadecimal está representado por 4 bits (valores en binario)
Luego, vamos a tener en cuenta que para escribir un número en base 16 (un
número hexadecimal) en un microcontrolador o en lenguaje ‘C‘ en general, hay
que iniciar con un 0x y luego el número (por ejemplo 0xF0) sería la
representación del número de la figura anterior dentro de nuestro programa,
finalmente sabiendo todo lo anterior, la conclusión es obvia, ¿que debo hacer si
quiero hacer que 4 pines de mi puerto B (por ejemplo) se comporten como salida
y los otros 4 como entrada?, simple, solo tienes que escribir en el registro
correspondiente DDRB el número en hexadecimal que escriba los 1s y 0s donde
quieras, para resolver esta pregunta, lo que hay que hacer es una asignación o
igualación simple como en la siguiente figura.

Al hacer la operación anterior, nuestro registro de configuración del puerto B


queda con los siguientes valores:
En este caso, tal como pasaba con el prefijo ‘0x’ para indicar que el valor era
hexadecimal, se debe anteponer ahora el prefijo ‘ob’ para indicar que el valor
siguiente está dado en notación binaria, así, la notación anterior escribirá cada
cero o uno en la correspondiente posición de bit en el registro DDRB, por esta
razón el valor contiene 8 números.

Por último, la siguiente forma de modificar los valores de los registros es con la
notación de desplazamiento de bits o como la llamo yo, la forma de “poner bits”,
y esta denominación, porque se trata simplemente de eso, de poner bits en una
posición específica, aquí hay que introducir un nuevo concepto y es que en los
microcontroladores, cada bit de un registro de configuración tiene un nombre
específico, que generalmente hacen referencia a la función que desempeña
dicho bit, por ejemplo al hablar de los pines de cada puerto, el registro DDRB
tiene los siguientes nombres:
Cada bit de este registro (0,1,2,3,4…) va a representar el comportamiento como
entrada o como salida de cada uno de los pines de ese determinado puerto ‘X’,
por lo tanto, teniendo en cuenta que si se pone un ‘1’ significa que el pin se
comportará como salida y un ‘0’ (cero) significa que el pin se comportará como
entrada, entonces si queremos decir que todos los pines del ‘puerto A’ se
comportan como salidas, el registro de configuración del puerto A (DDRA) tendrá
el siguiente aspecto.
Líneas de Entrada/Salida (Puertos)

A excepción de dos patitas destinadas a recibir la alimentación, otras dos para el


cristal de cuarzo, que regula la frecuencia de trabajo, y una más para provocar el
Reset, las restantes patitas de un microcontrolador sirven para soportar su
comunicación con los periféricos externos que controla.

Las líneas de E/S que se adaptan con los periféricos manejan información en
paralelo y se agrupan en conjuntos de ocho, que reciben el nombre de Puertos.
Hay modelos con líneas que soportan la comunicación en serie; otros disponen
de conjuntos de líneas que implementan puertas de comunicación para diversos
protocolos, como el I2C, el USB, etc.

Los puertos están controlados por los registros.


Líneas de Entrada/Salida (Puertos)
Recursos Auxiliares

Según las aplicaciones a las que orienta el fabricante cada modelo de


microcontrolador, incorpora una diversidad de complementos que refuerzan la
potencia y la flexibilidad del dispositivo.

Entre los recursos más comunes se citan a los siguientes:

 Circuito de reloj: es el encargado de generar los impulsos que sincronizan el


funcionamiento de todo el sistema.
 Temporizadores y contadores: orientados a controlar tiempos y contar.
 Perro guardián o watchdog: destinado a provocar una reinicialización
cuando el programa queda bloqueado.
 Conversores AD y DA: para poder recibir y enviar señales analógicas
 Comparadores analógicos: para verificar el valor de una señal analógica.
 Modulador de ancho de pulsos (PWM): técnica utilizada para regular la
velocidad de giro de los motores eléctricos.
 Puerto serie: para comunicación serial con periféricos de entrada y de salida.
 Otros puertos de comunicación (USB, CAN)
 Sistema de protección: ante falls de la alimentación.
 Estado de reposo: en el que el sisema queda congelado el cnosumo de
energía se reduce al mínimo.
Programación de Microcontroladores

La utilización de los lenguajes más cercanos a la máquina (de bajo nivel)


representan un considerable ahorro de código en la confección de los
programas, lo que es muy importante dada la estricta limitación de la capacidad
de la memoria de instrucciones. Los programas bien realizados en lenguaje
Ensamblador optimizan el tamaño de la memoria que ocupan y su ejecución es
muy rápida.
Los lenguajes de alto nivel más empleados con microcontroladores son el C y el
BASIC, de los que existen varias empresas que comercializan versiones de
compiladores e intérpretes para diversas familias de microcontroladores. En el
caso de los PIC es muy competitivo e interesante el compilador de C PCM de la
empresa CCS y el intérprete PBASIC de PARALLAX.
Instrumental de Trabajo

Siempre que se diseña con circuitos integrados programables se precisan


herramientas para la puesta a punto del hardware y del software. Con referencia
al software, además de los compiladores o intérpretes de los lenguajes usados,
es muy interesante disponer de simuladores software, que consisten en
programas que simulan la ejecución de instrucciones representando el
comportamiento interno del procesador y el estado de las líneas de E/S. Como
se simula por software al procesador, el comportamiento no es idéntico aunque
proporciona una aproximación aceptable, especialmente cuando no es esencial
el trabajo en tiempo real. Microchip pone libremente a disposición de sus
usuarios, a través de Internet (http://www.microchip.com), ensambladores como
el MPASM y simuladores como el MPSIM.
Instrumental de Trabajo

Respecto a las herramientas hardware, una indispensable es el grabador,


encargado de escribir el programa en la memoria del microcontrolador. Existen
grabadores muy completos, capaces de trabajar con muchos modelos de
diferentes familias, pero su elevado precio los aleja de los usuarios personales.
Los Microcontroladores PIC

Los PIC son una familia de microcontroladores tipo RISC (Reduced Instruction
Set Computer) fabricados por la empresa Microchip Technology Inc. y derivados
del PIC1650 originalmente desarrollado por la división de microelectrónica de
General Instruments.

PIC significa “Peripheral Interface Controller”.

El PIC de 8 bits se desarrollo para el año 1975

Los microcontroladores PIC incorporan en su procesador trees características:

 Procesador tipo RISC.


 Procesador segmentado.
 Arquitectura Harvard.
La familia de microcontroladores PIC está formada por cuatro gamas:

Gama enana, gama baja, gama media y gama alta.

Sus diferencias radica en el número de instrucciones y longitud, y en el número


de puertos y funciones.

Lo cual se refleja en el encapsulado, la complejidad interna y de programación, y


en el número de aplicaciones.
Nomenclatura de los PICs

PIC nnLLLxxx

nn: Un número propio de la gama del PIC

LLL: Código de letras donde la primera indica la tensión de alimentación y las


otras dos el tipo de memoria que utiliza

Xxx: Número que indica el modelo del PIC.


Gama Enana de PICs

PIC 12C(F)XXX, de 8 patas (pines)

Aunque solo tienen 8 pines, pueden destinar hasta 6 como líneas de E/S para
los periféricos porque disponen de un oscilador interno R-C.
Gama Baja o Básica de PICs

 Mejores relaciones coste/prestaciones.


 Encapsulados con 18 y 28 pines
 Pueden alimentarse con una tensión 2.5V
 33 instrucciones con formato de 12bits.
Gama Media de PICs

 Encapsulado desde 18 hasta 68 pines


 35 instrucciones de 14 bits
Gama Alta de PICs

 Alcanzan 58 instrucciones de 16 bits


 Sistema de gestión de interrupciones vectorizadas
 Incluyen variados controladores de periféricos, puertas de comunicación serie
y paralelo.
COMPILADOR CCS C

El compilador C de CCS (Custom Computer Services) ha sido desarrollado


específicamene para microcontroladores PIC, obteniendo la máxima
optimización del compilador con estos dispostivos. Dispone de una amplia
librería de funciones predefinidas, comandos de preprcesado y ejemplos.
Suministra los controladores (drivers) para diversos dispositivos como LCD,
convertidores AD, relojes en tiempo real, EEPROM, etc.

Un compilador convierte el lenguaje de alto nivel a instrucciones en código


máquina; los programas son editados y compilados a instrucciones máquina en
el entorno de trabajo del PC, el código máquina puede ser cargado del PC al
sistema PIC mediante algun programador de microcontroladores, y puede ser
depurado (puntos de ruptura, simulación paso a paso desde el entorno de
trabajo del PC.
Estructura de un programa:

Para escribir un programa en C con el CCS C se deben tener en cuenta una


serie de elementos básicos de su estructura.
Directivas de preprocesado: controlan la conversión del programa a código
máquina por parte del compilador.

Programas o funciones: conjunto de instrucciones. Puede haber uno o varios


programas, en cualquier caso siempre debe haber uno definido como principal
mediante la inclusión de la llamada main().

Instrucciones: indican como se debe comportar o que acciones ejecuta el PIC


en todo momento.

Comentarios: permiten describir lo que significa cada línea del programa.


Tipos de datos: CCS C acepa los siguientes tipos de datos.
Las constantes se pueden especificar en decimal, octal, hexadecimal o en
binario.

También se definen caracteres especiales, algunos como:


VARIABLES:

Las variables se utilizan para nombrar posiciones de memoria RAM; se deben


declarar, obligatoriamente, antes de utilizarlas; para ello se debe indicar el
nombre y el tipo de dato que se manejará. Se definen de la siguiente forma:

TIPO NOMBRE_VARIABLE = VALOR INICIAL ;

TIPO hace referencia a cualquiera de los tipos de datos citados anteriormente.


El NOMBRE_VARIABLE puede ser cualquiera y el valor inicial es opcional.
Ejemplo:

Las variables definidas en un programa pueden ser de tipo LOCAL o GLOBAL.


Las variables locales solo se utilizan en la función donde se encuentran
declaradas; las variables globales se pueden utilizar en todas las funciones del
programa. Ambas deben declararse antes de ser utilizadas y las globales
deben declararse antes de cualquier función y fuera de ellas.
Las variables globales son puestas a cero cuando se inicia la función principal
main().

Las variables pueden ser definidas con:

AUTO: (usada por defecto, no hace falta que se indique) donde la variable existe
mientras la función esá aciva. Estas variables no se inicializan a cero. Su valr
se pierde cuando se sale de la función.
STATIC: Una variable local se activa como global, se inicializa a cero y mantiene
su valor al entrar salir de la función.

EXTERN: Permite el uso de variables en compilaciones múltiples.


OPERADORES

Operadores de Asignación
Operadores Aritméticos

Operadores Relacionales
Operadores Lógicos

Operadores de bits
Orden de precedencia de los operadores:

La prioridad y asciaividad de los operadores afectan a la agrupación y evaluación


de los operandos en las expresiones. Las expresiones con operadores de
mayor prioridad se evalúan primero. La prioridad también se puede describir con
la palabra “enlace”. Se dice que los operadores con mayor prioridad tienen un
enlace más estricto.

En la tabla siguiente se resume la prioridad y asociatividad (el orden en que se


evalúan los operandos) de los operadores de C, que se enumeran por orden de
prioridad, de mayor a menor. Cuando varios operadores aparecen juntos, tienen
la misma prioridad y se evalúan según su asociatividad.
FUNCIONES

Las funciones son bloques de sentencias; todas las sentencias se deben


enmarcar dentro de las funciones. Al igual que las variables, las funciones
deben definirse antes de utilizarse.

Una función puede ser invocada desde una sentencia de otra función. Una
función puede devolver un valor a la sentencia que la ha llamado. El tipo de dato
se indica en la definición de la función; en el caso de no indicarse nada se
entiende que es un int8 y en el caso de no devolver un valor se debe especificar
el valor VOID. La función, además de devolver un valor, puede recibir
parámetros o argumentos.
La estructura de una función es:

La forma de devolver una valor es mediante la sentencia RETURN:

Donde expresión debe manejar el mismo tipo de dato que el indicado en la


definición de la función. En el caso de no devolver nada se finaliza con
RETURN, al encontrar esta sentencia el com pilador vuelve a la ejecución de la
sentencia de llamada. Las funcinoes pueden agruparse en ficheros de librerías
<fichero.h>, que se pueden utilizar mediante la direciva #include
DECLARACIONES DE CONTROL

Las declaracinoes son usadas para controlar el proceso de ejecución del


programa. Las declaraciones que admite CCS son:


If-Else

While

Do-While

For

Switch-Case

Return

Break, Continue, Goto
FUNCIONES DE RETARDO

Cuando se trabaja con microcontroladores es muy frecuente que se


necesiten generar retardos o esperas; el compilador CCS, proporciona
algunas funciones para estas situaciones.

delay_ms(tiempo)
Esta función realiza retardos del valor especificado en la variable tiempo. El valor
es un int16 (0-65535) en milisegundos. Ejemplo:

delay_ms(500); //genera un retardo de 500 ms.

delay_us(tiempo)
Los retardos conseguidos con esta función son especificados en la variable
tiempo en microsegundos y es un int16 (0-65535). Ejemplo:

delay_us(500); //genera un retardo de 500 us.


delay_cycles(contador)
Con esta función, se realizan retardos de acuerdo al número de ciclos de
máquina especificado en la variable contador. Los valores van desde 1 a 255.
Un ciclo de máquina o instrucción es igual a cuatro ciclos de reloj.

Directiva #use delay (clock = frecuencia)


Las tres funciones de retardo descritas trabajan en conjunto con la
directiva #use.
delay: Esta directiva indica al compilador que frecuencia de reloj va utilizar
el microcontrolador. Ejemplos:

#use delay (clock=4000000) //Indica MC va utilizar un oscilador de 4MHz.


#use delay (clock=20000000) //Indica MC va utilizar oscilador de 20MHz.

También se puede escribir:

#use delay (clock=4M) //Indica que MC va utilizar un oscilador de 4MHz.


#use delay (clock=20M) //Indica que MC va utilizar un oscilador de 20MHz.
Los fuses del microcontrolador PIC16F877A

Todos los microcontroladores PIC tienen incorporados circuitos especiales que


se pueden activar o desactivar según los requerimientos de la aplicación o algún
caso en particular.

Estos circuitos o características especiales se deben configurar mediante


software o por el equipo programador al momento de grabar el programa en el
microcontrolador. La configuración adecuada de estos circuitos determina en
gran parte la funcionabilidad y eficiencia del programa desarrollado.

Los fuses permiten entre otras cosas seleccionar el oscilador: interno o


externo que se va utilizar, la frecuencia de trabajo del sistema, el uso del Master
Clear (reset del sistema), etc. Los fuses internamente en el microcontrolador son
controlados por registros internos y que se pueden habilitar o deshabilitar
mediante software o por medio del equipo programador. CCS provee de
instrucciones de alto nivel que permiten de forma transparente configurar los
FUSES (fusibles).
En el PIC16F877A, los fuses que CCS configura se muestra en la tabla 2.1. Para
no distorsionar la descripción del fuse, se ha dejado en el idioma original, que
CCS proporciona en el IDE del programa.
Configuración del reloj.

La mayoría de los microcontroladores PIC de la familia 16F y 18F tienen


incorporado un sistema de reloj para ser utilizado según las necesidades
del diseño.

Tipos de osciladores
La siguiente tabla, indica los valores típicos del cristal y los capacitores que el
fabricante sugiere utilizar con los diferentes cristales para modo XT y HS.
Mayor información sobre los valores del oscilador de cristal y los capacitores
para los resonadores cerámicos se pueden encontrar en las hojas del datasheet
del fabricante.
El oscilador se conecta en los pines RA6/OSC2/CLKO y OSC1/CLK1.
Ejercicio de secuencias con LEDS

En muchas aplicaciones como en luces de discotecas, decoraciones de locales,


etc., se necesita controlar luces que deben un efecto visual atrayente. Utilizando
el microcontrolador se puede realizar una serie de proyectos de este tipo.

El ejercicio siguiente, consiste en activar y desactivar los LEDS que están


conectados al puerto uno a uno empezando desde el puerto RB0 hasta llegar al
RB7 en forma indefinida.

Para clarificar el funcionamiento y la secuencia de los bits que se desea


implementar, la siguiente tabla, muestra el estado del puerto b, en cada uno de
los bits que forman el puerto.
Para realizar el programa, se utiliza la siguiente lógica de programación:

• Inicializar el puerto B con (00000001), para activar el LED que está conectado
en RB0.
• Mostrar este valor durante un tiempo (100 ms).
• Desplazar el valor del puerto una posición a la izquierda (port_b = port_
b<<1).
• Repetir este proceso hasta que llegue el 1 al puerto RB7. Mediante el bucle for
se controla que el bit 1 que está en puerto RB0, se desplace hasta llegar al
puerto RB7. Como el puerto tiene ocho bits, entonces el desplazamiento se debe
repetir 7 veces. La instrucción que realiza esta función es: for (i=1;i<=8;++i).
• Al llegar el bit a la posición 7 el valor del puerto será 128 (27=128). A partir
de este valor, en este punto, el desplazamiento se realiza a la derecha
(port_b=port_b>>1) hasta que el bit llegue a RB0.
• Repetir el proceso.

También podría gustarte