Está en la página 1de 41

MICROCONTROLADORES

(TUTORIAL)

2014-2

Norma Patricia Guarnizo C.


normapguarnizo@gmail.com

normapguarnizo@gmail.com
OBJETIVO GENERAL

Desarrollar y programar un sistema


computacional en bajo nivel para la captura de
información análoga y digital, generando
señales de control y comunicaciones para la
interacción con otros sistemas.

normapguarnizo@gmail.com
OBJETIVOS ESPECÍFICOS:

•Conocer la arquitectura interna de los microcontroladores.

•Solucionar por medio de diagramas de flujo, problemas de programación


con microcontroladores.

•Utilizar los microcontroladores en aplicaciones básicas como manejo de


periféricos, temporización, visualización de datos, multiplexación,
conversión A/D y comunicaciones seriales.

•Manejar software de simulación y para la edición y compilación de código


en lenguaje C.

normapguarnizo@gmail.com
Qué diferencia hay entre un microprocesador (µP) y
un microcontrolador (µC)?
Un microcontrolador (µC) = Un computador de bajo
costo.

Un microcontrolador = microprocesador + periféricos


de entrada y salida + Memoria RAM y ROM

normapguarnizo@gmail.com 4
Qué diferencia hay entre un microprocesador y un microcontrolador ?

Microprocesador Microcontrolador

normapguarnizo@gmail.com 5
Qué es un Microcontrolador (µC)?

• Es un computador de bajo costo encapsulado en


un circuito integrado. Un µC es capaz de
almacenar y ejecutar un programa.
• Es una maquina de estados que interpreta una
serie de instrucciones almacenadas en una
memoria y realiza operaciones con ellas.
• Necesita al menos una memoria y un interfaz
con el usuario para poder funcionar. Es un
sistema cerrado.

normapguarnizo@gmail.com 6
Ventajas de un Microcontrolador (µC)?
• Disminución en el tamaño de los circuitos.
• Bajo costo.
• Disminución en el tiempo de desarrollo.

Desventajas de un Microcontrolador (µC)?


• Velocidad
• Memoria

normapguarnizo@gmail.com 7
Arquitectura de los microcontroladores

Arquitectura Von Neumann

La unidad central de procesamiento (CPU) está conectada a una


memoria única donde se guardan las instrucciones del programa
y los datos. Al tener sólo un bus y tanto la memoria de programa
como la de datos juntas, lo hacían lento.

normapguarnizo@gmail.com 8
Arquitectura de los microcontroladores

Arquitectura Harvard

La unidad central de procesamiento (CPU) está conectada, a


través de buses independientes, a la memoria de datos (RAM) y a
la memoria de programa (ROM). Esta arquitectura mejora la
velocidad en cada operación.

normapguarnizo@gmail.com 9
PIC 16F887

• Características Generales
• Diferencia entre las referencias 16F87X y 16F88X
• Algoritmos de programación
• Principales partes de un µC
• Set de instrucciones
• Configuración 16F887 y 16F877A

normapguarnizo@gmail.com 10
Características generales
• CPU RISC de alto Rendeimiento:
• Solo 35 instrucciones de palabra simple para aprender
• Todas las instrucicones se ejecutan en un ciclo excepto
los saltos, los cuales llevan dos ciclos.
• Velocidad de Operación: clock de entrada de DC – 20
MHz. 200 ns ciclo por instrucción
• Hasta 8K x 14 words de Memoria Flash de Programa,
• Hasta 368 x 8 bytes de Memoria de datos(RAM),
• Hasta 256 x 8 bytes de Memoroa de Datos EEPROM

