Está en la página 1de 66

Tema 8: “Microcontroladores”

Sistemas en Tiempo Real


Curso 2009 -2010
Segundo cuatrimestre 2010

José Antonio Pérez / Antonio Losada

Microcontroladores

– Introducción y definiciones, aplicaciones y mercado de los


microcontroladores.
– Arquitecturas básicas.
– Elementos que componen un microntrolador.
– Herramientas para el desarrollo de aplicaciones.
– Principales familias de microcontroladores.
– Microcontroladores PIC. Recursos internos.
– Tipos y repertorio de instrucciones. Ejemplos.
– Aplicaciones en sistemas de tiempo real.
Introducción. Definiciones (I)

• Sistema o planta: Conjunto de elementos o componentes


que actúan en común para obtener un objetivo determinado.
• Proceso: Conjunto de actividades que se esta controlando.
• Variable entrada: acción externa, o variable del sistema tal
que una modificación de su magnitud o condición puede
alterar el estado del sistema.
• Variable salida: respuesta del sistema o variable del mismo
cuya magnitud o condición se mide.
• Variable de referencia: valor que deseamos que adquiera
la salida del sistema, también se denomina objetivo del
control.

Introducción. Definiciones (II)

Perturbación: señal o evento que tiende a modificar el


valor de la salida de un sistema.
Sensor: elemento que permite captar el valor de la variable a
controlar en un determinado instante del proceso.
Actuador: elemento que actúa sobre el sistema modificando
el comportamiento de este y como consecuencia variando el valor
de la señal de salida.
Controlador: o regulador es el elemento que controla al
actuador en función de la variable de referencia u objetivo de
control.
Introducción. Control de lazo abierto

Control de lazo abierto: es aquel en el que la señal de


salida no influye sobre la acción del control, de este modo el
controlador no tiene en cuenta el valor de la señal de salida, ni se
compara esta con la variable de referencia, para decidir la
actuación en todo momento sobre el sistema.
(Regulación de tráfico mediante semáforos)

Introducción. Control de lazo cerrado

Sistema de control de lazo cerrado: es aquel en el


que existe una realimentación de la señal de salida o variable a
controlar. En este tipo de sistema se compara la variable de
referencia con la variable de entrada, y en función de la diferencia
entre ambas el controlador modifica la acción de control sobre los
actuadores del sistema.
(Regulación de tráfico mediante semáforos con control de
densidad de tráfico)
Controlador y Microcontrolador (I)

Recibe el nombre de controlador el dispositivo que se


emplea para el gobierno de uno o varios procesos.

Ejemplo el termostato de un sistema de calefacción.

Controlador y Microcontrolador (II)

• En un principio, los controladores electrónicos se


construían con circuitos integrados digitales ( puertas
lógicas).
• Posteriormente se construyeron con microprocesadores,
que eran auxiliados por memorias, unidades de E/S y todo
ello en un circuito impreso.
• Actualmente todos los elementos de un controlador se
han incluido en un único chip que recibe el nombre
microcontrolador.
Controlador y Microcontrolador (III)

• Microcontrolador: un chip o circuito integrado de alta escala de


integración que incorpora la mayor parte de los elementos que
configuran un controlador, cuya característica principal es su alto
nivel de especialización e integración.

Diferencias entre µP y µC (I)

Un microprocesador es un sistema abierto o genérico, porque su


configuración es variable de acuerdo con la aplicación a la que se
destine.
Diferencias entre µP y µC (II)
El microcontrolador es un sistema cerrado o específico. Todas las
partes del computador están contenidas en su interior y sólo salen al
exterior las líneas que gobiernan los periféricos.

Microcontrolador
Sistema cerrado (un solo chip que integra:)
La CPU
La Memoria de datos (RAM EEPROM)
La Memoria de programa (ROM, EPROM,
FLASH)
Unidades de entrada/salida.
Timmers y contadores. Opcionalmente también
pueden integrar:
Controladores de interrupciones.
Clock interno.
Comparadores
PWM
Convertidores A/D y D/A.
Generador de impulsos de reloj que sincronizan
el funcionamiento de todo el sistema.
Ventajas del uso de los Microcontroladores

 Aumento de prestaciones: un mayor control sobre un determinado


elemento representa una mejora considerable en el mismo.

 Aumento de la fiabilidad.
• Menor riesgo de averías
• Menos ajustes
 Disminución del tamaño del producto.
• Menor volumen
• Mano de obra
• Stocks
 Disminución del coste del producto.

Aplicaciones de los Microcontroladores

Los microcontroladores cada día están adquiriendo mayor presencia en nuestra


vida cotidiana sin que aparentemente notemos su presencia. Están presentes en
nuestro trabajo, en nuestra casa y en nuestra vida, en general

• Aparatos eletrodomésticos: microondas, frigoríficos, hornos, TV, reproductores y


grabadores de CD y DVD, equipos de sonido,teléfonos,...

• Equipos informáticos: impresoras, módems, unidades de disco,ratones, teclados,..

• Automóviles: mando de sistemas del automóvil (ABS, inyección,encendido,


climatizador..)

• Domótica: sistemas antirrobo, climatizadores,..

• Instrumentación: equipos de medida

• Robótica
Microcontroladores en el hogar

