Sie sind auf Seite 1von 64

MICROCONTROLADORES

ING. Ramdhar Hadit Yusseff Vanegas

Introduccin a los
MICRO -CONTROLADORES
Utilizando Lenguaje C18 con Plataforma
MPLAB y simulacin en PROTEUS.

Programacin de Micro-controladores en C18

Este libro muestra de una forma clara y concisa, los temas relacionados con la
programacin de Microcontroladores en la gama 18F4xxxx realizando un enfoque rpido
y conceptual en cada uno de los estudiantes.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

1. ARQUITECTURA BSICA DEL MICRO-CONTROLADORES PIC Y SU SET DE INSTRUCCIONES

1.1 CONCEPTOS BSICOS DE LOS MICROCONTROLADORES.

Los Microcontroladores son integrados con todas las etapas necesarias para convertirse en un
cerebro, es decir, tienen memoria, CPU, osciladores, puertos de comunicacin, y algunos
recursos especiales, que permiten a los usuarios por medio de la programacin en un lenguaje
de comandos, crear dispositivos electrnicos que realicen tareas especificas o cumplan con
necesidades actuales de algn sistema.

Qu son los Microcontroladores?

Son dispositivos que contienen en un mismo encapsulado todos los bloques funcionales
necesarios para realizar tareas repetitivas y de anlisis. A diferencia de los microporcesadores
que son sistemas que son sistemas abiertos que pueden modificar los bloques funcionales
segn sus necesidades, por ejemplo aumentar la memoria RAM de un Computador.

Figura 1. Estructura Fsica de un Microcontrolador

Fuente: www.sigmaelectronica.net
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Figura 2. Estructura interna de un Microcontrolador

Fuente: http://www.mikroe.com

Qu necesitan para funcionar?

Necesita dos seales indispensables:

Como todo dispositivo electrnico necesita de una Tensin de alimentacin establecida


por el fabricante (5V, 3.3V, 2.5V, 1.5V) a la cual normalmente se le llama un uno lgico
(1).
Un oscilador que determina la velocidad lectura del Cdigo. Tambin llamado Reloj, que
electrnicamente es un tren de pulsos.

Qu hacen?

Son capaces de interpretar una serie de instrucciones que un usuario programa en un lenguaje
estandarizado como C18.

Para qu?

Para generar acciones de comunicacin interna y externa, de naturaleza digital y analgica, con
el fin de manipular de sistemas y dispositivos electrnicos. Es difcil imaginar cmo se sera el
mundo si desaparecieran los Microcontroladores, pues actualmente se encuentran aplicados
en los siguientes campos:

Automatizacin industrial.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Medida y control de procesos.
Enseanza e investigacin.
Perifricos y dispositivos auxiliares de las computadoras.
Electrodomsticos.
Aparatos porttiles y de bolsillo.
Mquinas expendedoras y juguetera.
Instrumentacin.
Industria de la automocin.
Electro-medicina.
Robtica.
Sistemas de navegacin.
Sistemas de seguridad y alarma.
Domtica.
Termorregulacin

Qu Microcontrolador elegir?

Sin duda para elegir el mejor microcontrolador se deben tener en cuenta algunos aspectos
propios del sistema (seales, dispositivos a controlar, velocidad, comunicacin) y otros del
usuario (presupuesto, lenguaje, familia)

En la siguiente figura se pueden apreciar algunos de los fabricantes ms destacados y los


Ranking en la dcada de los 90.

Figura 3. Ranking de los Microcontroladores en los 90.

Fuente http://perso.wanadoo.es
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Tabla #. Algunos fabricantes de Microcontroladores con algunos modelos.

Fuente: ?

1.2 BLOQUES FUNCIONALES DE UN MICROCONTROLADOR

Los componentes que dispone normalmente un microcontrolador se pueden apreciar en la


figura 4 y se nombran as:

Procesador o CPU (Unidad central de proceso).


Memoria RAM para contener los datos.
Memoria para el programa tipo ROM/PROM/EPROM.
Lneas de E/S para comunicarse con el exterior.
Diversos mdulos para el control de perifricos (Temporizadores, puertas serie y
paralelo, CAD, etc.)
Generador de impulsos de reloj que sincronizan el funcionamiento de todo el sistema.

Figura 4. Estructura del Microcontrolador

Fuente: http://html.rincondelvago.com
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Figura #. Estructura de un microcontrolador 2.

http://www.mikroe.com/

1.2.1 Memoria

Es una seccin del Microcontrolador diseada especialmente para retener cdigos e


informacin de la misma manera que su memoria guarda el nombre de sus familiares.

Para utilizar la memoria se indicar si el dato se va a escribir o a leer colocando un 1 o un 0


respectivamente en la lnea de escritura/lectura (R/W) e indicar la direccin donde se desean
guardar los datos.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
En los Microcontroladores, existen dos tipos de memoria integrados dentro:

Memoria de programa.
Memoria de datos.

La memoria ROM es un tipo de memoria no voltil, de manera que no sufre modificaciones


durante la ejecucin del programa.

Este tipo de memoria es muy similar a la memoria de largo plazo que ustedes tienen, en este
tipo de memoria se encuentra su nombre, su edad, la fecha de nacimiento, entre otras.

Existe otro tipo de memoria que cambia o vara a medida que el cdigo se ejecuta, esta memoria
es de lectura y escritura, es decir tipo RAM.

Al contrario que la anterior este es muy similar a la memoria de corto plazo de cada uno de
ustedes, en esta se guarda un el nombre de la persona que acaban de conocer, el numero
nuevo que acaban de dictar.. Entre otros.

A Continuacin se muestran algunos de los Tipos de memoria no voltil en los


Microcontroladores (I).

Los diferentes tipos de memoria no voltil que nos podemos encontrar en un microcontrolador
son:

ROM CON MSCARA.


OTP.
EPROM.
EEPROM.
FLASH.

ROM CON MSCARA: Memoria de solo lectura, se graba durante la fabricacin del chip. Este
tipo de memoria no se puede volver a programar.

OTP: (One Time Programable), o ROM programable una vez. El Microcontrolador posee una
memoria ROM que el usuario puede programar una nica vez.

EPROM: (Erasable Programmable Read Only Memory), Se puede grabar y borrar muchas
veces. Se borra mediante luz ultravioleta y a travs de una ventana de cristal que posee el chip.

EEPROM: (Electrical Erasable Programmable Read Only Memory) Tanto la grabacin como el
borrado se realizan mediante impulsos elctricos. Estas operaciones se pueden efectuar
muchas veces.

FLASH: Es una memoria de bajo consumo, que se puede leer y escribir en el propio circuito. Es
ms veloz y de mayor densidad que la EEPROM.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

1.2.2 CPU

Parte del microcontrolador encargado de analizar todos los datos y realizar operaciones
aritmticas y lgicas ayudndose de estados de memoria llamados registros y de la ALU
(Unidad Aritmtica-Lgica).

Este tipo de dispositivo se puede comparar fcilmente con el cerebro de ustedes, cuando se va
a hacer una cuenta matemtica ustedes necesitan unos datos de entrada, un registro de
memoria para guardar estos datos, una ALU que es donde se encuentra la operacin que va a
realizar, suma, resta, divisin, entre otras.

Figura #. Nombre de la figura.

1.2.3 Bus

El BUS es un manojo de alambres o pistas conductoras en grupo de 8, 16, 32. Internamente el


microcontrolador tiene dos tipos de buses, uno de datos y otros de direcciones, los cuales
difieren en tamao dependiendo de la capacidad del dispositivo.