normapguarnizo@gmail.com 11
Características generales
• Características de los Periféricos:
• Timer0: 8-bit timer/countador con preescaler de 8 bits
• Timer1: 16-bit timer/contador con preescaler, puede ser incrementado durante el Sleep
via cristal/clock externo
• • Timer2: 8-bit timer/contador con registro de período de 8 bits, preescaler y postscaler
• Dos Módulos Captura, Comparación, PWM
• - Captura es de 16-bit,resolución max. es de 12.5 ns
• - Comparador es de 16-bit, resolución max. es 200 ns
• - PWM Resolución máxima es de 10-bit
• Port Serie Sincrónico (SSP) con SPI™
• (modo Master) y I2C™ (Master/Slave)
• Transmisor-Receptor Universal Sincrónico Asincrónco (USART/SCI)
• con detección de dirección de 9-bit
• Parallel Slave Port (PSP) – de 8 bits de ancho con lineas de control
• RD, WR y CS (solo para zócalos de 40/44-pines)
• Detección de Brown-out circuitería paraBrown-out Reset (BOR)

normapguarnizo@gmail.com 12
Diferencia entre referencias
16F87X

16F88X

normapguarnizo@gmail.com 13
Algoritmos de programación
(Diagramas de flujo)
INICIO Y FÍN DE PROGRAMA

ENTRADA DE DATOS EN LA MEMORIA Y SALIDA


DE DATOS POR PERIFÉRICOS

PROCESOS: OPERACIONES ARITMÉTICAS Y LÓGICAS

DECISIÓN: POR CUALQUIER OPERACÍÓN (EXISTEN DOS


CAMINOS: SI o NO.

SALTO: SALTO A CUALQUIER OTRA PARTE DE UN


DIAGRAMA U OTRA PÁGINA DEL MISMO

normapguarnizo@gmail.com 14
16F887 y 16F877A

normapguarnizo@gmail.com 15
Principales partes de un µC?
1. El procesador (CPU)
2. Memoria de programa. no volátil (FLASH)
3. Memoria de datos. lectura, escritura y almacenamiento de los datos (RAM y EEPROM)
4. Circuito de reloj.
5. Líneas de Entrada/Salida para los controladores de periféricos:
a) Comunicación paralelo
b) Comunicación serie
c) Diversos puertos de comunicación (bus l2C, USB, USART, etc.)
6. Recursos auxiliares:
a) Circuito de reloj
b) Temporizadores
c) Perro Guardíán («watchdog»)
d) Conversores AD y DA
e) Comparadores analógicos
f) Protección ante fallos de la alimentación
g) Estado de reposo o de bajo consumo

normapguarnizo@gmail.com 16
Principales partes de un µC?
El procesador (CPU) se encarga de:

• Direccionar la memora de datos y de programa


• Captar , decodificar y ejecutar el código de operación de la
instrucción
• Buscar los datos de los operandos.
• Almacenar los resultados
• Controlar los módulos o periféricos internos.

normapguarnizo@gmail.com 17
Principales partes de un µC?
Conjuntos de instrucciones según la arquitectura:

CISC (Complex Instruction Set Computer): conjunto de más de 80


instrucciones, algunas muy potentes que requieren muchos ciclos
de reloj para su ejecución. Permite la ejecución de instrucciones
macro.

RISC (Reduced Instruction Set Computer): Conjunto de


instrucciones reducido, que permite instrucciones simple que se
ejecutan en un solo ciclo de reloj. Permiten optimizar el hardware
y el software.

normapguarnizo@gmail.com 18
Memoria de programa FLASH
Es la memoria donde se almacena el programa que
el micro ejecutará. Es una memoria no volátil de
alta velocidad de transferencia de datos, alta
densidad y bajo consumo de corriente. Es
programable en circuito (in circuit), soporta
muchos ciclos de escritura/borrado.

normapguarnizo@gmail.com 19
Memoria de datos RAM
La memoria RAM se compone de 4 bancos (0,1,2 y
3), en los cuales se encuentran dos tipos de
registros:
• Registros de propósito especial: son los que ya
traen una dirección y un nombre en los bancos de
memoria RAM del micro.
• Registros de propósito general: son los que están
disponibles para el usuario a partir de la dirección
20h.

normapguarnizo@gmail.com 20
Bancos de memoria RAM

