Vous êtes sur la page 1sur 56

MICROCONTROLADORES

MICROCONTROLADORES

Introducción
Arquitectura
Memoria
I/O Digital
INTRODUCCIÓN
Uso de los microcontroladores
Microondas, Lavarropas, Televisores, ...
Automóviles, aviones, barcos
Teléfonos
Automatización industrial
Pequeños dispositivos ad-hoc
...
INTRODUCCIÓN
INTRODUCCIÓN

Oferta de Microcontroladores
Estructurada por “familias” y “subfamilias”.
Por ejemplo, cada familia tiene el mismo núcleo del
procesador (su código será compatible):
8051,PIC,HC,ARM
O son familias orientadas a la aplicación
O por performance (de diferente tipo)
OFERTA DE MICROCONTROLADORES
OFERTA DE MICROCONTROLADORES
ADVANCED RISC MACHINES
 Fundada en 1990 (Antes ACOM)
 “The world's leading semiconductor intellectual property
(IP) supplier”
 “best MIPS to Watts - best MIPS to $ - smallest CPU die
size”
 Los “socios” (hoy mas de 1000) compran las licencias de IP
y fabrican en base a ellas.
 Diseñan procesadores y tecnologías relacionadas con ellos,
por ejemplo:
 Procesadores  Seguridad (para ARMs)

 Conectividad para SoC  IoT

 Procesadores Grficos  también fabrican algunas


cosas físicas . . .
 Software
OFERTA DE MICROCONTROLADORES
EJEMPLO DE IMPLEMENTADOR
EJEMPLO FAMILIAS DE MCU NXP-ARM

Kit FRDM-KL46Z
ARQUITECTURA
ARQUITECTURA – EJEMPLO - AVR
ARQUITECTURA

IA
ARQUITECTURA: PROCESADOR
ARQUITECTURA

Von Neuman vs. Hardvard


CISC vs. RISC
Tamaño/variedad de las instrucciones
Velocidad: clock; 8/16/32 bits
ARM – CORTEX-M

Arquitectura de Arquitectura
Cortex-M la Memoria ARM

Cortex-M0 Von Neumann ARMv6-M

Cortex-M0+ Von Neumann ARMv6-M

Cortex-M1 Von Neumann ARMv6-M

Cortex-M3 Harvard ARMv7-M


Cortex-M4 Harvard ARMv7E-M
Cortex-M7 Harvard ARMv7E-M
MEMORIA
 Registros (memoria de corto plazo):
 Pequeña (relativamente)
 Almacenamiento temporario p/CPU
 Memoria de datos
 Relativamente Grande
 Almacena datos mientras el MCU funciona
 También puede haber una memoria relativamente pequeña para
almacenar datos en forma permanente (calibraciones)
 Memoria de programa
 Relativamente Grande
 De preferencia, mantiene el programa incluso con el MCU apagado.
MEMEORIAS
MEMORIA: TIPO FÍSICOS
MEMORIA

S/DRAM: sin limite de escrituras


EEPROM: 100.000 ciclos de borrado
Flash: 10.000 ciclos de borrado
MEMORIA: DIRECCIONAMIENTO

Separado:
Cada tipo físico se direcciona por separado (por
ejemplo, usando diferentes registros índices)
Hay direcciones repetidas
Contínuo:
Se accede siempre igual y la logica interna
accede a la memoria que corresponde
No hay direcciones repetidas
MEMORIA: DIRECCIONAMIENTO

Separado
MEMORIA: DIRECCIONAMIENTO

Continuo
ENTRADA/SALIDA DIGITAL
ENTRADA/SALIDA DIGITAL
DIGITAL I/O

Implementadas por pines de conexión directa al


exterior:
 Se agrupan en “ports” de a 8 (32) pines.
 En general, los pines se pueden configurar como entrada
o salida
 La lógica puede ser positiva o negativa.
 Los pines pueden tener (generalmente tienen) otras
funciones alternativas.
•pin 1 del port B
•Módulo de Interrupción 1 - entrada 5
DIGITAL I/O •Pin Tx de puerto serie
•Conversor AD canal 5
DIGITAL I/O
 Los pines se controlan mediante 2 o 3 registros, como
mínimo. Conceptual y funcionalmente:
 Data Direction Register (DDR): hay uno por cada puerto y
cada bit determina la dirección de un pin.
 Port Register (PORT): uno por cada puerto y cada bit
controla el estado del puerto (si es de salida)
 Port Input Register (PIN): uno por cada puerto y cada bit da
el estado de su respectivo pin

La forma de nombrar los registros cambia con el


fabricante
DIGITAL I/O

PORT Register: de preferencia debe


escribirse con operaciones de escritura de
bit, si estan disponibles
Caso contrario usar : Read-Modify-Write
con cuidado.
DIGITAL OUTPUT

Apenas el DDR setea un pin como salida, el MCU


excita el pin de acuerdo al contenido del registro
PORT correspondiente.
Cuidado con los cortocircuitos
Orden de seteo de DDR y PORT
DIGITAL INPUT