Figura #.

1.2.4 Entrada y salida


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Son los pines con los cuales se comunica el microcontrolador con el exterior, Estos son los
puertos del microcontrolador, y son bidireccionales de manera que funcionan como entrada o
como salida, funcionan como espacios de memoria donde se puede analizar el estado de sus
entradas o asignar un estado a sus salidas.

Figura #.

Fuente:

Ventajas de los Puertos del Microcontrolador.

Pueden configurarse como entrada o salida.


Son la interfaz de comunicacin entre el chip y el mundo exterior.
Se pueden configurar como Digitales o Analgicos.
Los pines estn protegidos contra sobre intensidades y sobretensiones.
Por medio de las entradas se puede modificar la velocidad de trabajo del
microcontrolador

1.3 RECURSOS ESPECIALES DEL MICROCONTROLADOR

Dependiendo de la gama de los microcontroladores, existen algunos recursos especiales que


facilitan la programacin al usuario y se configuran por medio de los #pragma. A continuacin
se muestran los utilizados por el microcontrolador 18F4550.

Temporizadores o timers.
Perro guardin o watchdog.
Proteccin ante fallos de alimentacin o brownout.
Estado de bajo consumo o sleep.
Convertidor A/D.
Convertidor D/A.
Control se anchura de pulsos PWM.
Puertos de comunicacin.
UART
USART
USB
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
I2C
CAN
TCP/IP

1.2.5 Comunicacin serial

La conexin paralela entre el microcontrolador y los perifricos a travs de los puertos de


entrada/salida es una solucin perfecta para las distancias cortas - hasta varios metros. No
obstante, en otros casos cuando es necesario establecer comunicacin entre dos dispositivos
a largas distancias no es posible utilizar la conexin paralela. En vez de eso, se utiliza la
conexin en serie.

Hoy en da, la mayora de los Microcontroladores llevan incorporados varios sistemas diferentes
para la comunicacin en serie, como un equipo estndar. Cul de estos sistemas se utilizar en
un caso concreto, depende de muchos factores, de los que ms importantes son:

Con cuntos dispositivos el microcontrolador tiene que intercambiar los datos?


Cul es la velocidad del intercambio de datos obligatoria?
Cul es la distancia entre los dispositivos?
Es necesario transmitir y recibir los datos simultneamente?

Figura #.

Una de las cosas ms importantes en cuanto a la comunicacin en serie es el Protocolo que


debe ser estrictamente observado. Es un conjunto de reglas que se aplican obligatoriamente
para que los dispositivos puedan interpretar correctamente los datos que intercambian
mutuamente. Afortunadamente, los Microcontroladores se encargan de eso automticamente,
as que el trabajo de programador/usuario es reducido a la escritura y lectura de datos.
Los sistemas de comunicacin serial ms utilizados son:
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

I2C (INTER INTEGRATED CIRCUIT) - CIRCUITO INTER-INTEGRADO

Circuito inter-integrado es un sistema para el intercambio de datos serial entre los


Microcontroladores y los circuitos integrados especializados de generacin. Se utiliza cuando
la distancia entre ellos es corta (el receptor y el transmisor estn normalmente en la misma
placa de circuito impreso). La conexin se establece por medio de dos lneas - una se utiliza
para transmitir los datos, mientras que la otra se utiliza para la sincronizacin (la seal de reloj).
Como se muestra en la figura, un dispositivo es siempre el principal (master - maestro), el que
realiza el direccionamiento de un chip subordinado (slave - esclavo) antes de que se inicie la
comunicacin. De esta manera un microcontrolador puede comunicarse con 112 dispositivos
diferentes. La velocidad de transmisin serial es normalmente 100 Kb/seg (el modo estndar)
o 10 Kb/seg (modo de velocidad de transmisin baja). Recientemente han aparecido los
sistemas con la velocidad de transmisin serial 3.4 Mb/sec. La distancia entre los dispositivos
que se comunican por el bus I2C est limitada a unos metros.

Figura #.

SPI (SERIAL PERIPHERAL INTERFACE BUS) - BUS SERIAL DE INTERFAZ DE


PERIFRICOS

Un bus serial de interfaz de perifricos es un sistema para la comunicacin serial que utiliza
hasta cuatro lneas (normalmente solo son necesarias tres) - para recibir los datos, para
transmitir los datos, para sincronizar y (opcional) para seleccionar el dispositivo con el que se
comunica. Esto es la conexin full duplex, lo que significa que los datos se envan y se reciben
simultneamente.

La velocidad de transmisin mxima es mayor que en el sistema de conexin I2C.

Figura #.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

UART (UNIVERSAL ASYNCHRONOUS RECEIVER/TRANSMITTER) - TRANSMISOR-


RECEPTOR ASNCRONO UNIVERSAL

Este tipo de conexin es asncrona, lo que significa que no se utiliza una lnea especial para
transmitir la seal de reloj. En algunas aplicaciones este rasgo es crucial (por ejemplo, en
mandar datos a distancia por RF o por luz infrarroja). Puesto que se utiliza slo una lnea de
comunicacin, tanto el receptor como el transmisor reciben y envan los datos a velocidad
misma que ha sido predefinida para mantener la sincronizacin necesaria. Esto es una manera
simple de transmitir datos, puesto que bsicamente representa una conversin de datos de 8
bits de paralelo a serial. La velocidad de transmisin no es alta, es hasta 1 Mbit/sec.

1.2.6 Temporizador

El oscilador del microcontrolador utiliza cristal de cuarzo para su funcionamiento. Aunque no se


trata de la solucin ms simple, hay muchas razones para utilizarlo. La frecuencia del oscilador
es definida con precisin y muy estable, as que siempre genera los pulsos del mismo ancho,
lo que los hace perfectos para medicin de tiempo. Tales osciladores se utilizan en los relojes
de cuarzo. Si es necesario medir el tiempo transcurrido entre dos eventos, basta con contar los
pulsos generados por este oscilador. Esto es exactamente lo que hace el temporizador.

Figura #.

Fuente:

La mayora de los programas utiliza estos cronmetros electrnicos en miniatura. Generalmente


son registros SFR de 8 o 16 bits cuyo contenido se aumenta automticamente con cada pulso.
Una vez que se llena el registro, se genera una interrupcin!
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Si el temporizador utiliza el oscilador de cuarzo interno para su funcionamiento, es posible
medir el tiempo entre dos eventos (el valor de registro en el momento de iniciar la medicin es
T1, en el momento de finalizar la medicin es T2, el tiempo transcurrido es igual al resultado
de la resta T2 - T1). Si los registros se aumentan con los pulsos que vienen de la fuente
externa, tal temporizador se convierte en un contador.

Esto es una explicacin simple de su funcionamiento. Es un poco ms complicado en prctica.

CMO FUNCIONAN LOS TEMPORIZADORES?

En prctica, los pulsos generados por el oscilador de cuarzo son llevados al circuito una vez
por cada ciclo de mquina directamente o por el pre-escalador, lo que aumenta el nmero en
el registro del temporizador. Si una instruccin (un ciclo de mquina) dura cuatro perodos del
oscilador de cuarzo, este nmero ser cambiado un milln de veces por segundo (cada
microsegundo) al incorporar al cuarzo que oscila con una frecuencia de 4 MHz.