• Cocina •General
o Lavadora....................... 1 o Calefacción........... 1
o Horno.......................... 1 o Aire acondicionado.... 1
o Frigorífico.................... 1 o Video portero......... 2
o Lavavajillas................... 1 •Automóvil
• Salón o Frenos ABS............ 1
o TV............................. 2 o Climatización......... 1
o Mando a distancia.............. 1 o Alarma antirrobo...... 1
o Video.......................... 1 o Airbag................ 1
o DVD............................ 2 o Equipo música......... 1
o Receptor TDT................... 1 o Ordenador de viaje.... 1
o Teléfono fijo.................. 1 o Control motor......... 1
o Teléfono móvil................. 2 o Sistema seguridad..... 1
• Garaje •PC y periféricos.............. 6
o Puerta automática.............. 1
o Alarma robo/incendio/gas....... 3
• Ascensor............................ 2
TOTAL: . . . . . . . . . . 38

El Mercado de los Microcontroladores


• se venden cientos de microcontroladores por cada microprocesador
• existe una gran diversidad de microcontroladores: clasificación según tamaño de
la palabra, en microcontroladores de 4, 8, 16 ó 32 bits
• la totalidad de los microcontroladores actuales se fabrican con tecnología
CMOS.
¿Qué microcontrolador emplear?
Factores a considerar según la aplicación:

Elección de la familia (fabricante).


 Experiencia previa.
 Documentación.
 Herramientas de desarrollo y precio.
 Disponibilidad.

Elección de modelo concreto de µC


 Precio del microcontrolador.
 E/S y recursos internos.
 Consumo y velocidad
 Memoria
 Ancho de palabra
 Diseño de la placa

Arquitecturas básicas

• Von Neuman
• Harvard
Características (arquitectura) I

Todos los microcontroladores disponen de bloques básicos:


- Procesador (CPU),
- Memoria de datos y de instrucciones,
- Líneas de E/S,
- Oscilador de reloj
- Módulos controladores de periféricos (recursos especiales).

Sin embargo, cada fabricante intenta enfatizar los recursos más


idóneos para las aplicaciones a las que se destinan preferentemente.
En la actualidad la mayoría de uC incorporan CPU’s cuya
arquitectura es de tipo:
• Von Neumann
• Harvard

Características (arquitectura) II

El modelo básico de arquitectura empleada por los computadores


digitales fue establecida en 1945 por Von Neumann.
Este tipo de arquitectura consta de los siguientes bloques:
• Memoria principal
• Unidad aritmético-lógica
• Unidad de control
• Unidad de entrada/salida
Características (arquitectura) III
Arquitectura: Von Neumann

Características Arquitectura: Von Neumann

• Memoria principal: se emplea para almacenar datos o instrucciones. Se compone de


una serie de celdas a cada una de las cuales se accede a través de una dirección. Cada celda
está compuesta de un número de bits que nos da el ancho de palabra de la memoria.

• Unidad aritmético-lógica: permite realizar las operaciones elementales (AND, OR,


NAND, NOR, suma, resta, etc.). Estas operaciones las realiza con datos procedentes
normalmente de la memoria y los resultados parciales los almacena o no temporalmente en
algunos registros que suele tener la propia unidad aritmética. Las operaciones básicas que
puede realizar un computador se dividen en operaciones lógicas y operaciones aritméticas.
Ambos tipos de operaciones se realizan dentro de esta unidad.

• Unidad de control: se encarga de generar las señales necesarias para que todo el
computador ejecute las instrucciones leídas de la unidad de memoria. La unidad de control
es la encargada de leer de forma consecutiva las instrucciones (que se encuentran
almacenadas en la unidad de memoria), y generar las señales eléctricas necesarias para
proceder a la ejecución de cada una de estas instrucciones. Es la unidad que gobierna y
gestiona el comportamiento de un computador.
• La agrupación de algunos bloques funcionales del computador
como son la unidad de control, la unidad aritmético-lógica y los
registros recibe el nombre de unidad central de proceso (CPU).

Características Arquitectura: Von Neumann


• Unidad de entrada/salida: realiza la transferencia de información
con el exterior, con las unidades que se conocen con el nombre de
periféricos.
• Buses: caminos que unen los distintos bloques del computador y a
través de los cuales circulan los datos y las instrucciones.
Dependiendo del tipo de información que se trate podemos hablar de
diferentes caminos:
• Bus de datos: circulan los datos de las operaciones que se
van a efectuar.
• Bus de direcciones: circulan las direcciones de memoria
donde se encuentra almacenado algún tipo de información a la
que se desea acceder.
• Bus de control : circulan las señales de control generadas por
la unidad de control para la ejecución de las instrucciones.
Arquitectura VON NEUMANN

Arquitectura HARVARD

En la arquitectura Harvard, existen dos tipos de memorias, y


por lo tanto dos buses, que suelen ser de anchura diferente, es
posible acceder a ambas memorias al mismo tiempo, con lo cual
la velocidad del sistema aumenta.
Procesador segmentado (pipeline)

Ejemplo: Búsqueda 1 Ejecuta 1

1. MOVLW 55h Búsqueda 2 Ejecuta2

2 .MOVWF PORTB Búsqueda 3 Ejecuta 3

3. CALL SUB_1 Búsqueda 4 Salir

4. BSF PORTA,BIT3 Búsqueda SUB_1 Ejecuta SUB_1

Arquitecturas: Von Neumann vs. Harvard


La arquitectura de von Neumann se caracteriza por disponer de
una sola memoria principal donde se almacenan datos e instruc-
ciones de forma indistinta. A dicha memoria se accede a través de un
sistema de buses único (direcciones, datos y control).

La arquitectura Harvard dispone de dos memorias independien-