Pueden existir en los pines resistencias de pull-


up/down: puede (debe) programarse su
conexión/desconexión mediante algun registro al
efecto.
(del manual de referencia del un
DIGITAL I/O MCU NXP-HS08 de 8 bits)

Registros para el port B (solo dos registros)

(del manual de referencia del MCU)


Archivo header
DIGITAL I/O correspondiente a un
NXP-HS08
NXP - KL46Z
DIGITAL I/O
Registros para el port B (seis registros)

(del manual de referencia del MCU)


Archivo header correspondiente a
DIGITAL I/O un NXP-KL46Z
NXP KL46Z
DIGITAL I/O
bit 7 bit 0
Ejemplo:
0000 0000 1000 0000

GPIOB_PDDR =0x0080; // initialize PTB7 as output


// mejor: GPIOB_PDDR | = (1 << 7);
GPIOB_PCOR= 0xFFFF; // initialize PTB7 to 0
// mejor: GPIOB_PCOR | = (1<<7)
GPIOB_PTOR |= (1 << 7); // invert the output
(¿Por qué el ‘OR’ está de mas en estos dos últimos casos?)
FREESCALE KL46Z
DIGITAL I/O:
OTROS REGISTROS RELACIONADOS
Pin Control Register n (PORTx_PCRn):
define Interrupt Status Flag and Clear -Interrupt
configuration - Pin function (multiplexer) - Driver
strength - Filter control - Slew rate – Pull up/down
resistor

System Integration Module => System Clock


Gating Control Registers:
habilita el uso del clock en los puertos
KIT FRDM-KL46Z
KIT FRDM-KL46Z
 MCU: MKL46Z256VLLZ4
 Dual role USB interface with mini-B USB connector
 4 digit segment LCD module
 Capacitive touch slider
 Ambient light sensor
 MMA8451Q accelerometer
 MAG3110 Magnetometer
 2 user LEDs
 2 user push buttons
 Flexible power supply options – USB, coin cell battery, external source
 Battery-ready, power-measurement access points
 Easy access to MCU I/O via Arduino ™ R3 compatible I/O connectors
 Programmable OpenSDA debug interface with multiple applications available
 including:
 Mass storage device flash programming interface
 P&E Debug interface provides run-control debugging and compatibility with IDE tools
 CMSIS-DAP interface: new ARM standard for embedded debug interface
KIT FRDM-KL46Z
PROGRAMACIÓN DEL MCU:VÍA OPENSDA

PC KL46Z
PRIMER PROGRAMA:
GPIO => USAR LEDS Y PULSADORES DEL KIT
1. Ver esquemático del kit: identificar pines
2. Ver manual de referencia del MCU
1. Identificar pines y puertos conectados con los leds y pulsadores
2. Ver necesidades de inicialización
1. Module Multiplexer (PINOUT - Pin Control Register)
2. System Clock Gating Control

3. Cargar la aplicación DEBUG-APP_Pemicro_vXXX.SDA como


aplicación a ejecutar por OpenSDA.
4. Correr Eclipse/Codewarrior
5. Hacer un programa mínimo
6. Debugging
MAQUINAS DE ESTADO FINITO EN C/C++
(MEF/FSM)
 Maquina de estado finito:

Inicialización

Estado 1

b Evento/señal/
c Condición
a
d

Estado 2 Estado 3

e
MAQUINAS DE ESTADO FINITO EN C/C++
(MEF/FSM)
 Formalmente:

tupla 〈 E, Σ, A ⊆ E×Σ×E,sk 〉, donde


E = {E1, E2 , ,..., En} es un conjunto finito de nodos.
Σ : es un alfabeto finito de etiquetas.
A : es un conjunto finito de aristas etiquetadas que unen nodos.
sk ∈ S: es el estado inicial.
Inicialización

Estado 1
〈 S = {1,2,3},
Σ = {a, b, c},
b Evento/señal/ A ={(1,b,2),(2,c,1),(2,d,3),(3,e,2),(3,a,1)},
c Condición
a
sk =1 〉
d

Estado 2 Estado 3

e
MAQUINAS DE ESTADO FINITO EN C/C++
(MEF/FSM)
Uso de :
Polling Interrupciones
Handler

Interrupción
Inspección del Implementación hardware Implementación
hardware (interno u (interno u
externo) de la máquina de externo) de la máquina de
para detectar eventos estados estados
MAQUINAS DE ESTADO FINITO EN C/C++
(MEF/FSM)
Tipos de implementación en C y C++
 Con instrucciones “switch” anidadas
 Basadas en una matriz estado-transición
 Similar a la anterior pero con punteros a funciones
 Multi-thread FSM
 Uso de estados extendidos
 Todas las opciones anteriores orientadas a objeto en
C++
MEF CON SWITCH ANIDADOS
 Un nivel de decisión superior (SWITCH externo) referido al estado de