normapguarnizo@gmail.com 21
Circuito de reloj
Los micros disponen de circuitos osciladores que
generan señales cuadradas para sincronizar las
operaciones internas. Generalmente se
encuentra incorporado internamente y solo
requiere de algunos dispositivos externos, los
cuales pueden ser: cristales de cuarzo o una red
RC. Aumentar la frecuencia de reloj, disminuye el
tiempo de ejecución de una instrucción.

normapguarnizo@gmail.com 22
Circuito de reloj
- Definir el tiempo de instrucción (t. instrucción)
según la frecuencia de oscilación (Fosc).
t. instrucción = 4/Fosc

Ejemplo: Para una frecuencia de oscilación de 4MHz.


t. instrucción = 4/4MHz = 1μS

normapguarnizo@gmail.com 23
Registro W
Registro de trabajo. Es un registro temporal con el que se hacen
operaciones aritméticas y lógicas con registros (F) y con literales (L).
Instrucciones con el Registro W

• Para mover un registro a W


MOVFREG,0 ;WREG

• Para cargar un literal o constante a W


MOVLW .5 ;W#5

• Para mover lo que tenga W a un registro


MOVWF REG ;REGW

normapguarnizo@gmail.com 24
Subrutinas
Son subprogramas que se ejecutan porque son llamados desde el programa principal. Una subrutina tiene un inicio, un conjunto de
instrucciones y un fin. Ejemplo:

Retardo xxxxxxxxxxxx
xxxxxxxxxxxx
inicioxxxxxxxxxxxx
return
Cuerpo de la subrutina (Conjunto de inst.)
Int_TMR0 xxxxxxxxxxxx Fin de la subrutina
xxxxxxxxxxxx
xxxxxxxxxxxx
retfie

El objetivo de una subrutina es realizar procesos que se repiten frecuentemente dentro de un programa, por ejemplo:
•Retardos
•Teclado
•Visualización
•Tablas de decodificación

normapguarnizo@gmail.com 25
Pila (Stack)
Cuando se ejecuta una subrutina por un llamado o porque se ha producido una interrupción, se
produce un almacenamiento temporal en la pila (STACK). La pila tiene 8 niveles de anidamiento
y sirve para almacenar la posición del contador de programa (PC) antes de ir a la etiqueta de la
subrutina llamada, o antes de atender una interrupción, así:
PC STACK
30H INICIO CLRF CONT
31H OTRA CALL RETAR CALL
CALL DELAY RETURN CALL TABLA
32H MOVF CONT,W RETAR
33H CALL TABLA
34H MOVWF PORTB 32H 3EH 32H 34H Nivel 1
35H INCF CONT,1 32H Nivel 2
36H MOVLW .10
37H XORWF CONT,0
38H BTFSS STATUS,Z
39H GOTO OTRA
3AH GOTO INICIO

3BH RETAR MOVLW .20


3CH MOVWF REG
3DH VOLV CALL DELAY
3EH DECFSZ REG,1
3FH GOTO VOLV
40H RETURN Nivel 8

normapguarnizo@gmail.com 26
Registro STATUS 03H (Bancos 0,1,2 y 3)
Registro de ESTADO que proporciona información sobre los resultados de operaciones aritméticas y lógicas a través de
los bits C,DC y Z. También sirve para pasarnos de Banco a través de los bits RP0 y RP1.

Bits para cambiar


de banco

Bits que informan


sobre el resultado
de operaciones
aritméticas y
lógicas

normapguarnizo@gmail.com 27
REGISTRO OPTION 81H (Banco 1)

Bits para
configurar el
preescaler a 128

normapguarnizo@gmail.com 28
INTCON 0BH (Banco 0,1,2,3)
Habilitador
global de
interrupciones

Habilitador de
interrupción por
TMR0

Bandera que se
activa cuando
ocurre una
interrupción por
el TMR0

normapguarnizo@gmail.com 29
Configuración interrupción por
tiempo con el TMR0 (Timer 0)
1. Definir el tiempo de interrupción que se requiere
(T.int) y otros parámetros como:
– Determinar el Preescaler con los bits <2:0> del
registro option. Según tabla:

normapguarnizo@gmail.com 30
Configuración interrupción por
tiempo con el TMR0 (Timer 0)

