Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INGENIERIA ELECTRICA
INTEGRANTES
Calificación: ___________
JLDM Página 1 de 11
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 12
OBJETIVOS:
a) Manejo del software de programación ATMEL Studio o Arduino IDE, para configuración
del microcontrolador ATMEGA328P y ESP32.
b) Configuración de registros del microcontrolador ATMEGA328P y ESP32.
c) Manejo de la herramienta de desarrollo Arduino UNO y ESP32 TTGO, en la configuración
del uso del Timer.
Introducción teórica
El Arduino tiene grandes habilidades y características de hecho, el idioma, la velocidad, el fácil de usar, el
gran tablero de desarrollo, la documentación, el precio, y la capacidad de interfaz a una gran cantidad de
dispositivos y programas. Usted no llegará a saber cuán grandes son estas características, hasta que utilice
el Arduino con la capacidad máxima. En la serie: "Arduino: empujando los límites" trataré de mostrar
cómo puedes maximizar las habilidades del Arduino, y usarlo de una manera mejor y más inteligente,
aumentando las habilidades, flexibilidad, confiabilidad de tus proyectos y haciéndolos Fácil de rehacer.
En este espacio, los temporizadores Arduino se explica cómo funcionan, y cómo usarlos; Dando algunos
ejemplos simples y demostrando algunos beneficios para usarlos.
Después se debe ser capaz de hacer un mayor proyecto con más código flexible y detallado, con lo que se
tendrá más habilidades para agregar a un proyecto más elaborado.
Un ejemplo que se realizará con la función de Temporizadores en el Arduino, el "Timed Plug-In" es un
proyecto simple que puede ser programado para una duración específica.
¿Alguna vez has pensado cómo Arduino llega a conocer el tiempo! Quiero decir, ¿cómo el arduino sabe
cuánto debe esperar a retrasar por 100 ms por ejemplo, o cómo el tiene que cortar la señal de 5V para la
salida de una señal específica PWM!
La respuesta a esto radica en conocer la arquitectura de los MCU, no voy a hablar de la arquitectura aquí,
¡es suficiente mencionar que el Arduino tiene algo así como el corazón. Genera pulsos (un pulso en el
Arduino significa algo así como un paso que el Arduino toma para realizar una tarea), con velocidad
específica, su cristal y su velocidad es de 16 MHz. De este hecho podemos decir que el pulso viene con
tiempo específico = (1 / 16M) s. Esto significa que hay una duración constante entre cada dos
impulsos. Dependiendo de esto, si calculamos los pulsos con un contador, podemos obtener tiempo real,
conociendo los contadores.
La parte de hardware que hace la tarea de conteo en el arduino llamado Timer. Su aumento de un contador
con una tasa específica, de tal manera que cada cuenta da un tiempo, conocer el valor del contador le
permiten saber cuánto tiempo ha pasado.
JLDM Página 2 de 11
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 12
Los detalles se explicarán en los próximos pasos. Para saber que acabo de explicar cómo trabaja el
temporizador y cómo el Arduino lo utiliza para saber el tiempo.
En el siguiente paso hablaré del temporizador en el Arduino.
Temporizador Arduino
El temporizador en una MCU es un registro, consiste en un número específico de bits, en el arduino, y voy
a tomar el arduino uno como un ejemplo aquí, hay 3 temporizadores llamados: timer0, timer1, timer2. Se
extienden a temporizador 3,4, y 5 con mega.
Temporizador0:
Timer0 es un temporizador de 8 bits.
En el mundo Arduino se utiliza timer0 para las funciones del temporizador, como delay (), millis () y
micros (). Si cambia los registros timer0, esto puede influir en la función del temporizador Arduino. Así
que usted debe saber lo que está haciendo.
Temporizador1:
Timer1 es un temporizador de 16 bits.
En el mundo de Arduino la biblioteca servo usa timer1 en Arduino Uno (timer5 en Arduino Mega).
Timer2:
Timer2 es un temporizador de 8 bits como timer0.
En el trabajo de Arduino, la función tone () utiliza timer2.
Timer3, Timer4, Timer5:
El temporizador 3,4,5 sólo está disponible en las placas Arduino Mega. Estos temporizadores son todos los
temporizadores de 16 bits.
En este espacio se va a hablar sobre el uso de temporizador 1 y 2 como un ejemplo de 16 bits y 8 bits
temporizadores.
Usted debe saber que, básicamente, es un registro, el sistema de temporizador consta de múltiples registros,
los que sostienen el contador y los que sostienen los ajustes y las funciones.
Puede cambiar el comportamiento del temporizador a través del registro del temporizador. Los registros de
temporizador más importantes son:
JLDM Página 3 de 11
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 12
TCCRx - Registro del temporizador / control del contador. El prescaler se puede configurar aquí.
TCNTx- Timer / Contador de Registro. Aquí se almacena el valor actual del temporizador.
OCRx - Salida Comparar Registro
ICRx - Registro de captura de entrada (sólo para temporizador de 16 bits)
TIMSKx - Registro de máscara de interrupción del temporizador / contador. Para activar / desactivar las
interrupciones del temporizador.
TIFRx - Registro del indicador de interrupción del temporizador / contador. Indica una interrupción del
temporizador pendiente.
Ahora voy a describir el proceso con el que el temporizador será configurado.
Primero debe tener en cuenta que:
El primer registro, TCNTx es el registro que maneja el valor del temporizador real, cuando queremos
saber qué valor del temporizador se ha alcanzado leeremos ese registro. También podemos utilizar este
registro para precargar el temporizador con algún valor, ¡por una simple razón. Para asegurarnos de que la
duración de la interrupción del temporizador está ajustada a un valor específico con el que podemos lidiar,
lo veremos con los ejemplos.
Tenga en cuenta que la notación "x" se refiere al número de temporizador utilizado, (si trabajamos
con el temporizador 0 entonces x es 0: TCNT0)
El registro TIMSKx se utilizará para activar o desactivar las interrupciones del temporizador, la definición
de las interrupciones se ilustrará en el siguiente paso.
TCCRx este registro se utilizará para establecer el prescaler, el prescaler se puede ilustrar algunos como
con un número de cuentas seleccionadas que el temporizador tiene que hacer para aumentar su valor en 1.
Así que si el prescaler se establece en 10 por ejemplo, entonces cada 10 relojes temporizadores el valor del
contador del temporizador aumentará en 1. un valor de prescaler más grande, el tiempo más largo que el
contador del contador de tiempo puede lograr antes de sobreflujo.
Selección del reloj y frecuencia del temporizador
Se pueden seleccionar diferentes fuentes de reloj para cada temporizador independientemente. Para calcular
la frecuencia del temporizador (por ejemplo 2Hz usando el temporizador1) necesitará:
1. Frecuencia de CPU 16Mhz para Arduino
2. valor del contador del temporizador máximo (256 para 8 bits, 65536 para el temporizador de 16 bits)
3. Divida la frecuencia de la CPU a través del prescaler elegido (16000000/256 = 62500)
4. Divida el resultado a través de la frecuencia deseada (62500 / 2Hz = 31250)
5. Compruebe el resultado con respecto al valor máximo del contador del temporizador (31250 <65536
éxito) si falla, elija un prescaler más grande.
Con estos pasos usted puede calcular la frecuencia del contador de tiempo para cualquier frecuencia que
usted quiere, de la maldición usted puede cambiar el prescaler a cualquier valor que usted desea.
Para un temporizador de 8 bits, el proceso es el mismo, la única restricción es que el valor tiene que ser
menos el 256. por lo que debe utilizar grandes prescaler, y de alta frecuencia. Por lo general es mejor usar
temporizador de 16 bits, en arduino mega no hay problema con eso, hay 4 temporizadores con 16bits, el
problema aparece con arduino uno, sólo hay timer1 viene con 16 bits, si está utilizando Servo biblioteca o
cualquier biblioteca Que basado en timer1 no será capaz de utilizarlo, y las funciones de interfaz entre sí,
por lo que a veces tendrá que utilizar un temporizador de 8 bits.
En este documento habrá un ejemplo para el uso de temporizador de 8 bits con bajas frecuencias.
JLDM Página 4 de 11
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 12
Interrupción de Arduino
JLDM Página 5 de 11
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 12
/*
* Temporizador e interrupciones
* 2: Ejemplo de interrupción con el desbordamiento del Timer1
* /
edterm 13
#define L
void setup ()
{
PinMode (Ledterm, OUTPUT); // inicializar timer1
NoInterrupts (); // deshabilitar todas las interrupciones
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 34286; // temporizador de precarga 65536-16MHz / 256 / 2Hz
TCCR1B | = (1 << CS12); // 256 prescaler
TIMSK1 | = (1 << TOIE1); // habilita la interrupción por desbordato del Iimer1
Interrupts (); // activar todas las interrupciones
}
ISR(TIMER1_OVF_vect) // interrupción de la rutina de servicio que envuelve
//una función definida por el usuario suministrada por
//attachInterrupt
{
TCNT _ {1} = 34286; // temporizador de precarga
DigitalWrite (ledPin, digitalRead (ledPin) ^ 1);
}
JLDM Página 6 de 11
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 12
void loop ()
{
//Escribir el programa a ejecutar de forma principal aquí ..
}
Primero se configura el temporizador, se utilizan los registros principales,
TCCRx, para configurar el prescaler.
TCNTx, para precargar el temporizador
TIMSKx, para habilitar la interrupción del temporizador que desea.
Entonces usted escribe el código ISR de interrupción para ser llamado.
En este ejemplo, el prescaler se establece en 256. En primer lugar, el código llama:
TCCR1A = 0;
TCCR1B = 0;
Esto simplemente borrará el registro de presacler.
Entonces usted está listo para configurarlo. Con esta línea:
TCCR1B | = (1 << CS12);
Consulte la tabla, si establece el bit "CS12" en 1 y los otros son 0, el prescaler se establece en 256.
Aquí debe tener en cuenta:
● De esta manera el prescaler se ha fijado a un valor, usted refiere a la tabla a la configuración de CS12,
11, 10, y lo fija para arriba.
● Llenar el registro con valores se puede hacer de dos maneras:
● Por darle un valor directo como: "TCCR1A = 0;" De esta manera usted tiene que saber el número
de bit de registro y saber cómo desea llenar a continuación, convertir los bits a decimal o HEX a
continuación, establecerlo en el registro.
● La otra manera es llenar el un solo bit a la vez. Esto se puede hacer con matemáticas bit a bit.
● Para leer sobre matemáticas bit a bit: O
peración bit a bit
● Aprender sobre bit a bit en arduino: Bitwise.
● Podemos hacerlo mediante una operación matemática bit a bit para cambiar el estado digital del bit
a 0 ó 1, usando los operadores bit a bit.
● El operador (|) significa "o", en m digital cualquier cosa comparada con "o" operador con "1" el
resultado es 1, por lo que usaremos esto para cambiar el estado digital de un bit a 1. de maldecir el
proceso (| =) Es como el proceso de suma o resta cuando decimos (x + = 1 como ejemplo).
● El operador (<<) desplaza un valor dado por un número dado a la izquierda, como este (1 << 5: el
valor 1 será desplazado por 5 bits).
● Por lo que el proceso TCCR1B | = (1 << CS12); Ajuste el bit CS12 en el registro TCCR1B a digital
1.
JLDM Página 7 de 11
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 12
Contador de segundos
En algunos proyectos, es posible que desee crear un contador que calcule el tiempo desde el inicio de un
evento. Los segundos desde el inicio del programa, por ejemplo. De la medición como el tiempo hay que
emplear la función (millis ()) en el lenguaje de arduino que obtener el tiempo en ms desde el inicio del
proyecto, pero algunas veces no podemos usarlo en nuestro procedimiento y otras veces es difícil de usar
de la manera correcta. Esta es una forma alternativa de calcular los segundos desde el inicio del programa o
cualquier evento.
Para calcular cualquier tasa de tiempo no sólo segundos, sólo es mediante la manipulación de los
parámetros de código con la forma correcta, como ejemplo.
JLDM Página 8 de 11
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 12
EL timer1 (16Bits) para generar una interrupción con frecuencia de 1Hz (duración de 1 segundo). En el
ISR habrá una variable de contador global, que se utilizará para contar los segundos en el ISR para luego
usarlo en el código principal.
El procedimiento es simple, y el cálculo del temporizador de precarga es muy simple.
int secondCounter = 0;
void setup ()
{
// ** Inturrubts **
NoInterrupts (); // deshabilitar todas las interrupciones
TCCR1A = 0;
TCCR1B = 0;
TCNT _ {1} = 3036; // temporizador de precarga 65536-16MHz / 256 / 1Hz
TCCR1B | = (1 << CS12);
TCCR1B | = (1 << CS10); // 1024 prescaler
TIMSK1 | = (1 << TOIE1); // habilitar la interrupción del desbordamiento del
// temporizador
Interrupts (); // activar todas las interrupciones
}
ISR (TIMER1_OVF_vect) // interrupción de la rutina de servicio que envuelve
// una función definida por el usuario suministrada
// por attachInterrupt
{
TCNT _ {1} = 3036; // temporizador de precarga
SegundoContador ++;
}
Void loop ()
{
// Escribir el programa a ejecutar de forma principal aquí ..
}
Segundo Contador
Mostraré aquí algunos usos del segundo contador hecho por el temporizador.
● Un uso es ejecutar otro código en el fondo que necesita ser llamado con frecuencia específica.
Usted acaba de agregar sus funciones en el ISR, un ejemplo es parpadear un LED, o puede utilizar la
función Serial.println para imprimir los segundos desde el inicio del código como función de fondo.
● Con este contador puedes hacer un procedimiento, que hace que tu código se repita con una duración
específica.
Vea el siguiente código, por favor lea atentamente las notas.
int secondCounter = 0;
int = 5; // puede establecer la duración que desee.
// de medición es lógico establecer una duración mayor que tu
// "código", o la técnica no funcionará como debería
Void setup ()
{
// ** Inturrubts **
NoInterrupts (); // deshabilitar todas las interrupciones
TCCR1A=0;
TCCR1B=0;
TCNT_{1}=3036; // temporizador de precarga 65536-16MHz / 256 / 1Hz
TCCR1B |= (1<<CS12);
JLDM Página 9 de 11
CARRERA DE INGENIERIA ELECTRICA.
Prácticas de Laboratorio de Electrónica III. Practica No. 12
TCCR1B |= (1<<CS10); // 1024 prescaler
TIMSK1 |= (1< TOIE1); // habilitar la interrupción del desbordamiento del timer1
Interrupts (); // activar todas las interrupciones
}
ISR (TIMER1_OVF_vect) // interrupción de la rutina de servicio que envuelve una
// función definida por el usuario suministrada por
// attachInterrupt
{
TCNT _ {1} = 3036; // temporizador de precarga
SegundoContador ++;
If (secondCounter == duration)
{
SegundoCounter = 0;
}
// no es la única manera de hacerlo, puede usar el
// operador% (mod) y dejar que el contador de tiempo
// aumente normalmente, con el modo puede hacer la
// condición (secondCounter% duration == 0)
}
Void loop ()
{
If (secondCounter == 0) // cada vez que el contador alcanza la duración (5)
// regresa a 0 y la condición es verdadera.
{
// Escribir el programa a ejecutar de forma principal aquí ..
}
}
Puede usarlo para realizar un procedimiento de código, que hará que su proyecto funcione dentro de la
duración específica del inicio del código, o de algún evento. Por ejemplo, usted puede hacer un código
para encender la casa por la noche y apagarla al día, representando el tiempo del día en segundos,
apaga la luz desde el 6º segundo (6 AM) hasta el 18º (6 PM) , Y repita el procedimiento. Vea el
siguiente código:
int secondCounter = 0;
int duracion = 24; // puede establecer la duración que desee.
int time1 = 6;
int time2 = 18;
Boolean flag1 = 0;
Boolean flag2 = 0;
int lightPin = 11;
Void setup ()
{
// ** Inturrubts **
NoInterrupts (); // deshabilitar todas las interrupciones
TCCR1A = 0;
TCCR1B = 0;
TCNT _ {1} = 3036; // temporizador de precarga 65536-16MHz / 256 / 1Hz
TCCR1B | = (1 << CS12);
TCCR1B | = (1 << CS10); // 1024 prescaler
TIMSK1 | = (1 << TOIE1); // habilitar la interrupción del desbordamiento del T1
Interrupts (); // activar todas las interrupciones
}
ISR (TIMER1_OVF_vect) // interrupción de la rutina de servicio que envuelve una
int secondCounter = 0;
int timerCounter = 0;
ESP32.
Los contadores de temporizador se pueden configurar para contar hacia atrás o hacia
atrás y admitir la recarga automática y la recarga de software. También pueden generar
alarmas cuando alcanzan un valor específico, definido por el software. El valor del
contador puede ser leído por el programa de software.
Variables globales
Primero debemos de estar conscientes del empleo de variables, en este caso globales,
por lo que se considera un contador que será utilizado por la rutina de servicio de
interrupción para indicar al bucle principal que se ha producido una interrupción.
Hemos visto este uso de un contador de acuerdo con el ATMEGA328P sobre las
interrupciones externas porque, como se explicó, los ISR deben ejecutarse lo más rápido
posible y no deben realizar operaciones largas, como escribir en el puerto serie. Por lo
tanto, una buena manera de implementar el código de manejo de interrupciones es
hacer que el ISR solo señale la ocurrencia de la interrupción y deferente el manejo real
(que puede contener operaciones que toman un tiempo) al bucle principal.
El contador también es útil, ya que si por algún motivo el manejo de una interrupción en
el bucle principal lleva más tiempo de lo esperado y se producen más interrupciones
mientras tanto, entonces no se pierden porque el contador se incrementará en
consecuencia. Por otro lado, si se usa un indicador como mecanismo de señalización, se
mantendrá en verdadero y las interrupciones se perderán, ya que el bucle principal solo
supondrá que se ha producido uno adicional.
Como de costumbre, dado que esta variable de contador se compartirá entre el bucle
principal y el ISR, entonces debe declararse con la palabra clave volátil, lo que evita que
se elimine debido a las optimizaciones del compilador.
nt i nterruptCounter;
volatile i
otalInterruptCounter;
int t
Serial.begin(115200);
Como entrada, esta función recibe el número de temporizador que queremos usar (de 0
a 3, ya que tenemos 4 temporizadores de hardware), el valor del preescalador y una
bandera que indica si el contador debe contar hacia arriba (verdadero) o hacia abajo
(falso).
Aunque podríamos hacer los cálculos con este valor para establecer el número de
contador para generar la interrupción, aprovecharemos el preescalador para
simplificarlo. Por lo tanto, si dividimos este valor por 80 (usando 80 como valor de
preescalador), obtendremos una señal con una frecuencia de 1 MHz que incrementará el
contador del temporizador 1 000 000 veces por segundo.
Aunque podríamos hacer los cálculos con este valor para establecer el número de
contador para generar la interrupción, aprovecharemos el preescalador para
simplificarlo. Por lo tanto, si dividimos este valor por 80 (usando 80 como valor de
preescalador), obtendremos una señal con una frecuencia de 1 MHz que incrementará el
contador del temporizador 1 000 000 veces por segundo.
Entonces, como primer argumento, pasamos nuestra variable global del temporizador
nuevamente, y como tercer argumento pasaremos verdadero “true”, por lo que el
contador se volverá a cargar y, por lo tanto, la interrupción se generará periódicamente.
timerAlarmEnable(timer);
1
void setup() {
2
3 Serial.begin(115200);
4
5 timer = timerBegin(0, 80, true);
6 timerAttachInterrupt(timer, &onTimer, true);
7 timerAlarmWrite(timer, 1000000, true);
8 timerAlarmEnable(timer);
9
}
10
Su funcionamiento se liga con la hoja de datos técnico, por lo que se pone como ejemplo
en la parte final de este documento para que lo escriba y codifique, y quitar los errores
que puedan existir.
Material y equipo utilizado
1 Computadora
1 Software ATMEL Studio o ARDUINO IDE.
1 Tarjeta ARDUINO DUE.
1 kits de Arduino.
Desarrollo de la Práctica.
#include <Timer.h>
const int led = 13; // the pin with a LED
int ledState = LOW; // El LED empieza apagado
volatile unsigned long blinkCount = 0; // La definimos como volatile
void setup(void)
{
pinMode(led, OUTPUT);
Timer1.initialize(250000); // Dispara cada 250 ms
Serial.print("Ciclos = ");
Serial.println(N);
delay(100);
}
Código empleado.
/*
* Prac12b.cpp Fecha: dd/mm/aaaa
*Grupo: ___________ Ciclo escolar:
* Integrantes: ______________ ___________ _____________
* ______________ ___________ _____________
* Profesor : ______________ ___________ _____________
* Objetivo :
*/
#define reed A0 //Variable de lectura del boton en A0
// Variables de almacenamiento
float radius = 13.5; // Valor del radio (en pulgadas)- CAMBIO POR SU NIVEL OWN BIKE
int reedVal;
long time = 0; // Tiempo entre la rotacion total (en ms)
float mph = 0.00;
float circumference;
boolean backlight;
int maxReedCounter = 100; //tiempo minimo (en ms) de una rotacion (Para evitar los rebotes)
int reedCounter;
void setup(){
reedCounter = maxReedCounter;
circumference = 2*3.14*radius;
pinMode(1,OUTPUT); //tx
pinMode(2,OUTPUT); //Luz en la terminal 2
pinMode(reed,INPUT); //En modo de entrada de A0
checkBacklight();
Serial.write(12); //Limpiars
// SETUP del TIMER- La interrupción del timer se precisa sobre la medicion del tiempo del
cambio en reed A0
cli(); // se detiene las interrupciones
// se pone el timer1 de la interrupción a 1kHz
TCCR1A = 0; // se pone la entradadel registro TCCR1A a 0
TCCR1B = 0; // de igual forma pra TCCR1B
TCNT1 = 0; // Se inicializa la variable de conteo a un valor deo 0
// Se pone el contador del timer para incrementos de 1khz
OCR1A = 1999; // = (16*10^6) / (1000*8) - 1
// Se turna a mode CTC
TCCR1B |= (1 << WGM12);
// Se pone el bit CS11 para un precaler de 8
TCCR1B |= (1 << CS11);
// se habilita el timer en modo de comparacion
TIMSK1 |= (1 << OCIE1A);
sei(); // Se pone la interrupcion en espera
// Se finaliza la configuración del TIMER
Serial.begin(9600);
}
void checkBacklight(){
backlight = digitalRead(2);
if (backlight){
Serial.write(17); // Se turna a encendido el led
}
else{
Serial.write(18); // Se turna a apagado el led
}
}
Dado que esta variable se comparte con el ISR, lo haremos dentro de una sección
crítica, que especificamos mediante el uso de una macro portENTER_CRITICAL y
portEXIT_CRITICAL. Ambas llamadas reciben como argumento la dirección de nuestra
variable global portMUX_TYPE.
1 interruptCounter > 0) {
if (
2
3 portENTER_CRITICAL(&timerMux);
4 interruptCounter--;
5 portEXIT_CRITICAL(&timerMux);
6
7 // Interrupt handling code
}
8
1
2 oop() {
void l
3
4 interruptCounter > 0) {
if (
5
portENTER_CRITICAL(&timerMux);
6 interruptCounter--;
7 portEXIT_CRITICAL(&timerMux);
8
9 totalInterruptCounter++;
10
11 Serial.print("An interrupt as occurred. Total number: ");
12 Serial.println(totalInterruptCounter);
13
}
14 }
15
El código de la ISR.
La rutina de servicio de interrupción debe ser una función que devuelva un nulo y no
reciba argumentos.
Nuestra función será tan simple como incrementar el contador de interrupciones que
indicará al bucle principal que se produjo una interrupción. Esto se realizará dentro de
una sección crítica, declarada con las macros portENTER_CRITICAL_ISR y
portEXIT_CRITICAL_ISR, que reciben como parámetros de entrada la dirección de la
variable global portMUX_TYPE que declaramos antes.
1
2
volatile int interruptCounter;
3
int totalInterruptCounter;
4
5 hw_timer_t * timer = NULL;
6 portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
7
8 void IRAM_ATTR onTimer() {
9 portENTER_CRITICAL_ISR(&timerMux);
10 interruptCounter++;
11 portEXIT_CRITICAL_ISR(&timerMux);
12
}
13
14
15 etup() {
void s
16
Serial.begin(115200);
17
18 timer = timerBegin(0, 80, true);
19 timerAttachInterrupt(timer, &onTimer, true);
20 timerAlarmWrite(timer, 1000000, true);
21 timerAlarmEnable(timer);
22
23 }
24
25 oop() {
void l
26
27 interruptCounter > 0) {
if (
28
portENTER_CRITICAL(&timerMux);
29 interruptCounter--;
30 portEXIT_CRITICAL(&timerMux);
31
32 totalInterruptCounter++;
33
34 Serial.print("An interrupt as occurred. Total number: ");
35 Serial.println(totalInterruptCounter);
36
}
37 }
38
39
Para probar el código, simplemente cárguelo en la tarjeta ESP32 y abra el monitor serial
de Arduino IDE.
12.2 SIMULACIONES.
Para este punto describa sus comentarios obtenidos durante el desarrollo de esta
práctica, y que aportaciones usted haría de esta práctica.
BIBLIOGRAFIAS.
REFERENCIAS.
Para este punto usted debe incluir en el reporte cuando menos dos artículos, o
temas de alguna revista, libro o publicación actual, referente al tema tratado en
esta práctica.