tes, una que contiene sólo instrucciones y otra, sólo datos. Ambas
disponen de sus respectivos sistemas de buses de acceso y es posible
realizar operaciones de acceso (lectura o escritura) simultáneamente
en ambas memorias.
Elementos que componen un
microntrolador.
• CPU
• Memoria
• E/S
• Recursos espaciales
Microcontroladores (CPU)
– CISC: Complex Instruction Set Computer
• Muchas instrucciones diferentes. Potentes y especializadas.
• Facilita la programación.
• Código muy compacto
• P.e.: Motorola
– RISC: Reduced Instruction Set Computer
• Pocas instrucciones muy sencillas.
• La sencillez de las instrucciones permite liberar área de silicio para
implementar características que mejoren las prestaciones.
• Chips más baratos, de menor consumo, de menos pines.
• P.e.: PIC
- SISC: Specific Instruction Set Computer
- Set de instrucciones reducido y específico adaptado a las
necesidades de la aplicación prevista.
La memoria en los microcontroladores

En los microcontroladores, existen dos tipos de memoria:


♣ Memoria de programa.
♣ Memoria de datos.

•Ambos tipos de memoria están integradas dentro del propio


chip.
•La memoria de programa, ha de ser no volátil, y su contenido
no sufre modificaciones durante la ejecución del mismo, es
del tipo ROM.
•La memoria de datos evoluciona según se ejecuta el
programa, ha de ser de tipo lectura–escritura es decir tipo
RAM.

Tipos de memoria no volátil en los microcontroladores (I)

• Los diferentes tipos de memoria no volátil que nos podemos


encontrar en un microcontrolador son:

• ROM CON MÁSCARA.


• OTP.
• EPROM.
• EEPROM.
• FLASH.
Tipos de memoria no volátil en los microcontroladores (II)

ROM CON MÁSCARA: Es una memoria no volátil de solo lectura, cuyo


contenido se graba durante la fabricación del chip. Es muy cara, por lo cual solo es
interesante cuando el numero de chips a fabricar es muy elevado. 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. Una vez
realizada esta función, no se puede modificar el programa.

EPROM: (Erasable Programmable Read Only Memory y), memoria no volátil,


que se puede grabar y borrar muchas veces. Se borra mediante luz ultravioleta y a
través de una ventana de cristal que posee el chip.

EEPROM: (Electrical Erasable Programmable Read Only Memory) Tanto la


grabación como el borrado se realiza mediante impulsos eléctricos. Estas
operaciones se pueden efectuar muchas veces.

FLASH: Es una memoria no volátil de bajo consumo, que se puede leer y escribir
en el propio circuito. Es mas veloz y de mayor densidad que la EEPROM .

Puertos de entrada y salida

Soportan la comunicación entre el chip y el mundo exterior


(actuadores y sensores).

Pueden ser digitales o analógicas.

Una misma patilla del chip, puede ser entrada o salida, tanto
analógica como digital.

Las patillas se suelen agrupar en puertos de 8 o 16 bits.

Protegidas contra sobreintensidades y sobretensiones.


Reloj principal

 Genera las señales que determinan la velocidad de trabajo


del uC.

 Suele estar integrado en el propio chip, solo necesita unos


pocos componentes externos.
 Cristales de cuarzo.
 Resonadores cerámicos.
 Circuitos R/C.
 Oscilador externo.

 Existen uC, que incluso integran toda la circuiteria


necesaria para generar la señal de reloj.

Recursos especiales

• Temporizadores o timers.
• Perro guardián o “watchdog”.
• Protección ante fallos de alimentación o “brownout”.
• Estado de bajo consumo o “sleep”.
• Convertidor A/D.
• Convertidor D/A.
• Control se anchura de pulsos PWM.
• Puertos de comunicación.
– UART
– USART
– USB
– I2C1
– CAN
– TCP/IP
Herramientas para el desarrollo de
aplicaciones.

Ciclo de vida del proyecto

Análisis y Implemen- Depuración


y prueba
Diseño tación

Idea o proyecto Edición


Requerimientos Compilación Simulación lógica
Papel y lápiz Ensamblado
Placa prototipo
Herramientas gráficas Corrección sintáctica
Herramientas de desarrollo
Las herramientas de desarrollo están formadas por un conjunto de programas e
interfaces que permiten realizar los proyectos de la forma más eficiente posible.

Ensamblador.
Compilador.
Simulador.
Placas de prototipo + ICD.
Emuladores en circuito + ICD.
Programador.

Lenguajes de programación

• Ensamblador (no portable)


– Permiten el uso eficiente de los recursos
– Programación costosa y casi imposible la modificación
• El código debe ser documentado, empleo de símbolos
• Programación estructurada
• Lenguajes de alto nivel (más o menos portable)
– Desarrollo más rápido, mantenimiento menos costoso
↓ Eficiencia
↑ Ocupación en memoria
– Ada --> Grandes sistemas
– C, PASCAL, PYTON, BASIC, JAVA( + portable, malo STR)
• Permiten el acceso a los recursos hardware (ansi C + registros +
asm)
Proceso de implementación
Entorno IDE
Editar código fuente (editor de textos)

*.c

MIKROC
Compilar código fuente (Mikroe compiler)

*.asm

MPASM, MIKROC
Ensamblar código objeto

*.dbg, .cof

*.hex

Fichero ejecutable MPLAB /PICKIT


+ PICKIT-2

Fichero Intel HEX (I)