Es fcil de medir los intervalos de tiempo cortos de la manera descrita anteriormente (hasta 256
microsegundos porque es el mayor nmero que un registro puede contener). Esta obvia
desventaja se puede superar de varias maneras: al utilizar el oscilador ms lento, por medio de
registros con ms bits, del pre-escalador o de la interrupcin. Las primeras dos soluciones
tienen algunas debilidades as que se recomienda utilizar el pre-escalador y/o la interrupcin.

UTILIZAR UN PREESCALADOR EN EL FUNCIONAMIENTO DEL TEMPORIZADOR

Un pre-escalador es un dispositivo electrnico utilizado para dividir la frecuencia por un factor


predeterminado. Esto quiere decir que se necesita llevar 1, 2, 4 o ms pulsos a su entrada para
generar un pulso a la salida. La mayora de los Microcontroladores disponen de uno o ms pre-
escaladores incorporados y su tasa de divisin puede ser cambiada dentro del programa. El
pre-escalador se utiliza cuando es necesario medir los perodos de tiempo ms largos. Si el
temporizador y el temporizador perro guardin comparten un pre-escalador, ste no se puede
utilizar por los dos simultneamente.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

UTILIZAR UNA INTERRUPCIN EN EL FUNCIONAMIENTO DEL TEMPORIZADOR

Si el registro del temporizador es de 8 bits, el mayor nmero que se puede escribir en l es 255
(en los registros de 16 bits es el nmero 65.535). Si se excede este nmero, el temporizador se
reinicia automticamente y el conteo comienza de nuevo en cero. Esto es denominado
desbordamiento o sobreflujo (overflow). Permitido por el programa, el desbordamiento puede
provocar una interrupcin, lo que abre completamente nuevas posibilidades. Por ejemplo, el
estado de registros utilizados para contar segundos, minutos o das puede ser implementado
en una rutina de interrupcin. El proceso entero (excepto la rutina de interrupcin) se lleva a
cabo internamente, lo que permite que los circuitos principales del microcontrolador funcionen
regularmente.

Fuente
La figura anterior describe el uso de una interrupcin en el funcionamiento del temporizador.
Al asignarle un pre-escalador al temporizador, se producen retrasos de duracin arbitraria con
mnima interferencia en la ejecucin del programa principal.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
CONTADORES

Si un temporizador se suministra por los pulsos ingresados por el pin de entrada en el