- Definir el tiempo de instrucción (t. instrucción)


según la frecuencia de oscilación (Fosc).
t. instrucción = 4/Fosc

Ejemplo: Para una frecuencia de oscilación de 4MHz.


t. instrucción = 4/4MHz = 1μS

normapguarnizo@gmail.com 31
Configuración interrupción por
tiempo con el TMR0 (Timer 0)

2. Programar el preescaler con el registro option<2:0>.


3. Habilitar la interrupción por TMR0 con el registro
INTCON<Bit 5 ó TOIE>.
4. Programar el TMR0 con el valor calculado.
5. Habilitar el bit global de interrupciones con el
resigtro INTCON<Bit 7 ó GIE>.

normapguarnizo@gmail.com 32
Ejemplo configuración
interrupción por TMR0
El tiempo requerido es de 10mS, el preescaler seleccionado
(aleatorio) es de 128 y el t. instrucción = 1μS (Fosc=4MHz)
De la ecuación:
T. int= (256-TMR0)*Preescaler*t.instrucción
Despejar el TMR0 y reemplazar los valores seleccionados:
TMR0=256 – T.int/(Preescaler*t.instrucción)
TMR0=256 – 10exp-3seg/(128* 1μS) = 178

Nota: El valor calculado para el TMR0 debe ser positivo y estar entre
1 y 255. Si el valor no es entero, aproximarlo al valor mas cercano.

normapguarnizo@gmail.com 33
Estructura For (ejemplo 0-100)
Debido a que el tiempo de ejecución de las instrucciones son tan cortos, es indispensable trabajar con
retardos.
Retardo simple usando un registro:

INICIO

CONTADOR=0

CONTADOR=CONTADOR+1

CONTADOR NO
=100

SI

FIN

normapguarnizo@gmail.com 34
Tablas (I)
Las tablas son arreglos de datos que hacen las veces de decodificadores, cuyos datos almacenados
se van cargando en un registro conforme un contador, usualmente controlado por un ciclo FOR, se
va incrementando o decrementando. Se pueden usar en aplicaciones como:
• Conversión Binario a 7 segmentos
• Conversión Binario a ASCII
• Generación de secuencias de datos
• Decodificador de teclados

Ejemplo: Crear una tabla para convertir un dato binario a un código 7 segmentos para display de
cátodo común. El segmento a será controlado por el bit0, el segmento b por el bit1,…y el segmento
g por el bit6. Para activar cada segmento se debe poner un “1” en el bit correspondiente, por
ejemplo para visualizar el número “0” se debe poner “1” en todos los segmentos excepto en el
segmento g, por lo tanto el dato en la tabla será:
xgfedcba
RETLW B’1 0 1 1 1 1 1 1’

normapguarnizo@gmail.com 35
Primer programa (Circuito)

1 Microcontrolador 16F887
1 pulsador RB0
1 leds en RB1

normapguarnizo@gmail.com
Primer programa (Código)
/*Este es nuestro primer programa de micro, es un ejemplo y lo que hace encender un led ubicado en RB1, si RB0 está en "1", o
apagarlo, si RB0 está en "0"*/

#include <16F887.h> //Selección del micro con el que trabajaremos


#fuses INTRC,NOWDT,NOMCLR //Fusibles de configuración: Oscilador RC interno, sin WDT y Master clear habilitado
#use delay(clock=4M) //Velocidad del reloj

#byte PORTA=0X05 //Declaración del PORTA como registro ubicado en la dirección 05 de la RAM
#BYTE PORTB=0X06
#BYTE PORTC=0X07
#BYTE TRISA=0X85
#BYTE TRISB=0X86
#BYTE TRISC=0X87
#BYTE OPTION_REG=0X81

#BIT RB0=PORTB.0 //Declaración del RB0 como bit 0 del Puerto B


#BIT RB1=PORTB.1

void main() //Comienzo del programa principal