• Consta de una serie de líneas que comienzan por el carácter ":" (dos puntos)
seguido por una cadena de valores en formato hexadecimal.
• Un fichero .HEX es un fichero de texto. Por lo tanto puede ser editado con
un notepad o similar.
• Todos números: Longitudes, direcciones y datos están expresados en
HEXADECIMAL mediante sus caracteres ASCII correspondientes.
Fichero Intel HEX (II)

Cálculo del checksum


:0400100000000000EC
04+00+10+00+00+00+00+00 = 14
C2= EB+1 = EC

Implementación y prueba
SIMULACIÓ
SIMULACIÓN/CORRECCIÓ
N/CORRECCIÓN
PROGRAMACIÓN
Ventajas del VSM
(Virtual System Modelling)

Con herramientas de diseño tradicional, la comprobación del sistema y el software del mismo no
se puede realizar hasta que se desarrolla un prototipo real (varias semanas de demora). Si además existe
algún error de diseño hardware se debe repetir la totalidad del proceso.

Usando VSM, tan pronto como se realice el diseño se puede testear el software y el
hardware, antes de implementar el prototipo.

Prototipos I
Prototipos II

Prototipos III (Picdem 2)


PIC DEM 2 Microchip VSM

Placas de simulación (programadores)


Principales familias de
microcontroladores.

Microcontroladores (Familias I)

• 8051 (Intel)
– Arquitectura Harvard (direccionamiento separado para datos e
instrucciones)
– Bus de 8 bits de datos
– Puede direccionar 64K de programa (los 4K ó 8K bajos pueden residir
en chip) y 64K de memoria de datos externa. 128 bytes de RAM
interna + registros especiales. E/S direccionadas en espacio propio.
• Bus de direcciones de 16 bits
– Gran potencia en instrucciones de bit
– Timers y puertos serie (no A/D ni PWM)
– 8048 serie baja
– 80c196 de 16 bits
– 80186: microcontrolador con un 8086 como núcleo (PC XT)
Microcontroladores (Familias II)

• 68HC11 (Motorola/ Freescale)


– Arquitectura Von Neuman (datos, programa, E/S, timers
comparten el mismo espacio de memoria)
– Bus de 8 bits de datos, 16 bits de direcciones
– Pueden tener: EEPROM/OTPROM, RAM, E/S digitales, timers,
A/D, PWM, acumuladores de pulsos, comunicación serie
síncrona y asíncrona
– Serie baja 68HC05
– 683xx: microcontrolador con un 68xxx como núcleo

Principales fabricantes de uC
Microcontroladores PIC

¿ Porqué PIC?
No porque esta familia sea mejor que otras, sino porque presentan diversas
características que los hacen especialmente interesantes:

- Facilidad de uso.
- Gran cantidad de información disponible en libros, revistas
e Internet.
- Herramientas de desarrollo muy asequibles.
-Bajo precio y fácil disponibilidad.
-Amplia oferta de distintos tipos microcontroladores de 8 16
y 32 bits (alrederor de 400).

En muchos casos la elección de una versión adecuada de PIC es la mejor


solución para resolver un problema. Otras familias de microcontroladores
son más eficaces en aplicaciones concretas, especialmente si predomina
una característica especial.
Microchip, datos históricos
• La compañía fue fundada en 1989, y es uno de los mayores fabricantes
de microcontroladores, de memorias y de dispositivos analógicos.
• 1990 Se fabricó la unidad número 1 millón.
• 1999 Se produce la unidad 1 billón.
• 2004 Las ventas alcanzan un valor de 800 Millones de dólares.
• 2005 Se producen la unidad número 4 billones.
• 2006 Las ventas alcanzan un valor de 1 billón de dólares.Y se fabrica
la unidad 5 Billones.
• 2007 El Mercado tiene un valor de 9 billones de dólares.
• 2008 Actualmente cuenta con más de 400 tipos de Microcontroladores
disponibles, de los cuales, 250 son de 8 bit. Se comercializa la unidad
6 billones desde que se inicio la producción en 1990.
Gamas de PIC’s
Gama alta

s
mejorada
bit PIC24 , (DsPIC)
16
75, (84) instrucciones,
hasta 16,(40)MIPS

PIC18 Gama alta


32 niveles de pila17 vectores de interrupción, 75
instruciones de 16 bits, 10 MIPS
its

PIC16*
Gama media
8b

8 niveles de pila, 4 vectores de interrrupción


35 instrucciones de 14 bits, 1 timer 8 bit y 2 de 16bit, hasta 5MIPS

PIC 10 , PIC 12* Gama básica


2 niveles de pila y 33 instrucciones de 12 bits, 1 timer de 8bits
Microcontroladores (Familias III)
• PIC (MicroChip)
– Arquitectura Harvard (direccionamiento separado para datos
e instrucciones)
• solapamiento de instrucciones [PIPELINE -> SEGMENTACIÓN]
(ejecución actual y búsqueda de la siguiente.)
• Estructura ortogonal.

Microcontroladores (Familias IV)

• PIC (MicroChip)
– Primer microcontrolador RISC
– 16Fxx línea más popular del fabricante
• 35 instrucciones
• 8 bits de datos
• 14 bits de instrucción (hasta 8K instrucciones)
• Pueden tener: EEPROM/OTPROM, RAM, E/S digitales,
timers, A/D, PWM, acumuladores de pulsos,
comunicación serie síncrona y asíncrona
Comparativa
Modelo 12C508 16F84A 16F88 16F877 18F6722
Mem. Bytes 768 1792 7168 14336 128K
Prog. Palabras 512x12 1024x14 4096x14 8192x14 64Kx16
Mem. Bytes EEP 0 64 256 256 1024
Datos Bytes RAM 25 68 368 368 3936
Conversión A/D No No 7(10bits) 8(10bits) 12(10bits)
Líneas de E/S 6 13 16 33 54
Comparador Analog No No 2 2 2
Temporizadores 1-8bits+ 1- 8bits 1-16bits+2 1-16bits+2 3-16bits+2
WTD +WDT 8bits+WDT 8bits+WDT 8bits+WDT