microcontrolador, se produce un contador. Evidentemente, es el mismo circuito electrnico. La
nica diferencia es que los pulsos para contar se ingresan por el pin de entrada y que su
duracin (anchura) no es definida. Por eso, no se pueden utilizar para medicin de tiempo,
sino que se utilizan para otros propsitos, por ejemplo: contar los productos en la cadena de
montaje, nmero de rotaciones del eje de un motor, pasajeros etc. (dependiendo del sensor
utilizado.

1.2.7 Perro guardin (Watch dog)

TEMPORIZADOR PERRO GUARDIN (WATCHDOG)

El perro guardin es un temporizador conectado a un oscilador RC completamente


independiente dentro del microcontrolador.

Si el perro guardin est habilitado, cada vez que cuenta hasta el mximo valor en el que ocurre
el desbordamiento del registro se genera una seal de reinicio del microcontrolador y la
ejecucin de programa inicia en la primera instruccin. El punto es evitar que eso ocurra al
utilizar el comando adecuado.

La idea se basa en el hecho de que cada programa se ejecuta en varios bucles, ms largos o
cortos. Si las instrucciones que reinician el temporizador perro guardin se colocan en lugares
estratgicos del programa, aparte los comandos que se ejecutan regularmente, el
funcionamiento del perro guardin no afectar a la ejecucin del programa. Si por cualquier
razn (ruidos elctricos frecuentes en la industria) el contador de programa se queda
atrapado dentro de un bucle infinito, el valor del registro continuar aumentado por el
temporizador perro guardin alcanzar el mximo valor, el registro se desbordar
y, aleluya! Ocurre el reinicio!
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

1.2.8 Convertidor analgico digital

El resultado de esta medicin es un nmero (el valor digital) utilizado y procesado ms tarde
en el programa.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

1.4 Clasificacin y evolucin de los Microcontroladores.


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

El primer microprocesador fue el Intel 4004, producido en 1971. Se desarroll originalmente


para una calculadora, y resultaba revolucionario para su poca. . El primer microprocesador
realmente diseado para uso general, desarrollado en 1974, fue el Intel 8080 de 8 bits, que
contena 4.500 transistores y poda ejecutar 200.000 instrucciones por segundo.

CLASIFICACION DE LOS MICROCONTROLADORES

2.2.1. Clasificacin de los Microcontroladores.

Teniendo en cuenta que existen ms de 50 fabricantes de Microcontroladores en el mundo, la


clasificacin de los Microcontroladores parece realmente difcil, ya que puede hacerse de
infinidad de formas, atendiendo a multitud de criterios.

Tamao de los datos.


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Segn el tamao de los datos que procesa el microcontrolador se puede distinguir entre:

- Microcontroladores de 4 bits.
- Microcontroladores de 8 bits.
- Microcontroladores de 16 bits.
- Microcontroladores de 32 bits.
- Microcontroladores de 64 bits.

El ms representativo de esta clasificacin es el microcontrolador de 8 bits porque resulta el


ms flexible y eficaz para la mayora de los diseos tpicos. Aunque en los ltimos aos, los
Microcontroladores de 16 bits estn aumentado significativamente su cuota de mercado.

Fig 2.3. Distribucin del mercado mundial en el ao 1999.

FAMILIA DE LOS MICROCONTROLADORES

En la actualidad se emplean cada vez ms debido a:


# Velocidad
# Precio
# Facilidad de uso
# Informacin y herramientas de apoyo.
Gamas
# PIC12C5X, gama baja o clsica ( palabra de programa de 12 bits).
# PIC16CXXX, gama media (palabra de programa de 14 bits).
# PIC17CXXX, PIC18XXX, gama alta (palabra de programa de 16 bits)

Resol
RO RA Frecu
Entr ucin Tempori Sali
M M Pi encia Comun
ada del Compa zadores das Otro
Familia [Kb [by ne de icacin
s conv radores de 8/16 PW s
ytes tes s reloj. serial
A/D ertido bits M
] ] [MHz]
r A/D
Arquitectura de la gama baja de 8 bits, palabra de instruccin de 12 bits
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
0.3
16
PIC10F 75 - 6-
- 4-8 0-2 8 0-1 1x8 - - -
XXX 0.7 8
24
5
0.7 25 EEP
PIC12F
5- - 8 4-8 0-3 8 0-1 1x8 - - RO
XXX
1.5 38 M
25
0.7 14 EEP
PIC16F -
5- - 20 0-3 8 0-2 1x8 - - RO
XXX 13
3 44 M
4
18 Vdd
PIC16H
1.5 25 - 20 - - - 1x8 - - =
VXXX
20 15V
Arquitectura de la gama media de 8 bits, palabra de instruccin de 14 bits
64
1.7 EEP
PIC12F - 1-2x8 0-
5- 8 20 0-4 10 1 - RO
XXX 12 1 x 16 1
3.5 M
8
PIC12H 1.7 1-2x8 0-
64 8 20 0-4 10 1 - -
VXXX 5 1 x 16 1
64
1.7 14 USAR
PIC16F - 0- 8 or 1-2x8 0-
5- - 20 0-2 T I2C -
XXX 36 13 10 1 x 16 3
14 64 SPI
8
64
1.7 14 USAR
PIC16H - 0- 2x81x
5- - 20 10 2 T I2C - -
VXXX 12 12 16
3.5 20 SPI
8
Arquitectura de la gama alta de 8 bits, palabra de instruccin de 16 bits
USB2.
0
25
18 0-2x8 CAN2.
PIC18F 4- 6- 32 - 4- 10 or 0-
- 0-3 2-3x 0 -
XXX 128 39 48 16 12 5
80 16 USAR
36
T I2C
SPI
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
USB2.
10 0
28
24 0-2x8 USAR
PIC18F 8- - 40 - 10 - 2-
- 10 2 2-3x T -
XXJXX 128 10 48 16 5
39 16 Ethern
0
36 et I2C
SPI
76
28 USAR
PIC18F 8- 8- 10 - 1x83x
- 64 10 2 T I2C 2 -
XXKXX 64 39 13 16
44 SPI
36

Todos los Microcontroladores PIC utilizan una arquitectura Harvard, lo que quiere decir que su
memoria de programa est conectada a la CPU por ms de 8 lneas. Hay Microcontroladores
de 12, 14 y 16 bits, dependiendo de la anchura del bus. La tabla anterior muestra las
caractersticas principales de estas tres categoras.
Como se puede ver en la tabla de la pgina anterior, salvo los monstruos de 16 bits PIC
24FXXX y PIC 24HXXX - todos los Microcontroladores tienen la arquitectura Harvard de 8 bits
y pertenecen a una de las tres grandes grupos. Por eso, dependiendo del tamao de palabra
de programa existen la primera, la segunda y la tercera categora de Microcontroladores, es
decir Microcontroladores de 12, 14 o 16 bits. Puesto que disponen del ncleo similar de 8 bits,
todos utilizan el mismo juego de instrucciones y el esqueleto bsico de hardware conectado
a ms o menos unidades perifricas.

1.5 Arquitectura del microcontrolador PIC.


Todos los Microcontroladores actuales utilizan uno de dos modelos bsicos de arquitectura
denominados Harvard y von-Neumann.
Son dos maneras diferentes del intercambio de datos entre la CPU y la memoria.
Arquitectura de von-Neumann

Los Microcontroladores que utilizan la arquitectura von- Neumann disponen de un solo bloque
de memoria y de un bus de datos de 8 bits. Como todos los datos se intercambian por medio
de estas 8 lneas, este bus est sobrecargado, y la comunicacin por si misma es muy lenta e
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
ineficaz. La CPU puede leer una instruccin o leer/escribir datos de/en la memoria. Los dos
procesos no pueden ocurrir a la vez puesto que las instrucciones y los datos utilizan el mismo
bus. Por ejemplo, si alguna lnea de programa dice que el registro de la memoria RAM
llamado SUM debe ser aumentado por uno (instruccin: incf SUMA), el microcontrolador
har lo siguiente:
1. Leer la parte de la instruccin de programa que especifica QU es lo que debe realizar
(en este caso es la instruccin para incrementar incf)
2. Seguir leyendo la misma instruccin que especifica sobre CUL dato lo debe realizar (en
este caso es el contenido del registro SUMA)
3. Despus de haber sido incrementado, el contenido de este registro se debe escribir en el
registro del que fue ledo (direccin del registro SUMA)
El mismo bus de datos se utiliza para todas estas operaciones intermedias.
ARQUITECTURA DE HARVARD

Los Microcontroladores que utilizan esta arquitectura disponen de dos buses de datos
diferentes. Uno es de 8 bits de ancho y conecta la CPU con la memoria RAM. El otro consiste
en varias lneas (12, 14 o 16) y conecta a la CPU y la memoria ROM. Por consiguiente, la
CPU puede leer las instrucciones y realizar el acceso a la memoria de datos a la vez. Puesto
que todos los registros de la memoria RAM son de 8 bits de ancho, todos los datos dentro del
microcontrolador que se intercambian son de la misma anchura. Durante el proceso de la
escritura de programa, slo se manejan los datos de 8 bits. En otras palabras, todo lo que
usted podr cambiar en el programa y a lo que podr afectar ser de 8 bits de ancho. Todos
los programas escritos para estos Microcontroladores sern almacenados en la memoria
ROM interna del microcontrolador despus de haber sido compilados a cdigo mquina. No
obstante, estas localidades de memoria ROM no tienen 8, sino 12, 14 o 16 bits. 4, 6 o 8 bits
adicionales representan una instruccin que especifica a la CPU qu hacer con los datos de 8
bits.
Las ventajas de este diseo son las siguientes:
Todos los datos en el programa son de un byte (8 bits) de ancho. Como un bus de
datos utilizado para lectura de programa tiene unas lneas ms (12, 14 o 16), tanto la
instruccin como el dato se pueden leer simultneamente al utilizar estos bits
adicionales. Por eso, todas las instrucciones se ejecutan en un ciclo salvo las
instrucciones de salto que son de dos ciclos.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
El hecho de que un programa (la ROM) y los datos temporales (la RAM) estn
separados, permite a la CPU poder ejecutar dos instrucciones simultneamente. Dicho
de manera sencilla, mientras que se realiza la lectura o escritura de la RAM (que marca
el fin de una instruccin), la siguiente instruccin se lee por medio de otro bus.
En los Microcontroladores que utilizan la arquitectura de von-Neumann, nunca se sabe
cunta memoria ocupar algn programa. Generalmente, la mayora de las
instrucciones de programa ocupan dos localidades de memoria (una contiene
informacin sobre QU se debe realizar, mientras que la otra contiene informa cin
sobre CUL dato se debe realizar). Sin embargo, esto no es una frmula rgida, sino el
caso ms frecuente. En los Microcontroladores que utilizan una arquitectura Harvard, el
bus de la palabra de programa es ms ancho que un byte, lo que permite que cada
palabra de programa est compuesto por una instruccin y un dato. En otras palabras,
una localidad de memoria - una instruccin de programa.

La memoria en los Microcontroladores

1.6 Formato de instrucciones del cdigo fuente.


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

El formato de instrucciones del cdigo fuente se basan en el lenguaje C18 el cual es una
derivacin del lenguaje C convencional,

Las instrucciones ms utilizadas son:

1.7 Instrucciones de transferencia y carga de datos, operaciones aritmticas y lgicas.


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Microchip MPLAB C18.

Entorno de programacin MPLAB IDE.

Ensamblador, enlazador, gestin de proyectos, depurador y simulador


Gratuito, se puede descargar de www.microchip.com

Compilador MPLAB C18

Compilador cruzado de lenguaje C para Microcontroladores PIC18


Sigue la norma ANSI C, salvo en particularidades de los Microcontroladores
Libreras para comunicaciones SPI, I2C, UART, USART, generacin PWM, cadena de
caracteres y funciones matemticas de coma flotante
Maneja nmeros reales de 32 bits (float y double)
Versin demo de 60 das, descargable de www.microchip.com

ndice Instalacin Creacin de un proyecto 1 Ejemplo. Control de un led mediante un pulsador.


(Definicin de operadores, estructuras, y control de bits de registros) 2 Ejemplo. Led titilando
(Definicin de Variables, librera de Demoras) 3 Ejemplo. Led secuenciales. 4 Ejemplo. Control
Display 7 Segmentos (Definicin de Arreglos de variables) 5 Ejemplo. Control de Varios Display
de 7 Segmentos por multiplexin (Declaracin y definicion de funciones) 6 Ejemplo. Control
LCD 7 Ejemplo. Conversin analgica/digital. Manejo de interrupciones. 8 Ejemplo.
Comunicacin Serial RS232 Modificacin de una librera, Cambiando el puerto de Control de
LCD Control de Teclado Matricial, Interrupcin por RB4-RB7 Creacin de una librera, DS1302
Reloj/Calendario con DS1302 y LCD, Interrupcin por desbordamiento Timer0 Comunicacin
I2C, primer ejemplo Lectura/escritura Aleatorias Comunicacin I2C, segundo ejemplo
Lectura/Escritura secuenciales

Instalacin

Se debe bajar directamente desde Microchip, hay disponible una versin gratuita para
estudiantes que es un demo de 60 das. Tambin para poder descargarlo es necesario
registrarse.

Una vez descargado ejecutar el instalador MPLAB-C18-Evaluation-v3_30 versin actualmente


disponible. Para a instalacin seguimos los siguientes pasos:
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Creacin de un nuevo proyecto.

Project Project Wizard


Nos aparecer la siguiente pantalla
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Nos aseguramos que todas las direcciones son correctas.


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

File - new

Escribir el cdigo

File Guardar, y guardar el archivo con extencion .c ejemplo: Ejemplo3.c


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Si el proceso qued bien el cdigo debe tomar colores en las palabras propias del lenguaje
c18.

Para Compilar el archivo es necesario adherirlo el cdigo creado al proyecto, dando click
derecho en la carpeta Source Files Add Files y elegir el archivo guardado con extensin .c.

Ahora si se puede compilar el cdigo, para esto se debe utilizar en la barra de tareas el icono

las teclas CTROL+F10.

La compilacin solo revisa que la parte gramatical del cdigo se encuentre bien escrita, esta no
indica errores de lo que debe o no hacer el cdigo.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Configuramos los subdirectorios de trabajo: Project->Build options -> Project Seleccionamos


ubicacin de ficheros de declaraciones, bibliotecas y script de enlazado.

Con todo esto configurado ya podemos empezar a desarrollar nuestro cdigo.

Introduccin al C18:

La idea es ir adquiriendo conceptos a medida que los utilizaremos en el desarrollo de los


ejemplos, de esta manera lo que se presenta tericamente lo asociamos inmediatamente con
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
la prctica. Aunque claro est que el lenguaje es muy amplio y no se puede hacer ejemplos de
cada concepto.

Para cualquier desarrollo es importante leer el datasheet del PIC a utilizar. En mi caso voy a
utilizar el PIC18F4550 y aqu pueden encontrar una descripcin en espaol del mismo.

Creando el cdigo:

Primer que nada debemos incluir las libreras que se van a utilizar en el proyecto, la librera que
siempre incluiremos ser la del PIC a usar, la cual tiene las direcciones de los registros del
mismo.

Cdigo: (c)

#include <PIC18F4550.h>

Luego viene la configuracin de los fuses del microcontrolador. sea configuracin de oscilador,
watch-dog, Brown-out reset, power-on reset, proteccin del cdigo, etc. Esto depende del
microcontrolador que se utilice: La sintaxis seria:

#pragma config Nombre del fuse=estado.

Para esto es muy til la ayuda que trae C18, recomiendo mirarla:
C:\MCC18\doc\ hlpPIC18ConfigSet

Definicin de variables globales, son las que se utilizaran en el programa principal y funciones
del proyecto.

Cdigo: (c)

int variableA, variableB

Ahora viene el cdigo de nuestro programa:

Cdigo: (c)

main{ }

Primer ejemplo, control de leds con un pulsador.

Para este sencillo ejemplo vamos a necesitar definir operadores y estructuras de control:

Operadores:

Aqu definiremos todos los operadores utilizados por C18.-


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Operadores de Comparacin: Estos operadores se encargan de comparar dos condiciones de
una expresin:

Operadores aritmticos: Se utilizan para realizar clculos matemticos:

Operadores lgicos: Son los encargados de producir resultados lgicos del tipo TRUE o FALSE

Operadores bitwise: Son para modificar los bits de una variable:

Estructuras:

Estructura if:

Esta estructura se utiliza para ejecutar instrucciones en forma condicional, de acuerdo con la
evaluacin de la expresin. Seria si una condicin es dada entonces accin. Cdigo: (c)
if(condicion){
//Accion
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
}

Estructura if-else

En este caso se agrega la instruccin else. Ahora se evala una condicin original, si es
verdadera, se ejecuta y sino no lo es, se ejecuta el bloque debajo de else.
Cdigo: (c)
if(condicion){
//Accin
else{
//Accion }
}

Estructura while

Ejecuta un conjunto de instrucciones mientras una condicin sea verdadera. La principal


caracterstica de esta estructura es que, antes de comenzar el bucle, verifica la condicin, por
lo que es posible que el bucle no llegue a ejecutarse.
Cdigo: (c)
while(condicion){
// Sentencias
}

Estructura do-while

Es parecida a un while solo que la condicin se evala al final, por lo que el bucle se ejecutara
por lo menos una vez.
Cdigo: (c)
do {
// Sentencias
} while (condicion);

Estructura For:

Esta estructura se usa para ejecutar un bloque de cdigo cierto nmero de veces. Posee un
valor de inicio, un valor final y un valor de incremento.
Cdigo: (c)
for(valor inicial; valor final; valor de incremento){
//Sentencias
}

Estructura switch.
Esta estructura permite ejecutar un bloque de cdigo de acuerdo con el valor de una variable o
expresin:

Cdigo: (c)
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
switch(Variable){

Case 0x01:
//Sentencias.- Break;

Case 0x02:
//Sentencias.- Break;

Default:
//Sentencias.- Break;
}

Accediendo a los bits de un registro: Para acceder individualmente a los bits de un registro se
escribe la siguiente sentencia:

Registrobits.bit

PORTBbits.RB0

INSTRUCCIONES EJEMPLO DESCRIPCIN


PORT if ( PORTD==0x00).. Se utiliza para preguntar por es
estado del puerto
LAT LATD=0XFF; Se utiliza para asignar el
estado a un puerto
TRIS TRISA=0X0F Se utiliza para configurar un
puerto como entrada o como
salida.

Ejemplo 1: Encender 4 leds del puerto A mientras se mantenga accionado el pulsador.

Hardware
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Cdigo: (c)

/**************Espacio para libreras*******************/

#include <p18f4550.h>

/***********Configuracin de fuses o pragma**************/

#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 1


#pragma config FOSC = HSPLL_HS, FCMEN = OFF,IESO = OFF
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config VREGEN = OFF, WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON, WRT3 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON, EBTR3 = ON
#pragma config EBTRB = ON

/*****Escacio para Declaracion de Variables Globales******/

/***********Espacio Para Funciones*************/

/************Aqu se escribe el Cdigo***********/

void main(void){
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

ADCON1=0x0F; //Todos entrada/salida digitales.


TRISA=0x00; //Todos como salida
TRISD=0xFF; //Todos como entrada
LATB=0x00; //Leds Apagados

while(1){ // ciclo en infinito

if(PORTDbits.RD0==1){ // testeamos RA0.


LATA=0x00; // Si esta en 1 Apagamos leds
}
else{
LATA=0xFF; // Si esta en 0 Encendemos leds.
}
}
}

Variables

Modificadores de las variables:

Mplab C18 utiliza los modificadores establecidos por ANSI:

Auto: las variables declaradas fuera de las funciones son globales y las declaradas en la funcin
son locales. Si no se inicializan toman un valor indefinido.

Static: variables locales a una funcin, y sirven para retener el valor de la variable en llamadas
sucesivas a dicha funcin.

Extern: La variable declarada pertenece a otro mdulo, por lo que no es necesario reservar memoria
para ella.

Const: El contenido de la variable es fijo.


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Volatile: el contenido de la variable puede cambiar.

Register: La variable declarada debe guardarse en un registro del microcontrolador.

Overlay: Se aplica a variables locales, hace un almacenamiento esttico y las inicializa en cada
llamada.

Ram: La variable se sita en la memoria de datos.

Rom: la variable se sita en la memoria del programa. Por lo general se usa para cadena de
caracteres contantes.

Especificacin de banco de memoria de datos:

Far: La variable puede ir en cualquier banco.

Near: la variable tiene que estar en el banco de acceso.

Demoras: Para utilizar demoras en nuestro cdigo debemos incluir la librera delays.h

En ella tenemos 4 funciones:

Delay10TCYx(i) -> 10.Tcy.i


Delay100TCYx(i) -> 100.Tcy.i
Delay1KTCYx(i) -> 1000.Tcy.i
Delay10KTCYx(i) -> 10000.Tcy.i

Donde i puede tomar valores entre 0 y 255.

Ejemplo 2: Leds Titileando

Hardware
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Cdigo: (c)

/**************Espacio para librerias*******************/


#include <p18f4550.h>

/***********Cofiguracion de fuses o pragma**************/

#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 1


#pragma config FOSC = HSPLL_HS, FCMEN = OFF,IESO = OFF
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config VREGEN = OFF, WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON, WRT3 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON, EBTR3 = ON
#pragma config EBTRB = ON

/*****Espacio para Declaracin de Variables Globales******/

char i=0;

/***********Espacio Para Funciones*************/

/************Aqui se escribe el codigo***********/

void main(void){
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
ADCON1=0x0F;//Todos entrada/salida digitales.
TRISA=0x00; //Todos como salida
TRISD=0xFF; //Todos como entrada
LATB=0x00; //leds apagados

while(1){
if(PORTDbits.RD0==1){ // testeamos RA0.
LATA=0x00; // Si esta en 1 Apagamos leds
}
else{
for(i=1;i<=10;++i){ //Titila 10 veces
LATA=0x0F;
Delay10KTCYx(100); //Demora 200ms
LATA=0x00;
Delay10KTCYx(100); //Demora 200ms }.
}
}
}
}

Ejemplo3: Leds secuenciales:

Objetivo: Al accionar el pulsador se realiza una secuencia de leds como se muestra en la figura:
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Cdigo: (c)

/**************Espacio para librerias*******************/

#include <p18f4550.h>

/***********Cofiguracion de fuses o pragma**************/

#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 1


#pragma config FOSC = HSPLL_HS, FCMEN = OFF,IESO = OFF
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config VREGEN = OFF, WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON, WRT3 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON, EBTR3 = ON
#pragma config EBTRB = ON

/*****Escacio para Declaracion de Variables Globales******/

char i=0;

/***********Espacio Para Funciones*************/

/************Aqu se escribe el cdigo***********/

void main(void){
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

ADCON1=0x0F;//Todos entrada/salida digitales.


TRISA=0x00; //Todos como salida
TRISD=0xFF; //Todos como entrada
LATB=0x00; //leds apagados

while(1){
if(PORTDbits.RD0==1){ // testeamos RA0.
LATA=0x00; // Si esta en 1 Apagamos leds
}
else{
LATA=0x01;
for(i=1;i<=4;++i){
Delay10KTCYx(30);
LATA<<=1;
}
}
}
}

Arreglos de Variables
Nos permite trabajar con un conjunto de variables y acceder a cada una mediante un ndice nico
que lo identifica. Todos los valores que contienen deben ser del mismo tipo.

Cdigo: (c)
unsigned char Vector[5];
unsigned char Matriz[3][3]; . . .
//Cargamos vector y matriz:
Vector[0]=156;
Matriz[1][1]=85;

//Leemos vector y matriz:


PORTB=Vector[4];
PORTB=Matriz[0][0];
En la declaracin se pueden pre cargar los valores de la siguiente forma:

Cdigo: (c)

unsigned char
Vector[3]={1,0x10,0b000101}
unsigned char
Matriz[3][3]={1,2,3,4,5,6,7,8,9,10};

Ejemplo4: Control de Display 7 segmentos


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Cdigo: (c)

/**************Espacio para librerias*******************/


#include <p18f4550.h>
#include <delays.h>

/***********Cofiguracion de fuses o pragma**************/

#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 1


#pragma config FOSC = HSPLL_HS, FCMEN = OFF,IESO = OFF
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config VREGEN = OFF, WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON, WRT3 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON, EBTR3 = ON
#pragma config EBTRB = ON

/*****Escacio para Declaracion de Variables Y Vectores ******/

unsigned char i; //Para controlar vizualizacin del Display


unsigned char Display7Seg[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F};

/***********Espacio Para Funciones*************/


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

/************Aqu se escribe el cdigo***********/

void main(void){

ADCON1=0x0F;//Todos entrada/salida digitales.-


TRISA=0xFF; //Todos como entrada.-
TRISB=0X00; //Todos como salida.- PORTB=0x3F; //Comienza en cero.- i=0; while(1){

if(PORTDbits.RD0==0 & PORTDbits.RD1==0){// Si se presionan los 2 a la vez se resetea.-


i=0;
LATB=Display7Seg[i];
Delay10KTCYx(250);
}

else if(PORTDbits.RD0==0){// Se incrementa cuenta.-


++i;
if(i==10){i=0;} //Volvemos a 0.-
LATB=Display7Seg[i];
Delay10KTCYx(250);
}
else if(PORTDbits.RD1==0){// Se decrementa cuenta.-
--i;
if(i==255){i=9;} //Volvemos a 9.-
LATB=Display7Seg[i];
Delay10KTCYx(250);
}
}

Declaracin y definicin de funciones.

La declaracin da a conocer la funcin al compilador, a partir de su declaracin ya se pueden realizar


invocaciones a las mismas. La declaracin de una funcin se conoce tambin como prototipo de la
funcin. En el prototipo de una funcin se tienen que especificar los parmetros de la funcin, as
como el tipo de dato que devuelve.

La definicin estar en algn otro punto del programa, aqu se especifican las instrucciones que
forman parte de la misma y que se utilizan para llevar a cabo la tarea especfica de la funcin.
Sintaxis:
Cdigo: (c)

Tipo de retorno Nombre(Lista de parmetros)

Tipo de retorno: Representa el tipo del valor que devuelve la funcin. Si no devuelve ninguno se
debe colocar void.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Nombre: indica el nombre que se le da a la funcin, se recomienda que este relacionado con la tarea
que llevar a cabo.

Lista de parmetros : se enlista el tipo de dato y el nombre de cada parmetro. En caso de utilizar
parmetros se deja el parntesis vacio o se incluye la palabra void.

Ejemplos:
Cdigo: (c)

unsigned int Suma(unsigned char A, unsigned char B){


unsigned int C;
C=A+B; return(C);
}

Cdigo: (c)
void Envio_Data(unsigned char A){
//Sentencia.-
}

Cdigo: (c)
void Muestras(void){
//Sentencias.-
}

Dos formas de incluir una funcin en nuestro cdigo:


Realizando la declaracin en el encabezado y despus la definicin en cualquier sector del
programa.

Ejemplo:
Cdigo: (c)

// Declaracion de la funcion

void Funcion (void);


.
.
.
void main(void){
.
.
.
// Llamo a la funcin. Funcion();
}

//Defincion de la funcion. (Puede estar en cualquier lugar del programa)


void Funcion(void){
// Sentencias
}
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Otra forma es no realizar la declaracin de la funcin y realizar directamente la definicin, pero esta
tiene que estar si o si antes de su invocacin.
Ejemplo:
Cdigo: (c)
//Definicin de la funcin

void Funcion(void){
// Sentencias }

void main(void){
.
.
.
// Llamo a la funcin.
Funcion();
}

Ejemplo 5: Control de varios display, multiplexacin de la seal.

Objetivo: Controlar 3 display de 7 segmentos visualizando el conteo automtico de 0 a 999.

Cdigo: (c)

/**************Espacio para librerias*******************/


#include <p18f4550.h>
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
#include <delays.h>

/***********Cofiguracion de fuses o pragma**************/

#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 1


#pragma config FOSC = HSPLL_HS, FCMEN = OFF,IESO = OFF
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config VREGEN = OFF, WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON, WRT3 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON, EBTR3 = ON
#pragma config EBTRB = ON

/*******Espacio para definiciones*************/

#define UnidadBit PORTAbits.RA0


#define DecenaBit PORTAbits.RA1
#define CentenaBit PORTAbits.RA2

/*****Escacio para Declaracion de Variables Y Vectores ******/

unsigned char i, Unidad, Decena, Centena;


unsigned char Display7Seg[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F};

/***********Espacio Para Funciones*************/

void Visualizacion (void){


for(i=1;i<=20;++i){
LATB=Display7Seg[Unidad];
UnidadBit=1; //Enciendo Display Unidad.-
Delay1KTCYx(5); //Demora de 5 ms (XT=4MHz)
UnidadBit=0;
LATB=Display7Seg[Decena];
DecenaBit=1;
Delay1KTCYx(5);
DecenaBit=0;
LATB=Display7Seg[Centena];
CentenaBit=1;
Delay1KTCYx(5);
CentenaBit=0; //Apago Display Centena.-
}
}
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
/************Aqu se escribe el cdigo***********/

void Visualizacion (void);

void main(void){
ADCON1=0x0F;//Todos entrada/salida digitales.-
TRISA=0xF0; //Todos como entrada.-
TRISB=0X00; //Todos como salida.-
PORTA=0x00;

Unidad=0;
Decena=0;
Centena=0;

while(1){
Visualizacion();
++Unidad;
if(Unidad==10){
Unidad=0;
++Decena;
if(Decena==10){
Decena=0;
++Centena;
}
}
}
}

Control de un LCD.

Para realizar el control de un LCD necesitamos crear la librera lcd4550.h y guardarla en la extensin
.h

Para crear la librera de es necesario tener en cuenta la tabla descrita abajo, donde indica de manera
fcil como se configura el Display LCD.
Para configurar la LCD es necesario que RS=0 y cuando deseo escribir algo en la pantalla el pin RS
= 1.

Crear este archivo y guardarlo como lcd4550.h

Librera.
Codigo : (c)

#ifndef __lcd4550_H // instruccin de creacin de librera


#define __lcd4550_H // instruccin de creacin de librera

/********* Definicin de pines***************/


MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

#define LCD_LINEA2 0xC0 // Direccin de memoria para la segunda lnea


#define lcd_rs LATEbits.LATE0
#define lcd_RW LATEbits.LATE1
#define lcd_enable LATEbits.LATE2
#define DATOS PORTD // puerto de salida de datos

/******definicion del registro de control (RS)******/


#define LCD_DATO 1 // para escribir en la pantalla
#define LCD_COMANDO 0 // para configurar el lcd

/*******Definicion de configuraciones del lcd*******/


#define LCD_CLEAR 0x01
#define LCD_HOME 0x02

// Opciones para el display


#define LCD_DISPLAY_OFF 0x08
#define LCD_DISPLAY_ON 0x0C
#define LCD_CURSOR_ON 0x0E
#define LCD_CURSOR_BLINK 0x0F

// Opciones epeciales del cursor


#define LCD_CURSOR_SHIFT_RIGHT 0x14
#define LCD_CURSOR_SHIFT_LEFT 0x10
#define LCD_DISPLAY_SHIFT_RIGHT 0x18
#define LCD_DISPLAY_SHIFT_LEFT 0x1C

// Configurar el hardware
#define LCD_DISPLAY_8_BITS 0x38 //0b00111000
#define LCD_DISPLAY_4_BITS 0x28 //0b00111000

/*******funciones para el manejo de los dealys*******/


void delay_ms (unsigned int retardo){
unsigned int k;
for(k=0;k<retardo;k++){
Delay1KTCYx(5); // retardo de 1ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (1ms * 20MHz) / 4
// Cycles = 5,000
}
}

void delay_us (unsigned int retardo)


{
unsigned int k;
for(k=0;k<retardo;k++){
Delay10TCYx( 5 );// retardo de 1us
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (1us * 20MHz) / 4
// Cycles = 5
}
}

/*******Funcion para enviar datos a la LCD***********/

void lcd_enviar(int dir, int valor)


{
if(dir == 0)
{
lcd_rs=0;
lcd_enable=1;
DATOS = valor; // configura el funcin set
delay_us(350);
lcd_enable=0;
delay_us(350);
}
else
{
lcd_rs=1;
lcd_enable=1;
DATOS = valor; // Escribir
delay_us(350);
lcd_enable=0;
delay_us(350);
}

}
/******inicializacion del LCD************/

void lcd_init(void)
{
int dir,valor;
dir=LCD_COMANDO; //para configurar la lcd
valor=LCD_DISPLAY_8_BITS; //0x38 Inicia el modulo a 8 bits
lcd_enviar(dir,valor);
delay_ms(1);
valor=LCD_CLEAR; //0x0c activa Display
lcd_enviar(dir,valor);
valor=LCD_HOME; //0x01 borra display
lcd_enviar(dir,valor);
valor=LCD_CURSOR_SHIFT_LEFT; //selecciona mensaje fijo
lcd_enviar(dir,valor);
// valor=0x05; // instruccion para decrementar el cursor
// lcd_enviar(dir,valor);
valor=0x0C;
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
lcd_enviar(dir,valor);
}

/*********Funcin para posicionamiento del cursor********/


void lcd_gotoxy( char x, char y) {
char dir;
if(y!=1)
dir=LCD_LINEA2; //0xC0
else
dir=0;
dir+=x-1;
lcd_enviar(LCD_COMANDO,0x80|dir);
}

#endif
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
Ejemplo: Control de un LCD.

Objetivo: Escribir un simple mensaje en un LCD.

Hardware

Codigo (c):

#include <p18f4550.h>
#include <lcd4550.h> // incluir la librera creada anteriormente

#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 1


#pragma config FOSC = HSPLL_HS, FCMEN = OFF,IESO = OFF
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config VREGEN = OFF, WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON, WRT3 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON, EBTR3 = ON
#pragma config EBTRB = ON

char const vector[10]="SALUDO";


char i=0;
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
void main (void){
TRISD = 0X00;
TRISE = 0X00;

while (1){
lcd_init();
lcd_gotoxy(8,1); // posiciona el cursor en la columna 8 fila 1.
for (i=0;i<=7;i++){
lcd_enviar (LCD_DATO,vector [i]);
delay_ms (500);
}
}
}

CONVERSOR ANLOGO DIGITAL


El Mdulo convertidor analgico a digital-(A/D) tiene 10 entradas para los dispositivos de 28 pines
y 13 para dispositivos de 40/44-pines.

Este mdulo permite la conversin de una seal anloga de entrada a un nmero digital de 10 bits
correspondiente.

Para su configuracin el mdulo tiene cinco registros:

(ADRESH) A / D Resultado de alta


(ADRESL) A / D Resultado de Baja
(ADCON0) A / D Registro de Control 0
(ADCON1) A / D Registro de Control 1
(ADCON2) A / D Registro de control 2

El registro ADCON0, muestra Registrarse 21-1, controla el funcionamiento del mdulo A/D. El
Registro ADCON1, muestra Registrarse 21-2, configura las funciones de los pines del puerto.
El registro ADCON2, muestra Registrarse 21-3, configura el reloj de A/D, fuente, tiempo de
adquisicin programada y justificacin.

Para realizar una conversin analgica a digital vamos a crear un programa que muestre el valor
en que se encuentra una resistencia variable (Potenciometro), en el Display LCD

Hardware
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Codigo (c):

/**************Espacio para librerias*******************/


#include <p18f4550.h>
#include <delays.h>
#include <lcd4550.h>

/***********Cofiguracion de fuses o pragma**************/

#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 1


#pragma config FOSC = HSPLL_HS, FCMEN = OFF,IESO = OFF
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config VREGEN = OFF, WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = ON
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON, WRT3 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON, EBTR3 = ON
#pragma config EBTRB = ON

/*****Espacio para Declaracin de Variables Globales******/


char i=0,n=0 ;
char const mens1[7]="ADC=";

unsigned int dato_analogo;


unsigned char bcd_cent=0,bcd_dec=0,bcd_unid=0,bcd_mil=0;

/***********Espacio Para Funciones*************/

void adc (void){


ADCON0 = 0b00000011; // Configurado el canal AN0, el estado del bit, y el enable.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
ADCON1 = 0b00001110; // Configura la fuente, y salidas analgicas
ADCON2 = 0b10011100; // Configura justificacin, tiempo de adquisicin, reloj.
}

int leer_adc (void)


{
PIR1bits.ADIF = 0; //make sure A/D Int not set (asegrese que no se establece la interrupcin
A/D)
ADCON0bits.GO = 1; //and begin A/D conv. (INICIA LA CONVERSION ANALOGO DIGITAL)
while(!PIR1bits.ADIF); //Wait for A/D convert complete (espere mientras se completa la conversion)
PIR1bits.ADIF = 0; //Clear A/D Interrupt Flag (limpiar la bandera del ADC)
return (ADRES);
}

void conver_bcd (unsigned int x){


bcd_cent=0,bcd_dec=0,bcd_unid=0,bcd_mil=0;
while(x>=1000){
x= x-1000;
++bcd_mil;
}
while(x>=100){
x= x-100;
++bcd_cent;
}
while(x>=10){
x= x-10;
++bcd_dec;
}
bcd_unid=x;
}

/************Aqu se escribe el cdigo***********/

void main (void){


TRISD = 0x00; // configura puerto D como salida
TRISE = 0x00;
TRISA = 0xFF;// configura puerto A como entrada
LATD = 0x00;

lcd_init(); // inicializar el LCD

lcd_gotoxy(1,1); // posicionar el cursor en el display LCD


for(n=0;n<4;n++){
lcd_enviar(LCD_DATO, mens1[n]); // enviar mensaje a la pantalla
}
adc();

while(1)
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
{
dato_analogo = leer_adc();
conver_bcd (dato_analogo);
lcd_gotoxy(6,1);
lcd_enviar(LCD_DATO, bcd_mil+0x30);
lcd_enviar(LCD_DATO, bcd_cent+0x30);
lcd_enviar(LCD_DATO, bcd_dec+0x30);
lcd_enviar(LCD_DATO, bcd_unid+0x30);
delay_ms(50);
}
}

Configuracin del PWM.

Los siguientes pasos se deben tomar cuando se configura el mdulo CCP para la operacin PWM:

1. Establezca el periodo PWM escribiendo al PR2 registrarse.


2. Ajuste el ciclo de trabajo del PWM escribiendo la CCPRxL en los bits<5:4> del registro
CCPxCON.
3. Hacer el pin CCPx una salida utilizando el TRIS apropiada.
4. Establecer el valor de preescalador del TMR2 y habilite el Timer2 escribiendo en el T2CON.
5. Configure el mdulo CCPx para la operacin PWM.

Hardware
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Codigo (c)

#include <p18f4550.h>
#include <delays.h>

#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 1


#pragma config FOSC = HSPLL_HS, FCMEN = OFF,IESO = OFF
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config VREGEN = OFF, WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = ON
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas
#pragma config CP0 = ON,CP1 = ON,CP2 = ON
#pragma config CPB = ON,CPD = ON
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON, WRT3 = ON
#pragma config WRTB = ON,WRTC = ON,WRTD = ON
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON, EBTR3 = ON
#pragma config EBTRB = ON

void activar_pwm (void){


PR2 = 200; // UN VALOR ENTRE 0 Y 255
CCPR1L= 100; // ESTAR ENTRE 0 Y 255
CCP1CON = 0x0F; //0b00001111;
T2CON = 0b00000111; // prescaler 16
}

void activar_pwm2 (void){


PR2 = 200; // UN VALOR ENTRE 0 Y 255
CCPR2L= 100; // ESTAR ENTRE 0 Y 255
CCP2CON = 0x0F; //0b00001111;
T2CON = 0b00000111; // prescaler 16
}

void main (void){


TRISC= 0X00; // conf out
TRISB= 0X00; // conf out
while(1)
{
activar_pwm();
Delay1KTCYx(10);
}
}

Taller aplicaciones reales

Problema 1

1. Disear un sistema para un parqueadero que cuenta con dos secciones una derecha y
una izquierda, cada una con espacio de 8 carros. con las siguientes caractersticas.

a. Indicar por medio de un display 7 segmentos los espacios libres totales del parqueadero.
b. Otro display dentro del parqueadero que indique los espacios libres en la zona derecha
c. Otro display dentro del parqueadero que indique los espacios libres en la zona izquierda.
d. Cada espacio libre en el parqueadero se debe indicar con una luz de color verde
encendida.
MICROCONTROLADORES
ING. Ramdhar Hadit Yusseff Vanegas

Problema 2.

1. La industria INDURCOL necesita un sistema para mejorar la temperatura en el rea de


caldera, la cual supera los 50 grados Celcius, lo que no garantiza un espacio cmodo
para su empleados. INDERCOL solicita realizar el sistema con las siguientes
caractersticas.
a. Un extractor debe llevar al ambiente todo el aire caliente.
b. La temperatura se debe mostrar en un Display 7 Segmentos.
c. La velocidad del extractor debe variar directamente proporcional con temperatura.
d. Se debe mantener un rango de temperatura entre 15 y 29 grados celcius, sabiendo que
la temperatura ambiente se encuentra en 12 grados celcius.

Problema 3.

2. La Clinica HOREVE necesita un sistema de incubadora donde se utilice un bombillo


amarillo como transmisor de luz y calor, con las siguientes condiciones:
a. La intensidad de luz no debe superar el 75% de su iluminacin total.
b. La temperatura debe estar en el rango de (20 a 25) Grados Celcius.
c. El sistema debe funcionar las 24 horas, sin para incluso en caso de fallas.

Problema 4. Foto celular


Problema 5. Indicador de modulo y numero de ficho.

Das könnte Ihnen auch gefallen