{

TRISB=0B11111101; //Configuración del PuertoB, Entrada RB<7:2>, RB0. Salida RB1.


OPTION_REG=0B01111111; //Habilitando las resistencias de pull-up internas a través del puerto B.
RB1=0; //Led ubicado en RB1 apagado

WHILE(1) //Loop o ciclo principal (infinito)


{

IF (RB0==1) //Si RB0 es igual a 1


RB1=1; //Entonces ponga a RB1 en "1"
ELSE //Si no
RB1=0; //Ponga RB1 en "0"
}
}

normapguarnizo@gmail.com
Segundo y tercer programa (Circuito)

1 Microcontrolador 16F887
1 pulsador RB0
4 leds Cátodo común RC<3:0>
1 pulsador MCLR

normapguarnizo@gmail.com
Segundo programa (Código I)
#include <16F887.h> //DIRECTIVAS –Archivo de cabecera del Dispositivo
#fuses INTRC,NOWDT,MCLR //Fusibles de configuración: Oscilador RC interno
//Sin WDT y Master clear habilitado
#use delay(clock=4M) //Frecuencia del reloj= 4 MHZ

#BYTE PORTB=0X06 //Declaración puertos y variables


#BYTE PORTC=0X07
#BYTE TRISB=0X86
#BYTE TRISC=0X87
#BYTE OPTION_REG=0X81

int i; //Variable i como entera de 8 bits


void main() //Función principal
{ //Comienzo de la función
TRISB=0B11111111; //Configuración de puerto B como entrada
TRISC=0B00000000; //Configuración del puerto C como salida
OPTION_REG=0B01111111; //Habilitación de Resistencias de pull-up
PORTC=0; //Inicialización en “0” del puerto C

WHILE(1) //Ciclo infinito


{
PORTC=0B00001111; //Cargar dato a puerto C
DELAY_MS(500); // Temporizador 500mS
PORTC=0B00001000;
DELAY_MS(500);
PORTC=0B00000100;
DELAY_MS(500);
PORTC=0B00000010;
DELAY_MS(500);
PORTC=0B00000001;
DELAY_MS(500);
PORTC=0B00000000;
DELAY_MS(500);

}
}

normapguarnizo@gmail.com
Segundo programa (Código II)
#include <16F887.h>
#fuses INTRC,NOWDT,MCLR
#use delay(clock=4M)

#BYTE PORTA=0X05
#BYTE PORTB=0X06
#BYTE PORTC=0X07
#BYTE TRISA=0X85
#BYTE TRISB=0X86
#BYTE TRISC=0X87
#BYTE OPTION_REG=0X81

BYTE CONST TABLA[6]={0X0F,0X08,0X04,0X02,0X01,0X00}; //Creación de tabla o


//vector de 6 posiciones, con nombre “TABLA”

int i;
void main()
{
TRISB=0B11111111;
TRISC=0B00000000;
OPTION_REG=0B01111111;
PORTC=0;

WHILE(1)
{
FOR (i=0;i<6;i++) {
PORTC=TABLA[i];
DELAY_MS(500);
}
}
}

normapguarnizo@gmail.com
Tercer programa (Código con dos tablas)
#include <16F887.h>
#fuses INTRC,NOWDT,MCLR
#use delay(clock=4M)

#BYTE PORTB=0X06
#BYTE PORTC=0X07
#BYTE TRISB=0X86
#BYTE TRISC=0X87
#BYTE OPTION_REG=0X81
#BIT PUL=PORTB.0

BYTE CONST TABLA1[6]={0X0F,0X08,0X04,0X02,0X01,0X00};


//Creación de tabla de 6 posiciones, con nombre “TABLA1”

BYTE CONST TABLA2[10]={0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09};

int i;
void main()
{
TRISB=0B11111111;
TRISC=0B00000000;
OPTION_REG=0B01111111;
PORTC=0;

WHILE(1)
{
IF (PUL==1){
FOR (i=0;i<6;i++) {
PORTC=TABLA1[i];
DELAY_MS(500); }
}ELSE{
FOR (i=0;i<10;i++) {
PORTC=TABLA2[i];
DELAY_MS(500); }

}
}
}

normapguarnizo@gmail.com

También podría gustarte