Temas tratados
Introducción
Arquitectura de un microcontrolador. Procesador. Memorias. Reloj. Módulos de entrada y salida digital (repaso).
Implementación de Redes de Petri en lenguaje C
Interrupciones. Diseño de la aplicación. Programación en modo encuesta y por interrupciones. Administración de las interrupciones. Criterios de diseño.
Conversión analógica-digital. Métodos de conversión. Multiplexado de canales. Conversión digital-analógica.
Temporizadores. Fuentes de reloj. Pre-escalado y resolución. Funciones de captura y salida automática. Modulación de ancho de pulso.
Introducción
Ejemplo. Se quiere:
Leer periódicamente una temperatura
Prender y apagar un calefactor
Mostrar en un display la temperatura
Permitir al usuario ajustar la temperatura
Posibilidad de actualizar la funcionalidad con un interfase serie
REPASO
Introducción
Un diseño discreto requería: Un microprocesador
20 líneas de I/O (2 chips de 16 c/u)
1 Interfaz serie (1 chip)
1 Timer (1 chip)
Memoria SRAM (para variables)
Memoria Flash (para programa)
Memoria EEPROM (para constantes)
REPASO
Introducción
Uso de los microcontroladores
Microondas, Lavarropas, Televisores, ...
Automóviles, aviones, barcos
Teléfonos
Automatización industrial
Pequeños dispositivos ad-hoc
...
REPASO
Cada fabricante tiene una oferta estructurada por “familias” y “subfamilias”.
Cada familia tiene el mismo núcleo del procesador (o al menos con compatibilidad de código). El diseño del procesador puede ser propio o de terceros (caso ARM).
Pueden ser familias orientadas a la aplicación
O por performance (de diferente tipo)
REPASO
Introducción
Ejemplo: oferta NXP de microcontroladores
Basados en arquitecturas ARM (varias sub familias)
Basados en Power Architecture ®
Basados en arquitecturas Coldfire de 32 bits
Basados en arquitecturas S12, HC08, HCS08, 80C51, etc. de 8 y 16 bits
Con inclusión de procesadores de señal en el chip (DSC)
De aplicación muy específica (encriptado, wireless, etc.)
REPASO
Memorias en el MCU
Registros (memoria de corto plazo): Pequeña (relativamente)
Almacenamiento temporario p/CPU
Memoria de datos Relativamente Grande
Almacena datos mientras el MCU funciona
Memoria de programa Relativamente Grande
De preferencia, mantiene el programa incluso con el MCU apagado.
REPASO
Memoria
S/DRAM: sin limite de escrituras
EEPROM: 100.000 ciclos de borrado
Flash: 10.000 ciclos de borrado
REPASO
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 lógica interna accede a la memoria que corresponde
No hay direcciones repetidas
REPASO
Memoria:
Análisis teórico:
Codifico: for (i=100;i>=0;i--){ …algún código…}
Inadvertidamente i es almacenada en EEPROM
Inadvertidamente i esta implementada como unsigned Como la EEPROM es lenta, cada iteración lleva,
digamos, 10 ms
¿Que pasa al conectar el MCU?: el programa se cuelga
Me doy cuenta, digamos, a los 10 segundos
Empiezo a “debuggear” el programa (pero no apago el MCU)
¿En cuanto tiempo me quedo sin microcontrolador?
REPASO
Arquitectura
CISC vs. RISC Von Neuman vs. Harvard Tamaño/variedad de las
instrucciones 8/16/32 bits
Algunos conceptos básicos:
REPASO
Arquitectura
Arquitectura Von Neuman
Procesador(CPU)
Bus de Direcciones
Memoria de Datos y Programa
(RAM)
Bus de Datos
Memoria de Programa(ROM)
Procesador(CPU)
Bus de Direcciones
Memoria de Datos(RAM)
Bus de Datos
REPASO
Algunos conceptos básicos:
Arquitectura
Arquitectura Harvard
Procesador(CPU)
Memoria de Datos(RAM)
Bus de Direcciones
Memoria de Programa(ROM)
Bus de direcciones
Bus de Datos (Instrucciones)
Bus de Datos (datos)
REPASO
Algunos conceptos básicos:
Arquitectura: Procesador
Sobre las instrucciones Por stack
Por acumulador
Dos direcciones
Tres direcciones (A+B)*C
Fuentes de reloj en los MCU Los diferentes módulos que componen el
microcontrolador requieren diferentes relojes para su operación.
En general, existe un módulo generador de reloj SCG (System Clock Generator) ó MCG (Multipurpose Clock Generator) que provee las diferentes señales necesarias.
Como cualquier módulo, las frecuencias que produce el SCG pueden ser programadas/seleccionadas mediante el seteo de registros.
Sin embargo, el cambio de frecuencias puede requerir un proceso que involucra varias etapas mas que el simple cambio de valores en un registro.
Fuentes de reloj en los MCU
Ejemplo: generación de señales de reloj en el MCU KL46Z
¿frecuencias al reset?
Modos/estados de operacion
Los MCU pueden ponerse en diferentes estados de operación acorde a las necesidades de la aplicación.
Normalmente los estados están relacionados con el consumo de energía
Ejemplo: (MC9S08JM60) RUN MODE: modo normal de ejecución; todos los relojes y
módulos funcionando
Active Background Mode: modo de depuración “on-chip”
WAIT MODE: el CPU se detiene y vuelve al trabajo con una interrupción
3 STOP modes: en estos modos, diferentes relojes (módulos)
son “apagados”; normalmente se mantienen los valores de registros, RAM y pines de I/O
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.
REPASO
Digital I/O
•pin 1 del port B •Módulo de Interrupción 1 - entrada 5 •Pin Tx de puerto serie
•Conversor AD canal 5
REPASO
Digital I/O
Los pines se controlan mediante 2 o 3 registros, como mínimo. 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
REPASO
Digital I/O
PTBDD = 0x80; // initialize PTB7 as output
PTBD = 0; // initialize PTB to 0
PTBD_PTBD7 = ~PTBD_PTBD7; // invert the output
1 0 0 0 0 0 0 0
Ejemplo: bit 7 bit 0
REPASO
Digital I/O
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
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
Ejemplo:
bit 7 bit 0 FREESCALE KL46Z
REPASO
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 - Pullup/down resistor
System Integration Module => System Clock Gating Control Registers(SIMCGC): habilita el uso del clock en los puertos
FREESCALE KL46Z
REPASO
Digital I/O
PORT DATA (Output) Register: de preferencia debe escribirse con operaciones de escritura de bit, si están disponibles
Caso contrario usar : Read-Modify-Write con cuidado.
REPASO
Digital Input
Cancelación de ruidos
Resistencias de pull-up/down en las entradas: puede (debe) programarse su conexión/desconexión.
REPASO
Digital Input
La entrada se muestrea con cada pulso (flanco ascendente normalmente) del clock, lo que ocasiona “metaestabilidad”:
Digital Input
Normalmente incorporan un Schmitt-trigger.
Para reducir la “metaestabilidad” se introducen “sincronizadores”
Digital Output
Apenas el DDR setea un pin como salida, el MCU excita el pin de acuerdo al contenido del registro PORT DATA (output) correspondiente.
Cuidado con los cortocircuitos
Orden de seteo de DDR y PORT
REPASO
Maquinas de estado finito en C/C++ (MEF/FSM)
Maquina de estado finito:
d
e
c
b
Inicialización
Evento/señal/Condición
a
Estado 1
Estado 2 Estado 3
REPASO
Uso de MEF en la implementacion de controladores digitales en C
Ventajas Modelo muy simple de plantear Provee una vista general, rápida y clara del Sistema modelado y sus
estados conceptuales Si el problema modelado es simple o habitual, permite reutilizar código o
estrategias y lograr una rápida implementación Desventajas Muy bajo nivel de especificación: no muestra comportamientos del Sistema
ocultos por el modelo El grado de sistematización en la implementación de la MEF es bajo: gran
parte del trabajo implementación debe definirse (resolverse) en el código. Esta resolución es muchas veces mas compleja que la realización del
modelo mismo. La falta de sistematicidad hace que la implementación no garantice el
comportamiento del Sistema tal cual el modelo.
REPASO
R
SW1
AR
SW1
V
A
SW2 . SW1
R/SW2
SW2 . SW1
L1
L2
L3 L4
L5 L6
T1
T4
T2
T3
Redes de Petri en c/c++
Dada una Red de Petri es posible implementarla en código C en forma sistemática.
El modelo debe estar libre de conflictos
Veremos dos metodologías. En ambas el código producido opera en 4 etapas:
1. Adquisición de las entradas
2. Análisis de las transiciones: para determinar aquellas sensibilizadas
3. Evolución del marcado de la red
4. Producción de las Salidas
En los ejemplos que siguen se asume la existencia de macros SW1, SW2, etc. que operan sobre los pines que corresponden
//Marcado inicial L1 = 1; L4 = 1; ... ... for(;;){
//se adquieren las entradas Ent1 = SW1; Ent2 = SW2; ... ... //se determina el estado de las transiciones T1 = L1 && Ent1; T2 = L2 && Ent2 && !Ent1; T3 = L3 && L4 && !Ent2 && Ent1; T4 = L5 && L6 && !Ent1; ...
Método 1: desarrollo del código a partir de la inspección directa de la red
R
SW1
AR
SW1
V
A
SW2 . SW1
R/SW2
SW2 . SW1
L1
L2
L3 L4
L5 L6
T1
T4
T2
T3
Método 1: desarrollo del código a partir de la inspección directa de la red
//evolución de la red según las reglas de marcado if (T1) {L1=0; L2=1;} if (T2) {L2=0; L5=1; L3=1;} if (T3) {L3=0; L4=0; L6=1;} if (T4) {L5=0; L6=0; L1=1; L4=1;} ... ... //producción de las salidas (SET R = L1 || R && Ent1 || L5; A = L2 || L6; V = L4; ... ...
}
R
SW1
AR
SW1
V
A
SW2 . SW1
R/SW2
SW2 . SW1
L1
L2
L3 L4
L5 L6
T1
T4
T2
T3
Pueden ir aquí otras acciones asociadas al franqueo de la transición
Método 2: desarrollo por variables y con código único
R
SW1
AR
SW1
V
A
SW2 . SW1
R/SW2
SW2 . SW1
L1
L2
L3 L4
L5 L6
T1
T4
T2
T3
En este método el programa ejecutado es siempre el mismo con independencia del modelo
La red se define mediante la matriz de incidencia, un vector de marcado y funciones de entrada y salida (por ejemplo en un .h)
Método 2: desarrollo por variables y con código único
R
SW1
AR
SW1
V
A
SW2 . SW1
R/SW2
SW2 . SW1
L1
L2
L3 L4
L5 L6
T1
T4
T2
T3
Archivo Petri.h
Método 2: desarrollo por variables y con código único
R
SW1
AR
SW1
V
A
SW2 . SW1
R/SW2
SW2 . SW1
L1
L2
L3 L4
L5 L6
T1
T4
T2
T3
Archivo Petri.h
Método 2: desarrollo por variables y con código único
R
SW1
AR
SW1
V
A
SW2 . SW1
R/SW2
SW2 . SW1
L1
L2
L3 L4
L5 L6
T1
T4
T2
T3
En el main() el código es siempre el mismo:
Implementación de Redes de Petri en C
Comparación entre los métodos El método 1 es mas simple cuando el modelo es simple.
El método 2 es mas estructurado y fácilmente escalable a modelos complejos
Ambos pueden adaptarse para pasar de un esquema de polling a uno por interrupciones. El método 2 es mas eficiente en este caso.
El método 2 permite cambiar modelos simplemente cambiando headers en un mismo proyecto: un proyecto -> muchas soluciones
El método 2 puede ser adaptado para resolver y funcionar con redes que presenten conflictos, facilitando la realización del modelo
Ambos pueden adaptarse muy sencillamente para trabajar con redes no binarias.
Redes de Petri versus MEF en la implementación de controladores digitales en C
Ventajas
El modelo bajo Redes de Petri es exhaustivo (sirve como especificación)
Permite una implementación sistemática
Las metodologías de implementación garantizan el comportamiento según el modelo
Posibilidad de generación automática del código
Desventajas
El modelo es mas complejo que con MEF
Interrupciones
Un programa sin uso de interrupiones (polling):
¿inconvenientes?
Procesar
Producir
salidas
. . .
do_init();
. . .
for (;;) {
do_inputs();
do_some_process();
set_outputs()
}
Inicializa-
ciones
Leer
entradas
Interrupciones
Con interrupciones:
Pueden no existir
Procesar
Producir
salidas
. . .
do_init();
. . .
interrupts_on;
for (;;) {
do_some_process();
set_outputs()
}
Atender
evento 1
Atender
evento 2
Atender
evento n. . .
Inicializa-
ciones
Interrupciones
Las interrupciones se generan cuando cambia un “estado”.
Permiten la reacción ante eventos
Restricciones de tiempo real
Polling vs. Interrupts
Interrupt Service Routine (ISR)
Interrupciones
Polling vs. Interrupts
Siempre hay que analizar la situación puntual, pero en general, usar interrupciones cuando:
Los eventos son infrecuentes
Hay mucho tiempo entre eventos
El cambio de estado es importante
Quiero detectar impulsos cortos
Hay eventos generados por hardware (no hay rebotes o picos)
Hay muy poco para hacer así que conviene estar en modo sleep
Interrupciones
Conviene “polear” cuando: El operador es humano
No se requiere una temporización precisa
El estado es mas importante que el cambio
Los “impulsos” duran mucho
Hay ruido en la señal
Hay cosas para hacer en el main (pero no demasiado)
Interrupciones
Control de Interrupciones Interrupt Enable (IE): bit que se setea para
habilitar al controlador que llame a la ISR cuando se produce el evento.
Interrupt Flag (IF): lo setea el MCU cuando se produce el evento. Se limpia automática o manualmente.
Interrupt mode (IM): mas de un bit para indicar si la interrupción se produce por flanco ascendente, descendente, nivel, etc.
Global Interrupt Enable.
Interrupciones
Control de Interrupciones Inhabilitar las interrupciones no implica perder
eventos.
Cuidado al limpiar la IF
Normal Interrupts and NMI
Interrupciones
Interrupt Vector Table: es una tabla donde se indica para cada interrupción en donde se encuentra la ISR que la atiende.
Puede contener la dirección de la primera instrucción de la ISR respectiva o una instrución jump (JSR) a la ISR (depende el MCU)
Interrupciones
Prioridades: fijas o variables
Dentro de una ISR se puede establecer cuales interrupciones se permiten (sin hacerlo “a mano” vía los IE)
Cancelación de ruidos (por muestras múltiples)
Eventos internos
Interrupciones
Pasos que ocurren ante una interrupción:
1. MCU setea la IF (esté o no habilitada la interrupción)
2. Se termina la instrucción en curso o si el MCU está en estado “sleep”, se despierta.
3. Se identifica la ISR considerando los IE y la interrupcion de mas alta prioridad (si hay mas de un IF seteado).
4. Se llama a la ISR (... y ya pasó un tiempito)
Ejemplo: Interrupciones en el MKL46Z256VLL4
NVIC
Registros NVIC:
NVIC_ISER: set enable
NVIC_ICER: clear enable
NVIC_IPRn: prioridad Ver:
Manual del referencia del KL46 (pag. 54)
ARM architecture v6m reference manual (pag. 281)
Registros PERIFERICOS
Ejemplo: Interrupciones en el MKL46Z256VLL4
También visible y seteable a través del registro:
Interrupt Status Flag Register (PORTx_ISFR)
En este caso sería el bit 3 del PORTC_ISFR
Ejemplo: Interrupciones en el MKL46Z256VLL4
Ejemplo: interrupciones en entrada digital
Habilitar interrupciones del PIN: por ejemplo, para el Port C pin 3 por flanco ascendente (SW1 del kit)-> PORTC_PCR3, bits IRQC
Ubicar en NVIC el vector a utilizar de acuerdo a la necesidad: por ejemplo, para el Port C es el vector 47
Ubicar para ese vector el puntero a la ISR (nombre de la función ISR): PORTCD_IRQHandler(). Aquí se pone el código que atiende el evento
Ubicar para el vector 47 el numero de IRQ y IPR: 31 y 7 respectivamente
Determinar los bits del NVIC_IPRn a configurar: NVIC_IPR7 bits PRI_N3 (puede dejarse por defecto en cero)
Habilitar las interrupciones con NVIC_ISER: la 31
(a partir de este paso el MCU empieza a reaccionar a los eventos)
Conversión Analógica-Digital (CAD)
Comparador: determina si V1 >V2 y arroja 1, ó 0 en caso contrario.
Conversión Analógica-Digital (CAD)
El numero de bits en la codificación determina la resolución del conversor.
Se puede muestrear a cualquier velocidad según la necesidad, pero si la aplicación requiere no perder información (ej: transmisión de video o audio) la velocidad de muestreo debe ser mayor o igual a dos veces la frecuencia máxima de la señal analógica (teorema de Nyquist-Shannon)
Además, hay que tener en cuenta el tiempo que puede llevar la conversión.
Y como la conversión lleva tiempo: para asegurar la estabilidad se usa una etapa de retención (sample-hold)
Conversión Analógica-Digital (CAD)
En la práctica el proceso es:
Filtro anti-aliasingMuestreo y Retención
Cuantificación y Codificación
Señal analógicax(t)
Limitación de ancho de banda
Varios métodos posibles
Conversión Analógica-Digital (CAD)
Métodos mas comunes de Conversión Analógica-Digital:
Integrador de simple/doble rampa
Directa (flash)
Seguidor (Tracking)
Aproximaciones sucesivas
Sigma-Delta
Conversión Analógica-Digital (CAD)
Directa (flash): muy rápida (1 bit time); muy cara
Este método de conversión rápido es utilizado en algunos MCU y por lo general, no hay mas de 1 o 2 canales “rápidos”.
Conversión Analógica-Digital (CAD)
Seguidor (tracking): muy lenta (2r bit times) y variable; barata.
Conversión Analógica-Digital (CAD)
Aproximaciones sucesivas: velocidad media y fija en r+1
Este es el método mas utilizado en MCUs
REPASO
Conversión Analógica-Digital (CAD)
Sigma-Delta (∑Δ) En vez de trabajar a la frecuencia de Nyquist,
sobremuestrean.
Esto disminuye el nivel de ruido de cuantificación permitiendo implementar conversores de 20 a 24 bits (con un diseño muy cuidado)
Pero la frecuencia de datos final es baja: se usan para convertir señales que requieran gran rango dinámico y bajas frecuencias (ej: vibraciones de terremotos o adquisiciones precisas de baja tasa en la industria)
Difícil encontrarlos dentro de un MCU
Conversión Analógica-Digital (CAD)
Sigma-Delta (∑Δ)
La señal digital obtenida queda conformada de manera que: Un “1” significa que ha habido un cambio positivo desde la última muestra Un “0” que ha habido un cambio negativo desde la última muestra
Conversión Analógica-Digital (CAD)
Sigma-Delta (∑Δ)
El filtro “decimador” promedia muestras de 1 bit a fs para obtener a fd muestras de mayor resolución. Por ejemplo: 1010010110001010 (16 muestras de 1 bit) Promedio=7/16 ≡ 0,4375=0111 (1 muestra de 4 bits)
Conversión Analógica-Digital (CAD)
Control del CAD
Habilitación
Tensión de Referencia
Entrada Salida (registro)
Conversion Complete
Start Conversion
Conversión Analógica-Digital (CAD)
Los MCU pueden tener varios CADs, con normalmente de 8 a 12 bits de precisión (KL46: 16 bits).
Cada CAD puede atender hasta16 o más entradas (canales).
Los canales se multiplexan (aumentan los tiempos).
Autoincremento: al leer un canal, se pasa al siguiente y se efectúa un SC automáticamente.
Existe el “modo contínuo” y de disparos sucesivos mediante el RTC
Una conversión puede “dispararse” por eventos como un timer, una variación de una entrada digital o una señal externa.
Ejemplo: CAD en el MKL46Z256VLL4
Linear successive approximation algorithm with up to 16-bit resolution
Up to four pairs of differential and 24 single-ended external analog inputs
Output modes: differential 16-bit, 13-bit, 11-bit, and 9-bit modes / single-ended 16-bit, 12-bit, 10-bit, and 8-bit modes
Output format in 2's complement 16-bit sign extended for differential modes
Output in right-justified unsigned format for single-ended
Single or continuous conversion
Configurable sample time and conversion speed/power
Conversion complete/hardware average complete flag and interrupt
Input clock selectable from up to four sources
Operation in low-power modes for lower noise
Asynchronous clock source for lower noise operation with option to output the clock
Selectable hardware conversion trigger with hardware channel select
Automatic compare with interrupt for less-than, greater-than or equal-to, within range, or out-of-range, programmable value
Temperature sensor
Hardware average function
Selectable voltage reference: external or alternate
Self-Calibration mode
Ejemplo: cad en el MKL46Z256VLL4
Configurar el CAD (solo algunas poibilidades) Habilitar reloj para el módulo: SIM_SCGC6 Seleccionar el reloj y divisor:ADC0_CFG1 Seleccionar la resolución: ADC0_CFG1 Seleccionar el tiempo muestra: ADC0_CFG1y ADC0_CFG2 Seleccionar el modo de conversión: soft o hard, por demanda o
continuo :ADC0_SC2 y ADC0_SC3 Seleccionar referencias: ADC0_SC2 Seleccionar la forma: de adquisición diferencial o simple: ADC0_SC1 Seleccionar si se va a trabajar por interrupciones o polling: ADC0_SC1 Seleccionar el canal a adquirir (si es necesario): ADC0_SC1
Adquisición Disparar la conversión: ADC0_SC1 Ver si la conversión se completó: ADC0_SC1(polling) ó procesar la ISR
(interrupción) Leer el valor: ADC0_RA
Timers
Son contadores que suben o bajan con cada pulso de reloj.
El valor actual se lee de un registro o se setea en el mismo.
Cuidado al acceder a timers con longitud de registro mayor a la palabra del MCU
Timers
Los timers generalmente generan una interrupción cuando hacen overflow
Esto sirve para generar señales o eventos periódicos (con acotada precisión)
Pueden tener una señal de clock independiente del MCU. Con ella se incrementa la cuenta.
Timers
Prescaler
Es otro contador (de 8 o 10 bits) que trabaja contra el clock y produce una salida que es la que entra al timer.
TIMERPRESCALER
CLK
Se logra una extension de tiempos a medir por la división del prescaler. Ejemplo:
8 bit timer, clock de 1 Mhz -> cuenta máxima 255 uS con una resolución de 1 uS
8 bit timer, clock de 1 Mhz, prescaler en 1024 -> cuenta máxima 260 ms con una resolución de 1 ms.
Timers
Otras fuentes de cuenta: Pulsos externos
Cristal externo: generlamente de 32.768 KHz que implementa otro RTC independiente en el MCU
Timestamp (input capture) Puede setearse un evento para que automáticamente se copie
el valor del contador en un registro de captura. Ejemplo: cuando un comparador cambia o una entrada cambia, tomar la cuenta.
Disparo de salida (output compare) Se setea en el timer una cuenta y cuando se alcanza,
automáticamente se levanta una salida, o similar.
Canales Un timer puede manejar varios canales de ic, oc o pwm.
Modulación de Ancho de Pulso (PWM)
Es un timer que genera una señal periódica de salida con período y ciclo de trabajo configurables
Modulación de Ancho de Pulso (PWM)
Además de su uso como CDA, los PWM se usan para controlar ABS en autos, niveles de iluminación en LCDs, control de motores, etc.
Ejemplo: Timers en el KL46
2-channel periodic interrupt timer (PIT)
Real time clock (RTC)
Low-power timer (LPT)
System tick timer (SysTick)
One 6-channel TPM/PWM
Two 2-channel TPM/PWM
Ejemplo: timers en el KL46
Periodic Interrupt Timer (hay 2)
Contadores de 32 bit que pueden ser encadenados (¡y contar con 64 bits!)
Generan una interrupción y un pulso al llegar a la cuenta
Muy simples de usar (ver ejemplo en pag. 596 del manual de referencia)
RealTimeClock (RTC)
Con dos registros: 32 bits (segundos) y 16 bits (prescaler) que sube con cada ciclo del oscilador de 32.768KHz)
Sigue trabajando en modo de bajo consumo y puede generar una interrupción para salir de él o producir una alarma en determinado tiempo.
Tiene muy buenas capacidades de compensación (hasta 0.12 ppm)
Low Power Timer
Temporizador o contador de pulsos de 16 bit
De bajo consumo y facil de usar
SysTick
Estándar de ARM (ver pag. 275 de la ref. ARMv6M)
Muy simple: (sólo 4 registros), trabaja con el clock del procesador y cuenta en 24 bits
Ejemplo: timers en el KL46
Módulos TPM en KL46
16 bits - Cuenta up o down
Reloj seleccionable: puede incrementarse con cada flanco del reloj asincrónico del módulo o en el flanco ascendente de un reloj externo (sincronizado con el asincrónico interno)
Prescaler: programable para dividir por 1, 2, 4, 8, 16, 32, 64, or 128
Modo de cuent alibre o con módulo
6 canales configurables para input capture, output compare, PWM
Input capture: en flaco ascendente, descendente o ambos.
Output compare: la salida se puede setear,(1) limpiar (0), invertir o generar un pulso
Cada uno de los canales PWM pueden configurarse como “edge-aligned” o “center-aligned”
Genera una interrupción o pedido de DMA por canal o por overflow
Otras características . . .
Ejemplo: timers en el KL46
Ejemplo de uso del SysTick:
Ver si utilizar o no el valor de calibración para 10 ms (si existe)
Setear el valor a contar: SYST_RVR
Resetear el valor actual: SYST_CVR
Habilita el timer indicando el reloj a utilizar y si se trabaja por interrupciones: SYST_CSR
Atender la interrupción: SysTick_Handler()
Ejemplo: timers en el KL46
Ejemplo de uso del TPM Descripción de los registros
(pagina 566 y siguientes del manual de referencia del KL46)
Pasos para configurar y usar TPM0 como temporizador general: 1. SIM_SCGC6: habilitar el clock 2. SIM_SOPT2: clock a utilizar para el TPM segun necesidad 3. TPM0_SC: limpiar TOF, desabilitar el TPM, seleccionar el prescalado según necesidad y
habilitar o no la generacion de interrupciones por overflow segun se trabaje por polling o interrupciones.
4. TPM0_CNT: a cero. 5. TPM0_MOD: con el valor necesario según necesidad. 6. TPM_CONF: segun necesidad (normalmente CSOO y CSOT a cero) 7. NVIC_ICPR y NVIC_ISER: si se trabajará por interrupciones 8. void CMP0_IRQHandler(): definirla si se trabaja por interrupciones (el tratamiento se
hace aquí. Recordad grabar 1 en TOF ) 9. TMP0_SC: habilitar el timer 10. Si se trabaja por polling, ver el estado de TOF en TMP0_SC y procesar segun
corresponda.
Top Related