Aprender Arduino, prototipado y programación avanzada con 100 ejercicios. Rubén Beiroa Mosquera
Чтение книги онлайн.
Читать онлайн книгу Aprender Arduino, prototipado y programación avanzada con 100 ejercicios - Rubén Beiroa Mosquera страница 11
•Para programar los Timers 2 y 3, necesitamos las librerías MsTimer2 y TimerThree, respectivamente.
La libería MsTimer2 solo permite 3 acciones:
•Configuración del tiempo para la interrupción <<MsTimer2::set()>>.
•Activar interrupción <<MsTimer2::start()>>.
•Desactivar interrupción <<MsTimer2::stop()>>.
•En el siguiente caso
En cuanto a la libería TimerThree, tenemos las mismas acciones que en la librería TimerOne
•Pero, según la documentación de Arduino, esta librería solo funcionaría para el caso en el que trabajemos con el Arduino Mega (http://playground.arduino.cc/Code/Timer1).
Con esta última librería, acabamos de ver todo lo referente a las interrupciones temporales; con la utilización de interrupciones, podemos mejorar el rendimiento de nuestros programas y hacer que funcionen como si de un sistema multitarea se tratase.
013
Interrupción del puerto serie
En el caso de utilizar, por ejemplo, la comunicación serie, tenemos algo parecido a una interrupción asociada a la recepción de datos. No es exactamente una interrupción porque, si recordamos, una interrupción detiene la ejecución normal del programa y ejecuta la función asociada a la interrupción.
En el caso de la interrupción del puerto serie, esto no sucede; lo que realmente ocurre es que el programa comprobará, cada vez que finalice el bucle void loop, si hay datos en el buffer de entrada del puerto serie y, si es así, se ejecuta una función:
•Existen unas funciones predefinidas para este tipo de uso, que son las funciones <<serialE-vent()>>.
•En el caso de que un Arduino tenga varios puertos, como es el Arduino Mega, cada puerto tiene su propia «interrupción», diferenciándose por la referencia del puerto serialEvent1(), serialE-vent2()…
•En el siguiente caso
•Esta función viene a sustituir el if (serial.available())
•Esto último podemos probarlo con dos simples casos:
•En el primero
•En el segundo
Visto todo esto, la conclusión sería que podemos programar una función para la recepción de datos por el puerto serie que nos permite liberar código del bucle principal.
Pero, en un Arduino, no hay únicamente un tipo de comunicación; en los siguientes capítulos trabajaremos con las comunicaciones I2C y SPI y aí veremos que también tienen funciones para la recepción de datos.
Antes de estudiar estas comunicaciones, profundizaremos en el lenguaje de programación de la comunicación serie. Son muchos los módulos que utilizan esta comunicación; para establecer una comunicación eficiente, será imprescindible un buen dominio del lenguaje de programación.
Aunque los módulos ya adaptados para Arduino seguro que tienen sus propias librerías con las que conseguimos establecer de forma fácil una comunicación, existen muchos otros dispositivos que no tendrán una librería para Arduino y es ahí donde será necesario conocer ciertas peculiaridades de la comunicación serie.
014
Comunicación serie Serial.flush, Serial.availableForWrite
Serial.flush():
Al usar «print», «println» o «write», la transmisión de datos se realiza de forma asíncrona. Esto quiere decir que se ejecuta la siguiente instrucción sin asegurarse de que se empiece el envío de datos.
Esta cuestión se soluciona si, después de cualquiera de las tres instrucciones anteriores (print, println o write), escribimos <<Serial.flush()>>. Esta instrucción no devuelve nada, pero bloquea el programa hasta que el buffer de salida se haya vaciado, lo que significa que se han enviado todos los datos:
1.Para comprobar esto, probamos a enviar un mensaje y capturar el tiempo que tarda en ejecutarse el programa.
2.El tiempo que tardaría el programa en escribir el mensaje en el buffer de salida serían de 220 microsegundos
3.Ahora haremos lo mismo pero añadiendo la instrucción <<Serial.flush()>>.
4.En