Nº de pin’s 8 18 18 40 64
PWM No No Si(10bits) Si Si
Frec. Max. 4 Mhz. 20Mhz. 20Mhz. 20Mhz. 40Mhz
Precio 2,04€/ 5,17€/ 3,81€/ 10,85€/ 23,75€/
(Volume pricing) 0,53$ 3,11$ 2,20$ 4,26$ 7,99$

Modo de conexionado del oscilador:

Oscilador XT Oscilador RC
C1=C2=22pF ó 33pF C1 de 20pF como mínimo
Cristal ? 4MHz (PIC16F84A-04) 5K? ? R1 ? 100K?
La memoria de programa
El espacio marcado como "Espacio de
Memoria de Usuario" es donde irá el
programa, desde la dirección 0000h hasta la
3FFh (3FFh en decimal es 1023, que mas la
dirección 0000h hace 1024 direcciones, es
decir, 1Kbyte).
"Reset Vector" es la primera dirección
(0000h) a la que se dirige el PIC al
encenderlo o al resetearlo y donde debe
estar siempre la primera instrucción.
"Vector de Interrupción"
Interrupci n" es la dirección
(0004h) a la que se dirige el PIC cuando se
produce una interrupción, esto es, un evento
que permite sacar al PIC de la ejecución
normal del programa para ejecutar una
subrutina de atención a la interrupción.
"PC" (Contador de Programa) es un registro
de 13 bits que apunta a la dirección de la
memoria de programa que contiene la
instrucción a ejecutar.
"Niveles de la pila de 1 a 8" son los niveles
de la pila, que se utiliza cuando se ejecutan
subrutinas.
La memoria de datos RAM
- La memoria RAM no sólo se usa para almacenar las
variables que puedan utilizarse en el programa, también se
utilizan una serie de registros para configurar y controlar el
PIC.

- La memoria esta dividida en dos bancos, el banco 0 y el


banco 1, para seleccionar un banco u otro se utiliza un bit
(RP0) del registro de estado (STATUS). Generalmente se
trabaja con el banco 0.
Cada banco se divide a su vez en dos áreas:
•- RFS (Registros de Funciones Especiales)
•- RGP (Registros de Propósito General)
El área RFS (Registros de Funciones Especiales) controla
el funcionamiento del dispositivo. Estos registros se
emplean para el control del funcionamiento de la CPU y de
los periféricos (direcciones desde la 00h hasta la 0Bh y
desde la 80h hasta la 8Bh).

-El área RGP (Registros de Propósito General) comprende


los registros que podemos utilizar como variables de trabajo
a partir de la dirección 0Ch hasta la 4Fh (68 bytes de
SRAM). Puede accederse directamente o bien
indirectamente haciendo uso del registro FSR.

- El área RGP así como algunos registros especiales son los


mismos en los dos bancos del mapa de memoria del PIC.
Microcontroladores PIC gama media
avanzados

RAM 16F84 RAM 16F877


Arquitectura PIC 16F877

Interrupciones
Interrupciones
Registro INTCON

Registro OPTION
Manejo de una interrupción
unsigned cnt;
void interrupt() {
cnt++; // Incrementar valor cnt
TMR0 = 96; //en cada interrupción
INTCON = 0x20; // Activar T0IE, borrar T0IF
}//~

void main() {
OPTION_REG = 0x84; // Preescaler a TMR0
TRISB = 0; // PORTB como salida
PORTB = 0xFF; // iniciar PORTB
TMR0 = 96;
INTCON = 0xA0; // Habilitar interupción TMR0
cnt = 0; // Resetear cnt
do {
if (cnt == 400) {
PORTB = ~PORTB; // Negar PORTB
cnt = 0; // Resetear cnt
}
} while(1);
}//~!

Cálculo de retardos con TMR0

T. total = 4 x Tosc x (256-TMR0)xPredivisor

Tosc = 1 / fclock
Tipos y repertorio de instruciones

• Repertorio de instrucciones reducido


(RISC), con tan solo 35 instrucciones
distintas.
• Cuatro tipos distintos de instrucciones,
orientadas a byte, orientadas a bit,
operación entre registros, de salto.
Formato de una instrucción (I)

Ejemplo: Addwf f,d (w + f → d )

Ejemplo: bcf f,b (Pone a 0 bit b de registro f )

Formato de una instrucción (II)

Ejemplo: andlw k (w AND k → w )


call k (k<= 2kb, 0..2047)
Aplicaciones en sistemas de tiempo
real.

Prácticas
• Entorno de programación
• E/S básicas
• Manejo de un display LCD
• Conversión A/D
• Interrupciones (*)
• Puerto serie
• Bus I2C1
Ejercicio nº 1 (flujo grama)
P ra c t ic a 0 1

-D e fin ir va ri a b l e s
-P a --> E n t ra d a
-P b --> S a l id a

L e e r P u e rt o A (R a 0 )

No Si
P 1 (R a 0 ) e s t a
puls ad o?

