Interrupciones con Timer en Arduino

Hola a todos yo vengo de otro lenguaje de programacion para atmel y la verdad no entiendo como podeis programar sin interrupciones (me refiero a interrupciones del timer, para generar una interrupcion con precision cada 100ms, cada 250us o el tiempo que sea)
Queria saber como se pueden utilizar las interrupciones de timers en Arduino, he googleado mucho y si veo que dicen que existen librerias para hacer eso y de hecho me he bajado y probado varias y no han funcionado.
Utilizo la IDE de Arduino 1.5.8 y un arduino leonardo (entre otros).

Por favor si me podeis decir como se hace en la ide de Arduino o que kibrerias necesito...

gracias

Me autocontesto, en esta pagina hay 2 librerias para usar las interrupciones del timer2:

http://www.pjrc.com/teensy/td_libs_MsTimer2.html

yo he usado el Flexitimer2, es un zip con la libreria y trae un ejemplo sencillo, y funciona (solo he probado esta)
recordar que en la "funcion" de la interrupcion debeis usar codigo rapido y cortito (dependiendo de la frecuencia de la interrupcion y de lo pesado del codigo podeis porbocar un desbordamiento de pila y se colgara).

Ademas las variables que querais manejar en la interrupcion debeis declararlas generales (arriba del todo, fuera de cualquier funcion) y ademas añadiendo delante "volatile", ejemplo:

"volatile int contador;" declaramos la variable "contador" de tipo entero "int" y "volatile" que la hace accesible desde la interrupcion.

Recordar ademas que la IDE de arduino internamente usa los timers para generar de forma facil cosas que no lo son, por ejemplo los "analogwrite" son en realidad las salidas Pwm que usan el timer2 para hacerlas funcionar, ES DECIR SI USAIS LA LIBRERIA FLEXITIMER2 ESTA SE APODERA DEL TIMER2 PARA PODER PROPORCIONAROS INTERRUPCIONES DE TIEMPO EXACTAS, A CAMBIO PERDEIS LA FUNCION ANALOGWRITE QUE TAMBIEN USA EL TIMER2.

El timer0 y el timer1 por lo visto lo utiliza para otras cosas como SoftwareSerial etc...

En conclusion la IDE de Arduino pone al alcance de todos la programacion sencilla de los arduinos pero perdemos el control a bajo nivel del hardware (vease lo explicado de los timers). Entiendo que es mucho mas sencillo claro pero yo al menos no se programar micros sin utilizar los timers :sob:

Es decir cuando programas tu a bajo nivel puedo llegar a exprimir dos o tres utilidades del mismo timer (ejemplo leer teclado de matriz y manejar un display de 7 seg).

OJO pero eso si programado a bajo nivel interpretar un teclado matricial con su rutina antirebote (cuando pulsamos fisicamente un pulsador se producen miles rebotes y hay que filtrarlos para no sumar falsas pulsaciones) y manejar un display 7 segmentos de 4 digitos directamente sin harware adicional, se puede, pero a mi me salia la ultima vez unos 3 folios de codigo.

Aqui en arduino lo haces con 2 librerias instaladas y 4 lineas de codigo.

Lo dicho es muy comodo pero pierdes cierto control

PD: proximo capitulo el watchdog. :grin:

Hola, uargo.
Interesantes las explicaciones. Comentarte que desde C de Arduino tienes también acceso a todos los registros del procesador para tratar directamente (si echas un vistazo a la librería que acabas de probar, lo comprobarás). Supongo que lo sabrás, pero viene preestablecida una interrupción de timer que se limita a incrementar los contadores millis() y micros(). Con estas dos variables podemos solucionar muchos de los problemas en los que necesitamos medir tiempo sin usar los delay.
En resumen, en caso necesario puedes disponer del mismo control que en ASM (de hecho es posible incluso insertar código ASM dentro del C). La contrapartida es que si quieres trabajar a bajo nivel, debes tener en cuenta qué se está utilizando ya y puede verse afectado (bien por el propio core, o por las librerías que vayas a utilizar).

Muchas gracias si cierto le he estado hechando un vistazo a las librerias y los ejemplos y vienen accesos a los registros del micro, eso esta bien, pero como dice mezclar operaciones a bajo nivel y operaciones a alto nivel a veces te deshabilita una u otra por que coinciden utilizando el mismo timer.

Por ejemplo (he encontrado 3 librerias la "TimerOne" para el timer 1, "MsTimer2" para el timer 2, y "TimerThree" para el timer3) las tres practicamente iguales solo que elijo una u otra dependiendo del timer que quiera utilizar,
y por ejemplo en el Leonardo si utilizo el Timer1 no me funciona el "analogWrite" en la salida 13, pero si en la 10 y 11, si utilizo el Timer2 pasa justo lo contrario y si utilizo Timer3 funcionan los tres pines aunque seguro fallara otra cosa.

Resumiendo si utilizas un timer tu con una de esas librerias algunas otras cosas pueden dejar de funcionar como analowrite(funcion PWM) en segun que pines, SoftwareSerial, los delays u otras funciones que utilizan timers.
Pero probando como yo he hecho si deshabilitas cosas que no vas a necesitar pues genial, eso si tienes que ir probando.

Y lo de milis() y micros() la verdad que no tenia ni idea, acabo de ponerme con el IDE de arduino hace nada 3 dias, pero muchas gracias por la informacion, por que como dices puede ser una alternativa a las interrupciones para conseguir tiempos exactos, no tan preciso seguro pero segun para que podria valer.

No obstante lo dicho ya sabemos como utilizar los timers para quien lo necesite.

enlace Mstimer2:
http://playground.arduino.cc/Main/MsTimer2

enlace a TimerOne y TimerThree:
http://www.pjrc.com/teensy/td_libs_TimerOne.html
Por cierto en este ultimo enlace tiene en el menu de la izquierda un monton de librerias mas, algunas muy interesantes. :wink:

Quien dice que no las usamos, yo vengo de ATMEL y sigo usandolos y sigo programando con mi ATMEL STUDIO y uso las interrupciones todo el tiempo.
De hecho estoy en un tema que me tiene mal y es un problema de electrólisis que requiere un burst a 48.2Khz (timer2) controlado por otro a 1Khz (timer1).
Si quieres pegate una vuelta por el post FRECUENCIA A 32Mhz o SUPERIOR