Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Microcontroladores
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 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.
• 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
Arquitecturas básicas
• Von Neuman
• Harvard
Características (arquitectura) I
Características (arquitectura) II
• 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).
Arquitectura HARVARD
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 .
Una misma patilla del chip, puede ser entrada o salida, tanto
analógica como digital.
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.
Ensamblador.
Compilador.
Simulador.
Placas de prototipo + ICD.
Emuladores en circuito + ICD.
Programador.
Lenguajes de programación
*.c
MIKROC
Compilar código fuente (Mikroe compiler)
*.asm
MPASM, MIKROC
Ensamblar código objeto
*.dbg, .cof
*.hex
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
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)
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).
s
mejorada
bit PIC24 , (DsPIC)
16
75, (84) instrucciones,
hasta 16,(40)MIPS
PIC16*
Gama media
8b
• 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$
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.
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);
}//~!
Tosc = 1 / fclock
Tipos y repertorio de instruciones
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
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.
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_Init Lcd_Init();
Lcd_Out void Lcd_Out(unsigned short row, unsigned short col, char *text);
Lcd_Out(1, 3, “STR 2010");
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
4 registros básicos:
2 registros configuración:
ADCON0
ADCON1
2 registros datos:
ADRESH y ADRESL
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.
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
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_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
Escribir en TC_74
Leer dispositivo
Lectura de un registro
Bus I2C
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;
}