A pagar Led L1
E nc ender Led
(R b 0 )
L 1 (R b 0 )

Compilar

Explorador
de código

Ventana de edición

Configuración del proyecto

Resultado
Proceso de trabajo
• Ejecutar el compilador.
• Crear un proyecto nuevo, o abrir uno existente.
– Proyect -> new proyect.
• Configurar parámetros del proyecto.
– Nombre del proyecto, directorio de trabajo…
– Seleccionar el Microcontrolador.
– Elegir la frecuencia de trabajo del mismo.
– Activar bits de configuración.
• Solo activar WDT_OFF.
• Escribir el código fuente.
• Construir el proyecto (build) y comprobar que esta libre de
errores.
– En el subdir de trabajo se generan 4 nuevos ficheros: *.asm, *.lst, *.mcl y
*.hex
• El fichero *.hex generado es el ejecutable que emplearemos
para simular en proteus, y posteriormente grabarlo en el
microcontrolador.

Comandos entrada/salida (I)

TRISx Donde x = A, B, C D ó E
-Define un puerto o un pin como entrada o salida.
-Un 1 define el pin como entrada y un 0 como salida.
- Ejemplo: TRISA = 0xFF; TRISB = 129; TRISE = % 11110001;

PORTx Donde x = A, B, C D ó E
-Asigna un valor a un puerto.
-Ejemplo: PORTB = %10000111; PORTA = 0xF8; PORTC = ~PORTB

PORTx.Fy Donde x = A, B, C D ó E
PORTx.By e y = 0..7
-Asigna un valor binario a un pin.
-Ejemplo: PORTB.F2 =1; PORTA.B0 =0;
Comandos entrada/salida (II)

var = PORTx
-Lee el puerto x y lo asigna a var
-Ejemplo: temp = PORTB
- temp sera de tipo byte.

Var = PORTx.Fy
Var = PORTx.By
-Lee el pin y del puerto x y lo asigna a var.
-Ejemplo: temp = PORTA.F2;
temp = PORTA.B2;

Ejercicio 1
void main(){
TRISB = 0; // inicializamos el puerto B y el D como salida.
TRISD = 0; // 0 --> Salida, 1 --> entrada
PORTB = 0;
PORTD = 0;
do {
PORTB = 0xFF; // equivale a 255 todo el puerto a 1
PORTD = 0; // Sería correcto PORTB = 255; ó PORTB = % 11111111;
delay_ms(1000); // Retardo de 1 seg.
PORTB = 0;
PORTD = 0xFF;
delay_ms(1000);
} while(1);
}
Display alfanumérico LCD
Librería LCD (interface 4 bits) I
Variables globales :
LCD_D7: Data bit 7
LCD_D6: Data bit 6
Bits de configuración

LCD_D5: Data bit 5


LCD_D4: Data bit 4
LCD_RS: Register Select (data/instruction) signal pin
LCD_EN: Enable signal pin
LCD_D7_Direction: Direction of the Data 7 pin
LCD_D6_Direction: Direction of the Data 6 pin
LCD_D5_Direction: Direction of the Data 5 pin
LCD_D4_Direction: Direction of the Data 4 pin
LCD_RS_Direction: Direction of the Register Select pin
LCD_EN_Direction: Direction of the Enable signal pin