la máquina
 Un nivel de decisión inferior (SWITCH interno) referido a las señales,
eventos o condiciones que tienen significancia en ese estado
 Con pocas señales el switch interno suele reemplazarse con por IF(s)
 A veces se invierte la jerarquía (modelo por eventos => Petri)
 Los estados suelen ser enumeraciones
 Implementado:
 Directamente en el main (totalmente o como una parte de él)
 Haciendo uso de una función (“dispatcher”), donde se implementa
MEF CON SWITCH ANIDADOS
 Modelo:
Proximo_Estado= Estado_Actual;
switch ( Estado_Actual) {
case EST_1:
//aqui van acciones dentro del estado 1
switch (evento ) { //solo eventos que cambian este estado
case EVEN_1:
Proximo_estado = EST_x;
// aquí pueden ir acciones asociadas al evento para este cambio de estado
break;
case EVEN_4:
Proximo_estado = EST_y;
// aquí pueden ir acciones asociadas el evento para este cambio de estado
break;
...
}
break;
(continua en la siguiente diapositiva)
MEF CON SWITCH ANIDADOS
(viene de la anterior diapositiva)
case EST_n:
//aqui van acciones dentro del estado n
switch (evento ) { //solo eventos que cambian este estado
case EVEN_3:
Proximo_estado = EST_x;
// aquí pueden ir acciones asociadas al evento para este cambio de estado
break;
...
}
break;
}
if (Estado_actual!=Proximo_estado){ // solo en caso de utilidad particular
//aciones para todo cambio de estado
funcion_salida(Estado_actual); // solo en caso de utilidad particular
funcion_entrada(Próximo_estado); // solo en caso de utilidad particular
Estado_actual=Proximo_estado;
}
MEF CON SWITCH ANIDADOS

 Simple
 Poco uso de RAM
 Tiempo de respuesta variable (aumenta con el numero de casos)
 Implementación no jerárquica
 El código no es reusable
 Compleja cuando los estados y las señales aumentan
MEF CON SWITCH ANIDADOS
 Una variante (de muchas):

void dispatch(unsigned const evento) {


switch(estado) {
case EST_1:
ProcesarEst1(evento);
break;
case STATE_2:
ProcesarEst2(evento);
break;
...
}
ALTERNATIVA: MATRIZ DE TRANSICIONES
Señal 1 Señal 2 Señal 3 Señal4

Estado X Accion X(), Estado_Y

Estado Y AccionY(), Estado_A

Estado A Accion A(), Estado_Q Accion B(), Estado_A AccionC (), Estado_A

Estado Q Accion Q(), Estado_X

(Curiosidad: si las acciones son la misma en toda la línea=> Moore; si pueden


variar=>Mealy)

 Representación directa de la MEF


 Tiempo de respuesta constante y mas rápido
 Mayor posibilidad de reusar el código con menos cambios
 Pero la tabla puede ser muy grande y con desperdicios de celdas (pero puede
mandarse a la flash/rom)
 Se puede pasar a un esquema mas económico usando un par de vectores
 La inicialización puede ser complicada
EJEMPLO: Inicialización

Estado 1
int func_S1(void);
int func_S2(void); b Evento/señal/
int func_S3(void); c Condición
a
d
enum codigo_estados { S1, S2, S3};
enum codigo_eventos {a, b, c, d, e, nada};
Estado 2 Estado 3

struct transicion { e
int (*funcion_estado)(void);
enum codigo_estados proximo;
};

struct transicion tabla_estado_evento [3][6]={


{{func_S1,S1},{func_S1,S2},{func_S1,S1},{func_S1,S1},{func_S1,S1},{func_S1,S1}},
{{func_S2,S2},{func_S2,S2},{func_S2,S1},{func_S2,S3},{func_S2,S2},{func_S2,S2}},
{{func_S3,S1},{func_S3,S3},{func_S3,S3},{func_S3,S3},{func_S3,S2},{func_S3,S3}}
};
EJEMPLO:
void dispatcher(enum codigo_estados, enum codigo_eventos);
enum codigo_estados estado_actual=S1;
enum codigo_eventos evento_actual=nada;

main() {
int (* accion)(void);
for (;;) {
dispatcher(estado_actual,evento_actual);
}
return 0;
}

void dispatcher(enum codigo_estados, enum codigo_eventos){


int (*funcion)(void);
funcion=tabla_estado_evento[estado_actual][evento_actual].funcion_estado;
funcion();
estado_actual=tabla_estado_evento[estado_actual][evento_actual].proximo;
}
MAQUINAS DE ESTADO FINITO EN C/C++
(MEF/FSM)
 Ejemplo: los leds titilan alternativamente sólo cuando está el pulsador accionado

Inicialización

Leds Apagados

Pulsador
apretado Pulsador
Liberado Pulsador
Liberado
Tiempo X

Led Verde Encendido Led Rojo Encendido


– Rojo Apagado – Verde Apagado
Tiempo X

Vous aimerez peut-être aussi