Problema 3 de la convocatoria ordinaria curso 13/14 adaptado a Arduino UNO
Se quiere diseñar el control de un sistema de transporte de cajas basado en una cinta
transportadora utilizando el microcontrolador de referencia estudiado durante el curso.
La cinta transportadora tiene instalados dos sensores (uno a la entrada y otro a la salida) que
detectan el paso de las cajas y proporcionan un pulso (señal digital compatible con las
entradas digitales del microcontrolador) cada vez que pasa una. Se considera que ha entrado
una caja en la cinta cuando el micro recibe un flanco de subida del sensor de entrada y se
considera ha salido una caja de la cinta cuando el micro recibe un flanco de bajada del sensor
de salida.
Además el microcontrolador controla la marcha/parada de la cinta y una barrera que impide la
entrada de más cajas a la cinta. Este control se realiza con dos salidas digitales que se van a
denominar marcha y barrera.
En las figuras 3.1 y 3.2 se muestran respectivamente un esquema del sistema y un diagrama de
bloques del sistema microcontrolador en el que se indican las señales de entrada y de salida. El
oscilador del microcontrolador es de 16 MHz.
El funcionamiento ha de ser el siguiente:
En condiciones normales la cinta está en marcha (marcha=‘1’) y la barrera está subida
(barrera=‘0’).
No puede haber más de cuatro cajas en la cinta: en cuanto hay cuatro cajas la barrera
se baja y vuelve a subir cuando sale una caja.
Para detectar atascos u otro problema no pueden transcurrir más de 10 s desde que
entra una caja en la cinta hasta que sale. Si se supera ese tiempo se baja la barrera y se
para la cinta (de este estado de parada solo se sale de manera manual con un reset del
sistema).
Se pide (es necesario justificar todas las respuestas para poder tenerlas en cuenta en la
evaluación):
1. Identifique los recursos del microcontrolador (periféricos) que son necesarios para esta
aplicación.
2. Indique a que pines de la placa Arduino UNO conectaría las entradas y salidas del
sistema, sabiendo que los sensores van a generar interrupciones.
3. Escriba la rutina de configuración utilizando las funciones de referencia de Arduino.
En la figura 3.3 se representa el diagrama de flujo del programa principal que
continuamente actualiza las salidas. En base a este diagrama de flujo se deduce que las
entradas de los sensores (conectadas a entradas de interrupción externa) y el
temporizador se gestionan en las rutinas de atención a las interrupciones. En dicha figura
también se describen las variables globales que se utilizan.
4. Sabiendo que en el entorno Arduino el timer 0 se configura para generar una
interrupción periódica cada 1,024 ms. Describa los valores de los registros de
configuración de dicho timer.
5. Escriba las líneas de código en la rutina setup para habilitar las interrupciones de los
sensores.
6. Represente el diagrama de flujo de las rutinas de atención a las interrupciones externas,
donde se actualizan las variables N_cajas y Tcaja.
7. ¿Por qué en el diagrama de flujo del programa principal la condición de parada es “¿T-
Tcaja >= 10000”? Escriba las líneas de código con las que se puede programar esta
consulta.
Sensor Sensor
entrada salida
Cinta transportadora
Barrera
Figura 3.1. Esquema del sistema
Placa
ARDUINO UNO
Sensor marcha
entrada
Sensor barrera
salida
Figura 3.2. Diagrama de bloques del sistema microcontrolador
Inicio (reset)
Se inician las variables globales del sistema:
Configuración
- N_cajas: Guarda la información de
cuantas cajas hay sobre la cinta.
N_cajas = 0 - T: Guarda la información del tiempo
T=0 transcurrido (en múltiplos de un intervalo
Tcaja =0 de tiempo de referencia).
- Tcaja: Guarda la información actualizada
del tiempo de entrada de la primera caja
marcha = ‘1’ en la cinta (en múltiplos de un intervalo de
barrera = ‘0’ tiempo de referencia).
¿N_cajas > SI barrera = ‘1’
3?
nuevo
NO
barrera = ‘0’
NO
¿T – Tcaja >=
10.000?
SI
marcha = ‘0’
barrera = ‘1’
Figura 3.3. Diagrama de flujo del programa principal y descripción de variables globales
SOLUCIÓN:
1. Los recursos que se utilizan son los siguientes:
Dos pines como salidas digitales
Dos pines como entradas digitales
Un temporizador para llevar la cuenta del tiempo que permanecen las cajas en la cinta.
2. Los sensores tienen que ir a los pines digitales 2 y 3 porque son los asociados a las
interrupciones externas. Las salidas pueden ir a cualquier pin digital, evitando TX y RX de la
USART. Se elige:
Sensor entrada -> pin 2 (INT0)
Sensor salida -> pin 3 (INT1)
marcha -> pin 13
barrera -> pin 12
3. Para configurar las entradas y salidas se escribirían las siguientes líneas:
// these constants won't change:
const int sensorentradaPin = 2;
const int sensorsalidaPin = 3;
const int controlmarchaPin = 13;
const int controlbarreraPin = 12;
void setup() {
//Configuración de entradas y salidas
pinMode(sensorentradaPin, INPUT);
pinMode(sensorsalidaPin, INPUT);
pinMode(controlmarchaPin, OUTPUT);
pinMode(controlbarreraPin, OUTPUT);
//Continua setup con valores iniciales de pines y variables y
//configuración de las interrupciones externas
4. TCLK = 1/16 MHz = 62.5 ns
1,024 ms = 16384 * 62.5 ns -> 1,024 ms ≡ 16384 * TCLK
Necesito preescalado -> 16384/256 = 64
Se configura el timer 0 en modo normal para que cuente continuamente de 0 a 255 y produzca
una interrupción por everflow:
TCCR0A = B00000000 \\ modo normal
TCCR0B = B00000011 \\ reloj interno con preescalado 64
TIMSK0 = B00000001 \\ habilitada la interrupción por overflow
TIFR0 = 0 \\ flag de interrupción inicialmente a ‘0’
5.
void setup() {
//Configuración de entradas y salidas
//Continua setup con valores iniciales de pines y variables y
//configuración de las interrupciones externas
attachInterrupt(digitalPinToInterrupt(sensorentradaPin), EntraCaja, RISING);
attachInterrupt(digitalPinToInterrupt(sensorsalidaPin), SaleCaja, FALLING);
}
6. Diagramas de flujo
EntraCaja SaleCaja
(RAI) (RAI)
Incrementa N_cajas Decrementa N_cajas
Actualiza Tcaja
Almacena tiempo de (con los datos de
entrada de caja tiempo almacenados)
FIN FIN
7. En el entorno Arduino se puede utilizar la función millis () para obtener el número de
milisegundos transcurridos desde que se arrancó el sistema. El enunciado indica que hay que
comprobar si han transcurrido 10 segundos que equivale a 10.000 ms. El código será:
T = millis (); \\ obtiene el tiempo actual
while (T – Tcaja >= 10000) { // una vez que entra no sale hasta reset
digitalWrite(controlbarreraPin, HIGH);
digitalWrite(controlmarchaPin, LOW);
}
Problema 2 de la convocatoria ordinaria curso 16/17 adaptado a Arduino UNO
Se quiere diseñar un sistema de iluminación inteligente de una habitación utilizando una placa
Arduino UNO. El sistema de iluminación está formado por cuatro luminarias de LEDs cuya
intensidad se puede controlar de manera independiente mediante una señal de tipo PWM. La
habitación tiene varias ventanas y una claraboya, así que la iluminación natural es variable
dependiendo del día y de las horas del día. El objetivo es reducir la iluminación artificial por
zonas de forma automática dependiendo de la iluminación natural.
Para conocer el estado de iluminación de la habitación se han instalado seis sensores
distribuidos por la misma. La característica de los sensores es: salida en tensión de 0 a 5 V en el
rango de 0 a 500 lux.
El sistema de control cuenta además con un pulsador (estado normal abierto) que permite
cambiar el estado del sistema.
En la siguiente figura se muestra el esquema de conexiones con el microcontrolador. Preste
atención a las entradas y salidas que se utilizan porque es importante para contestar
correctamente a varias preguntas.
sensor 1 PC0
sensor 2 PC1 PWM1
PB3
sensor 3 PC2
PWM2
sensor 4 PC3
sensor 5 PC4 PWM3
sensor 6 PC5
PWM4
INT0
ATmega328P
Figura 2.1. Esquema simplificado de las conexiones del micro ATmega328P
Datos: la frecuencia del reloj del microcontrolador es Fosc = 16 MHz
Se pide (justifique todas las respuestas):
1.- ¿Qué pines de la placa Arduino UNO microcontrolador se utilizan y con qué función?
Utilizando la referencia del lenguaje Arduino, escribir las líneas de configuración de los pines
digitales. Haga lo mismo con instrucciones de bajo nivel.
2.- Para leer la información de los sensores se ha programado una función cuyo diagrama de
flujo se representa en la siguiente figura. Describa brevemente qué hace esta función.
¿Cuántas veces se repite el bucle? ¿qué función del entorno Arduino realiza las tareas
señaladas dentro del corchete?
3.- ¿Cuánto tiempo tarda la función en ejecutarse suponiendo que cada iteración tarda ocho
ciclos de CPU más el tiempo adquisición más el tiempo de conversión del ADC?. Datos: El
módulo ADC queda configurado en el entorno Arduino a 125 kHz. Consultar además tabla 24-1
de las hojas de características del microcontrolador.
i=0
Selección canal de
entrada analógico
Arranca conversión ADC
NO
¿Fin ADC?
Almacenar resultado
Incrementar i
NO
¿i=6?
FIN
Figura 2.2. Diagrama de flujo de la función para leer la información de los sensores
4.- ¿Qué resolución en la medida del flujo luminoso nos va a proporcionar el sistema?
5.- Escriba el código para la configuración de la interrupción externa, sabiendo que la Rutina de
Atención a la Interrupción solamente se debe ejecutar en el instante en el que se presiona el
pulsador.
Como puede verse en el sistema de conexiones, para realizar las pruebas del sistema
inicialmente todas las luminarias se controlan por la misma señal PWM. La funcionalidad
mínima del sistema de pruebas ha de ajustar el ciclo de trabajo de la señal PWM en función del
promedio de la lectura de los sensores. Además el sistema de iluminación debe cambiar de
estado cada vez que se aprieta el pulsador. Los posibles estados del sistema de iluminación
son: (1) Control automático, (2) Luces apagadas y (3) Luces encendidas. Cada vez que se pulsa
se debe pasar al siguiente estado, pasando del (3) al (1).
6.- Representar el diagrama de flujo de un programa que la lectura de los sensores se debe
realizar cada 0.5 segundos.
SOLUCIÓN:
1.- En el sistema de la figura 2.1 se representan 6 entradas analógicas que se han de conectar a
los pines A0, A1, A2, A3, A4 y A5 de la placa Arduino UNO.
El pulsador se conecta a la entrada de la interrupción externa 0. Esta entrada es el pin 2 de la
placa Arduino UNO que se ha de configurar como entrada digital con resistencia de pull-up
activada.
La salida por la que se genera la señal PWM es el pin 3 del puerto B del microcontrolador que
corresponde al pin 11 de la placa Arduino UNO.
La configuración de los pines digitales utilizando las funciones de arduino es:
pinMode(2, INPUT_PULLUP);
pinMode(11, OUTPUT);
La configuración programando a bajo nivel sería:
DDRD &= ~( 1 << 2); //Configura como entrada el pin 2
PORTD |= 1 << 2; //Activa pullup en el pin 2
DDRB |= 1 << 3; //Configura como salida el pin 11
2.- Esta función lee consecutivamente varias entradas analógicas utilizando el módulo ADC del
microcontrolador. Se realizan 6 iteraciones del bucle para leer los seis sensores. La función de
Arduino que realiza las tareas señaladas es:
analogRead (pin)
3.- Con un oscilador de 16 MHz, el tiempo de ciclo de CPU es 1/16MHz = 62.5 ns
Cuando arranca una conversión del ADC, ésta termina transcurrido el tiempo de adquisición
del S&H más el tiempo de conversión. Según los datos de la tabla 24-1 (normal conversions)
estos tiempos corresponden con 1.5 y 13 ciclos del reloj de ADC respectivamente. El tiempo de
ciclo del ADC es 1/125kHz = 8 µs.
Cada iteración dura por tanto 8x62.5 ns + 14.5x8 µs = 116.5 µs.
Y el total de la función con 6 iteraciones tarda 699 µs.
4.- El ADC del micro de la placa Arduino UNO es de 10 bits y se puede configurar con rango de
entrada de 0 a 5 V, que coincide con el rango de tensiones de salida de los sensores utilizados.
La resolución es 500 lux / 1023 = 0.489 lux
5.- attachInterrupt (digitalPinToInterrupt(2), ISR, FALLING)
6.- Diagrama de flujo:
Inicio
Setup
NO NO
¿Est. 1? ¿Est. 2?
Generar PWM Generar PWM
NO
Pasados con DC = 0 con DC = 100
0,5 s?
Leer sensores
Generar PWM con DC
proporcional a promedio
de lecturas
RAI
Cambiar estado
FIN
Problema 2 de la convocatoria extraordinaria curso 13/14 adaptado a Arduino UNO
Se pretende medir la velocidad del viento con un anemómetro, representado
esquemáticamente en la figura, conectado al microprocesador de la asignatura. Despreciando
los errores debidos a la inercia de las aspas y al rozamiento, la velocidad del viento es
proporcional a la velocidad angular del anemómetro.
Figura. Esquema de funcionamiento del anemómetro
El anemómetro tiene dos imanes en el eje rotativo y un sensor magnético montado en la parte
fija. El sensor magnético genera un pulso cada vez que el imán pasa por delante, de modo que
la frecuencia de la señal generada es proporcional a la velocidad del viento. El interruptor del
sensor está normalmente cerrado, de modo que la forma de onda en Anem_Out es
normalmente 0V, con dos pulsos cortos a tensión Vcc por cada vuelta de las aspas.
La relación entre la velocidad del viento y la velocidad de giro del anemómetro es tal que 20Km/h
se corresponden con 100 vueltas/s. El valor de la medida se quiere mostrar en una barra de 5
LEDs, de acuerdo con la siguiente tabla:
El valor que se quiere representar será la velocidad media de la velocidad del viento calculada
cada 5s.
1. Explique cómo va a medir la velocidad de giro del anemómetro, para obtener la velocidad del
viento en Km/h.
2. Identifique los recursos (periféricos) del microcontrolador que son necesarios para el sistema
incluyendo los pines que se van a utilizar para conectar el sensor y los LEDs.
3. Indique los valores de todos los registros asociados a los pines de entrada y salida tras la rutina
de setup.
4. Indique qué temporizadores va a utilizar e indique los valores de configuración de todos los
registros asociados a ellos.
5. Explique si va a programar el microcontrolador utilizando las interrupciones y en caso
afirmativo, indique cuál o cuáles son las fuentes de interrupción. Describa el programa en forma
de un diagrama de flujo.
SOLUCIÓN:
En este ejemplo de problema la solución está abierta, lo que se va a aprovechar para discutir
posibles alternativas para su implementación basadas en los periféricos y sus modos de
funcionamiento que se han visto en la asignatura. También conocemos alternativas de
programación utilizando las funciones del entorno Arduino y la programación a bajo nivel del
microcontrolador de la placa Arduino UNO (Atmega328U).
¿Qué tiene que hacer el micro en base al enunciado?
Tiene que contar el número de pulsos de la señal Anem_Out durante 5 s y, en función del
número de pulsos, encender entre 1 y 5 leds.
Para saber cuántos leds se han de encender recurrimos a la tabla y a la característica del
anemómetro que indica que 20km/h se corresponden con 100 vueltas/s y que en Amen_Out se
generan dos pulsos por vuelta.
Vel. [km/h] Vueltas/s Pulsos/s Pulsos cada 5 s # leds
0 0 0 0 1
5 25 50 250 2
20 100 200 1000 3
40 200 400 2000 4
60 300 600 3000 5
80 400 800 4000 5
¿Qué entradas y salidas tenemos en el micro?
Independientemente de la solución hay que conectar cinco pines que sean salida digital (para
los leds) y una entrada digital para la señal Anem_Out. Esta entrada digital no necesita
resistencia de pull-up puesto que en la figura aparece una resistencia de pull-up externa.
Dependiendo de la solución elegida esta entrada digital ha de ser un pin concreto del
microcontrolador y, por tanto, de la placa Arduino UNO.
A continuación se proponen distintas alternativas para la solución:
OPCIÓN 1: Conectar Anem_Out a una entrada de interrupción externa y control del tiempo
mediante la función millis () del entorno Arduino.
OPCIÓN 2: Conectar Anem_Out a una entrada de reloj del timer 1 y control del tiempo mediante
una de las funciones de tiempo del entorno Arduino.
OPCIÓN 3: Conectar Anem_Out a una entrada de reloj del timer 1 y control del tiempo exacto
mediante la configuración a bajo nivel de una interrupción periódica en el timer 2.
Se responde a las preguntas 1 a 5 dependiendo de cada opción:
OPCIÓN 1: Conectar Anem_Out a una entrada de interrupción externa y control del tiempo
mediante la función millis () del entorno Arduino.
1.- Se va a habilitar la interrupción externa así cada vez que se genere un pulso en la señal
Anem_out el micro ejecuta una rutina de atención a la interrupción (RAI). La RAI lo que tiene
que hacer es incrementar una variable global que lleva la cuenta del número de interrupciones
(pulsos) generados. La declaración de esta variable global sería:
unsigned int NumeroPulsos = 0;
Se elige de este tipo porque solo puede tomar valores positivos con rango de 0 a 4000 (ver tabla
anterior con los cálculos).
En el programa principal se comprueba si han pasado 5000 ms, cuando ya han pasado se
consulta el valor de la variable NumeroPulsos lo que da la velocidad del viento.
2.- Se usan 5 pines como salida digital para conectar los leds. Se eligen los pines 8, 9, 10, 11 y 12
de la placa Arduino UNO que se corresponden con los pines 0, 1, 2, 3 y 4 del puerto B del
microcontrolador.
- Se usa un pin como entrada digital (resistencia de pull-up no necesaria dado el circuito que
genera la señal Anem_out) asociado a una de las dos entradas de interrupción externa. Se elige
el pin 2 de la placa Arduino UNO asociado a la entrada del micor INT0.
- Se usa el timer 0 para llevar la cuenta del tiempo, ya que es el temporizador que se configura
en el entorno Arduino.
3. DDRB = B00011111 // bits 0 a 4 salidas, bits 5 a 7 entradas (valor por efecto)
DDRD = B00000000 //INT0(PD2) entrada , resto entradas por defecto
PORTD = B00000000 //No se activan las pull-up
4.- Se usa solamente el timer 0 en la configuración de Arduino, en la que genera una interrupción
cada 1,024 ms:
TCCR0A = B00000000 \\ modo normal
TCCR0B = B00000011 \\ reloj interno con preescalado 64
TIMSK0 = B00000001 \\ habilitada la interrupción por overflow
TIFR0 = 0 \\ flag de interrupción inicialmente a ‘0’
5.- Sí se usan interrupciones, las fuentes de interrupción son el overflow del timer 0 (cada 1,024
ms) y la interrupción externa 0. El diagrama de flujo será:
Inicio
RAI RAI
Setup timer 0 INT0
Actualizar
milisegundos NumeroPulsos ++
NO
Pasados transcurridos
5000 ms?
FIN FIN
Encender leds según valor
de NumeroPulsos
NumeroPulsos = 0
Comentarios:
El entorno de desarrollo Arduino siempre configura el timer 0 para generar una interrupción
periódica por overflow cada 1,024 ms. Si en la función set up se cambia la configuración del
timer 0 las funciones millis () y micros () dejarán de funcionar como se espera.
(ver wiring.c en …\Arduino\hardware\arduino\avr\cores\arduino\wiring.c)
La RAI asociada al overflow del timer 0 en el entorno Arduino calcula el número de milisegundos
transcurridos desde el inicio hasta la interrupción. Por ese motivo el valor que devuelve la
función millis () tiene una incertidumbre de aproximadamente 1 ms.
La función micros () del entorno Arduino es una alternativa a la función millis (). La ventaja de
micros () es que tiene una resolución mayor (4 us) ya que en su código lee el valor del registro
contador del timer 0 (registro TCNT0).
OPCIÓN 2: Conectar Anem_Out a una entrada de reloj del timer 1 y control del tiempo mediante
una de las funciones de tiempo del entorno Arduino.
1.- Se va a utilizar el timer/counter 1 para incrementarse cada vez que se genere un pulso en la
señal Anem_out. En el programa principal se comprueba si han pasado 5000 ms, cuando ya han
pasado se consulta el valor del registro contador del timer 1 (TCNT1) lo que da la velocidad del
viento.
2.- Se usan 5 pines como salida digital para conectar los leds. Se eligen los pines 8, 9, 10, 11 y 12
de la placa Arduino UNO que se corresponden con los pines 0, 1, 2, 3 y 4 del puerto B del
microcontrolador.
- Se usa un pin como entrada digital (resistencia de pull-up no necesaria dado el circuito que
genera la señal Anem_out). Este pin necesariamente ha de ser la entrada de reloj externa al
timer 1 que es el pin 5 de la placa Arduino UNO. Este pin se corresponde con el pin T1 (PD5) del
microcontrolador.
- Se usa el timer 0 para llevar la cuenta del tiempo, ya que es el temporizador que se configura
en el entorno Arduino.
3. DDRB = B00011111 // bits 0 a 4 salidas, bits 5 a 7 entradas (valor por efecto)
DDRD = B00000000 //INT0(PD2) entrada , resto entradas por defecto
PORTD = B00000000 //No se activan las pull-up
4.- Se usa el timer 0 en la configuración de Arduino, en la que genera una interrupción cada
1,024 ms:
TCCR0A = B00000000 \\ modo normal
TCCR0B = B00000011 \\ reloj interno con preescalado 64
TIMSK0 = B00000001 \\ habilitada la interrupción por overflow
TIFR0 = 0 \\ flag de interrupción inicialmente a ‘0’
También se usa el timer 1 como contador de pulsos de una señal externa
TCCR1A = B00000000 \\ desconectados los pines de salida asociados
TCCR1B = B00000111 \\ Modo 0 (normal), reloj externo en flanco subida
TIMSK1 = B00000000 \\ Ninguna interrupción habilitada del timer 1
5.- Sí se usan interrupciones, la única fuente de interrupción es el overflow del timer 0 (cada
1,024 ms). El diagrama de flujo será:
Inicio
RAI
Setup timer 0
Actualizar
milisegundos
NO
Pasados transcurridos
5000 ms?
FIN
Encender leds según valor
de TCNT1
TCNT1 = 0
Comentarios:
El diagrama de flujo del programa principal de esta opción es muy parecido al de la anterior. La
principal diferencia es que antes el número de pulsos está en una variable (memoria de datos
del procesador) y es el programa el que incrementa esta variable. En esta solución los pulsos se
acumulan en un contador hardware.
Ha sido una buena elección el timer 1 ya que el de 16 bits y por tanto puede almacenar hasta
65535 pulsos sin overflow.
Ver ejemplo Blink With Out Delay (https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay)
para uso de la función millis (). El uso de la función micros () sería similar.
OPCIÓN 3: Conectar Anem_Out a una entrada de reloj del timer 1 y control del tiempo exacto
mediante la configuración a bajo nivel de una interrupción periódica en el timer 2.
1.- Se va a utilizar el timer/counter 1 para incrementarse cada vez que se genere un pulso en la
señal Anem_out. En el programa principal se comprueba si han pasado 5 s, cuando ya han
pasado se consulta el valor del registro contador del timer 1 (TCNT1) lo que da la velocidad del
viento. En este caso para saber si han transcurrido 5 s se configura un timer (timer 2) para
generar una interrupción periódica, el tiempo de interrupción ha de ser un múltiplo entero del
tiempo que queremos, en este caso de 5 s.
2.- Se usan 5 pines como salida digital para conectar los leds. Se eligen los pines 8, 9, 10, 11 y 12
de la placa Arduino UNO que se corresponden con los pines 0, 1, 2, 3 y 4 del puerto B del
microcontrolador.
- Se usa un pin como entrada digital (resistencia de pull-up no necesaria dado el circuito que
genera la señal Anem_out). Este pin necesariamente ha de ser la entrada de reloj externa al
timer 1 que es el pin 5 de la placa Arduino UNO. Este pin se corresponde con el pin T1 (PD5) del
microcontrolador.
- Se usa el timer 2 para llevar la cuenta del tiempo. Consultando las hojas de características se
puede ver que el tiempo máximo de overflow del timer 2 es 256 (ya que es de 8 bits),
multiplicado por 1024 (que es el preescalado máximo) y multiplicado por 1/16 MHz (que es el
periodo de la señal de reloj de la placa Arduino UNO). Resulta tmax_ov =256*1024*62,5 ns =
16,384 ms.
Se decide que el timer 2 genere una interrupción periódica cada 4 ms. En la RAI asociada al timer
2 se incrementará una variable que, cuando llegue a 1250 habrán transcurrido 5 s.
3. DDRB = B00011111 // bits 0 a 4 salidas, bits 5 a 7 entradas (valor por efecto)
DDRD = B00000000 //INT0(PD2) entrada , resto entradas por defecto
PORTD = B00000000 //No se activan las pull-up
4.- Se usa el timer 1 como contador de pulsos de una señal externa
TCCR1A = B00000000 \\ desconectados los pines de salida asociados
TCCR1B = B00000111 \\ Modo 0 (normal), reloj externo en flanco subida
TIMSK1 = B00000000 \\ Ninguna interrupción habilitada del timer 1
Se usa ahora el timer 2 para generar una interrupción cada 4 ms. Para ello se elige el modo
compara con autoreset (modo CTC) y se activa la interrupción por comparación. Las cuentas
para la configuración son:
- 4 ms equivalen a pulsos del reloj (la cuenta es 4 ms * 16 MHz = 64.000)
- Necesito preescado mayor de 64.000/256 = 250 (porque el timer es de 8 bits)
- El preescalado posible más cercano es 256 (ver tabla 18-9 del data-sheet)
La configuración de los registros es:
TCCR2A = B00000010 \\ modo normal
TCCR2B = B00000110 \\ reloj interno con preescalado 256
OCR2A = 250 \\ número de cuentas (ticks) para comparar
TIMSK2 = B00000010 \\ habilitada la interrupción por “coincide”
TIFR2 = 0 \\ flag de interrupción inicialmente a ‘0’
5.- Sí se usan interrupciones, la fuente de interrupción es el evento compara del timer 2 (cada 4
ms). El diagrama de flujo será:
Inicio
RAI
timer 2
Setup
Cuenta ++
NO NO
¿Muestra ¿Cuenta
Leds = 1? FIN
= 1250?
Velocidad [km/h] = TCNT1 / 50
Encender leds
según Velocidad
Cuenta = 0
MuestraLeds = 0
FIN