Lcd_Init  Lcd_Init();
Lcd_Out  void Lcd_Out(unsigned short row, unsigned short col, char *text);
Lcd_Out(1, 3, “STR 2010");

Librería LCD (interface 4 bits) II

Lcd_Out_Cp void Lcd_Out_Cp(char *text);


Lcd_Chr void Lcd_Chr(char row, char column, char out_char);
Lcd_Chr_Cp void Lcd_Chr_Cp(char out_char);
Lcd_Cmd void Lcd_Cmd(char out_char);
Librería LCD (interface 4 bits) III
LCD Command Purpose

_LCD_FIRST_ROW Move cursor to 1st row


_LCD_SECOND_ROW Move cursor to 2nd row
_LCD_THIRD_ROW Move cursor to 3rd row
_LCD_FOURTH_ROW Move cursor to 4th row
_LCD_CLEAR Clear display
_LCD_RETURN_HOME Return cursor to home position, returns a shifted display to
original position. Display data RAM is unaffected.

_LCD_CURSOR_OFF Turn off cursor


_LCD_UNDERLINE_ON Underline cursor on
_LCD_BLINK_CURSOR_ON Blink cursor on
_LCD_MOVE_CURSOR_LEFT Move cursor left without changing display data RAM
_LCD_MOVE_CURSOR_RIGHT Move cursor right without changing display data RAM
_LCD_TURN_ON Turn LCD display on
_LCD_TURN_OFF Turn LCD display off
_LCD_SHIFT_LEFT Shift display left without changing display data RAM
_LCD_SHIFT_RIGHT Shift display right without changing display data RAM

Manejo de display LCD


sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB2_bit;
sbit LCD_D4 at RC4_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB2_bit;
sbit LCD_D4_Direction at TRISC4_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;

void main(){
TRISB=0; TRISC=0; // Port B y C salida
PORTB=0;
Lcd_Init(); // Inicializa LCD
Lcd_Cmd(_LCD_CLEAR); // Borra display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,4,"S.T.R. 2010"); // Escribe texto en 1ª línea
}
Manejo de display LCD
// Conexiones del módulo LCD
sbit LCD_RS at RA3_bit;
sbit LCD_RW at RA2_bit; char txt1[] = "Microcontroladores";
sbit LCD_EN at RA1_bit; char txt2[] = "STR 2010";
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit; void main(){
sbit LCD_D6 at RD2_bit; TRISD = 0; // Puerto D salida
sbit LCD_D7 at RD3_bit; ADCON1 = 0x8E;
sbit LCD_RS_Direction at TRISA3_bit; TRISA = 0x11;
sbit LCD_RW_Direction at TRISA2_bit; Lcd_Init(); // Incializar LCD
sbit LCD_EN_Direction at TRISA1_bit; Lcd_Cmd(_LCD_CLEAR); // Borrar display
sbit LCD_D4_Direction at TRISD0_bit; Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
sbit LCD_D5_Direction at TRISD1_bit; Lcd_Out(1,1,txt1); // Escribir texto en la 1ª fila
sbit LCD_D6_Direction at TRISD2_bit; Lcd_Out(2,6,txt2); // Escribir texto en la 2ª fila
sbit LCD_D7_Direction at TRISD3_bit; }
// Fin de conexiones módulo LCD

Conversión A/D (I)


Hasta 8 canales de entrada
Conversión por método de aproximaciones sucesivas
10 bits de resolución
Voltaje alto y bajo de referencia seleccionable por software
Posibilidad de ejecución en modo SLEEP
Conversión A/D (II)

4 registros básicos:

2 registros configuración:
ADCON0
ADCON1

2 registros datos:
ADRESH y ADRESL

Registro de configuración (I)


Registro de configuración (II)

Registro de datos
Conversión A/D

TRISA = 0xFF;
ADCON1 = 0x80;
ADCON0 = 0x81;
Comando: Adc_Read( )  Inicializa el convertidor A/D
para trabajar como oscilar RC, y como parámetro se le pasa el canal
que queramos convertir, devolviendo un entero con el resultado de la
conversión.

unsigned ADC_Read(unsigned short channel);


temp = ADC_Read(0);
/* ****************************************************
Simulación sobre PICDEM_2 18F452
Visualiza en display LCD el valor de la conversión AD
****************************************************** */

sbit LCD_RS at RA3_bit; void main(){


sbit LCD_RW at RA2_bit; TRISD = 0; // Puerto D salida
sbit LCD_EN at RA1_bit; ADCON0 =0x81;
sbit LCD_D4 at RD0_bit; ADCON1 = 0x8E;
sbit LCD_D5 at RD1_bit; TRISA = 0x01;
sbit LCD_D6 at RD2_bit; Lcd_Init(); // Incializar LCD
sbit LCD_D7 at RD3_bit; Lcd_Cmd(_LCD_CLEAR);
sbit LCD_RS_Direction at TRISA3_bit; Lcd_Cmd(_LCD_CURSOR_OFF);
sbit LCD_RW_Direction at TRISA2_bit; Lcd_Out(1,1,txt1);
sbit LCD_EN_Direction at TRISA1_bit; do{
sbit LCD_D4_Direction at TRISD0_bit; conversion = ADC_Read(0);
sbit LCD_D5_Direction at TRISD1_bit; delay_ms(50);
sbit sbit LCD_D7_Direction at TRISD3_bit; IntToStr(conversion,txt);
// Fin de conexiones módulo LCD Lcd_Out(2,1,txt);
char *txt1 = "Conversion A/D"; }while(1);
int conversion; }
char txt[7];
LCD_D6_Direction at TRISD2_bit;

Manejo de una interrupción


unsigned cnt;
void interrupt() {
cnt++; // Incrementar valor cnt
TMR0 = 96; //en cada interrupción
INTCON = 0x20; // Activar T0IE, borrar T0IF
}//~
void main() {
OPTION_REG = 0x84; // Preescaler a TMR0
TRISB = 0; // PORTB como salida
PORTB = 0xFF; // iniciar PORTB
TMR0 = 96;
INTCON = 0xA0; // Habilitar interupción TMR0
cnt = 0; // Resetear cnt
do {
if (cnt == 400) {
PORTB = ~PORTB; // Negar PORTB
cnt = 0; // Resetear cnt
}
} while(1);
}//~!
Registro de configuración timer 0

Registro de configuración (II)


Registro de configuración timer 1

Manejo del TIMER 1


unsigned short cnt;
void interrupt() {
INTCON = 0x00; // Inhabilitar interrupciones GIE, PEIE
cnt++ ;
PIR1.TMR1IF = 0; // Borrar flag TMR1IF
TMR1H = 0xE0;
TMR1L = 0x00;
INTCON = 0xC0; // Habilitar interrupciones GIE, PEIE
}

void main() {
PORTB = 0xFF; // Inicializar el PORTB
TRISB = 0; // PORTB salida
T1CON = 1; // Timer1 activado con predivisor 1:1
PIR1.TMR1IF = 0; // borrar flag TMR1IF
TMR1H = 0xE0; // Inicializar registro del Timer1
TMR1L = 0x00;
PIE1.TMR1IE = 1; // Habilitar interrupción Timer1
cnt = 0; // Resetear var cnt
INTCON = 0xC0; // Habilitar interrupciones GIE, PEIE
do {
if (cnt == 76) { // si cnt es 76
PORTB = ~PORTB; // cambiar estado PORTB y
cnt = 0; // resetear cnt
}
} while (1);
}
Interfaz Serie
• Posibilidad de configuración para
comunicación:
– full-duplex asíncrona.
– Sincrona como Master
– Síncrona como Slave

• Utilizaremos el modo asíncrono

Interfaz Serie
• MODO ASINCRONO:
– codificación standard NRZ
• 1 bit inicio 8-9 de datos y 1 bit de paro.
– formato standard de 8 bits ( configurable )
– se transmite primero el bit LSB
– paridad no soportada por HW pero puede
calcularse por SW y almacenarse en bit 9
Interfaz Serie I
DIAGRAMA DEL BLOQUE DE TRANSMISION

Interfaz Serie II
• PROGRAMACION:
– 1) Inicializar registro del Generador de baudios
(SPBRG) y el bit de alta velocidad si necesario
(BRGH)
– 2) Modo Asíncrono
• Clear bit SYNC
– 3) Habilitar puerto serie
• Set bit SPEN
– 4) Interrupciones habilitadas
• Set bit TXIE
– 5) Si se quiere 9º bit de datos
• Set bit TX9
Interfaz Serie III

– 6 ) Habilitar transmision
• Set bit TXEN (habilita el bit TXIF)
– 7) Si se ha seleccionado 9º bit
• Cargar bit en TX9D
– 8) Cargar el registro TXREG con los datos:
• empieza automáticamente la transmisión

Interfaz Serie IV
char uart_rd;

void main() {

UART1_Init(9600); // Inicializa puerto serie 9600 bps


Delay_ms(100); // Espera que UART se estabilize

UART1_Write_Text("EnviaPuertoSerie");
UART1_Write(10);
UART1_Write(13);

while (1) {
if (UART1_Data_Ready()) { // Si dato recibido en buffer,
uart_rd = UART1_Read(); // se lee dato,
UART1_Write(uart_rd); // y se envía por UART
}
}
}
Bus I2C_I
• I²C es un bus de comunicaciones serie
patentado por Philips.
• La velocidad es de 100Kbits por segundo en
el modo estándar, aunque también permite
velocidades de 3.4 Mbit/s. Es un bus muy
usado en la industria, principalmente para
comunicar microcontroladores y sus
periféricos.

Bus I2C_II
• La principal característica de I²C es que
sólo usa dos hilos para transmitir la
información: por uno van los datos y por
otro la señal de reloj que sirve para
sincronizarlos.
– SDA: datos
– SCL: reloj
Bus I2C_III
• Los dispositivos conectados al bus I²C tienen una
dirección única para cada uno. También pueden ser
maestros o esclavos.
• El dispositivo maestro inicia la transferencia de datos y
además genera la señal de reloj, pero no es necesario
que el maestro sea siempre el mismo dispositivo, esta
característica se la pueden ir pasando los dispositivos
que tengan esa capacidad.
• Esta característica hace que al bus I²C se le denomine
bus multimaestro.

Bus I2C_IV
I2C1_init(100000)

Dirección
Dato
Inicio L=1/E=0
Byte bajo(1) | Byte alto(2)
I2C1_start( I2C1_wr(0x40
) )

Comando
I2C1_wr(0x01)

I2C1_stop()
void main()
{
I2C1_init(100000); //inicializa velocidad de bus
delay_us(50) ;
//configura registros

Ejemplo de manejo de un dispositivo I2C


I2C1_start();
I2C1_wr(0x40);//direccion
I2C1_wr(0x06); //comando
I2C1_wr(0x00); //byte menos significativo
I2C1_wr(0x00); //byte mas significativo
I2C1_stop();
delay_us(50);
do{
delay_ms(500);
I2C1_start();
I2C1_wr(0x40);
I2C1_wr(0x02);
I2C1_wr(0x00);
I2C1_wr(0x00);
I2C1_stop();
delay_ms(500);
I2C1_start();
I2C1_wr(0x40);
I2C1_wr(0x02);
I2C1_wr(0xFF);
I2C1_wr(0xFF);
I2C1_stop();
}while(1);
}

Escribir en TC_74

Leer dispositivo
Lectura de un registro

En color amarillo se muestra la información que envía el


maestro (uC) al bus, y en azul la respuesta del dispositivo
esclavo (sensor).

Bus I2C

int tc_74(short direc){


unsigned short reslt;
I2C1_init(100000);
I2C1_Start(); // Inica transmisión
I2C1_Wr(direc); // Dirección del esclavo)
I2C1_Wr(comando); // Envía datos al sensor)
I2C1_Stop(); // I2C1_Repeated_Start();
I2C1_Start(); // Restart
I2C1_Wr(direc+1); // Lee del sensor)
reslt = I2C1_Rd(0u); // Lee registro (NO acknowledge)
while (I2C1_Is_Idle())
asm nop; // Espera fin de transmisión
I2C1_Stop(); // Fin de la transmisión
return reslt;
}
#define TC74_I2C1_WRITE_ADDRESS 0x9A
#define TC74_I2C1_READ_ADDRESS 0x9B
#define TC74_READ_TEMP_COMMAND 0x00

Void iniciar(void){
I2C1_Init(100000);
delay_us(200);
}

short termometro(void){
short aux;
I2C1_Start(); //Envia señal de arranque I2C1
delay_us(100);
I2C1_Wr(TC74_I2C1_WRITE_ADDRESS); // Acceso reg. de escritura
I2C1_Wr(TC74_READ_TEMP_COMMAND); // envío comando lectura
I2C1_Repeated_Start(); // Rearrancar bus I2C1
delay_us(500);
I2C1_Wr(TC74_I2C1_READ_ADDRESS); //Acceso registro de escritura
aux = I2C1_Rd(0u); // Lectura de sensor (NO acknowledge)
I2C1_Stop();
delay_us(150);
return aux;
}