Interrupciones puerto serie

Hola a todos, soy nuevo en este foro, he trabajado anteriormente con avr y pics con interrupciones, pero como es posible crear una interrupción ante recepción en puerto serie o interrupción por desbordamiento en un timer con el arduinol?

Gracias por adelantado

Parece ser que en Arduino todos los timers están usados, por lo que tendrás que perder la función de PWM si quieres usarlo y el puerto serie no genera interrupción, aunque me parece raro, supongo que ésto último será cosa de cambiar un bit en algún registro.

Aquí tienes algún ejemplo de crear interrupciones con timers:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1167000525

¿Qué aplicación quieres crear? Yo evitaría usar las interrupciones que no sean de hardware externas.

Un saludo y bienvenido

Hola,

Arduino, en su librería HardwareSerial, usa la interrupción serie para guardar el dato recibido en el buffer recepción.
Puedes ver el código dentro de la carpeta Arduino => \hardware\arduino\cores\arduino.

Para el manejo de Timers, te recomiendo este link (ingles) => http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106

A parte del datasheet del micro.

Saludos

Igor R.

hola Igor, tengo un problema con la interrupcion de recepcion del arduino mega e probado con ISR(USART0_RX_vect) con el cual me da problemas con el vector 25, tambien con el SIGNAL(SIG_UART_RECV) y con esta no entra dentro de ella. Me gustaria saber si me puedes solucionar el problema gracias de antemano

Hola,

Nunca he probado a modificarlo, pero en teoría en la librería HardwareSerial.cpp (hardware\arduino\cores\arduino), para el Mega tienes las siguientes interrupciones(una para cada uno de los 4 puertos series disponibles en el ATMega1280 = Mega) que guardan el caracter recibido en el buffer:

......

SIGNAL(SIG_USART0_RECV)
{
unsigned char c = UDR0;
store_char(c, &rx_buffer);
}

SIGNAL(SIG_USART1_RECV)
{
unsigned char c = UDR1;
store_char(c, &rx_buffer1);
}

SIGNAL(SIG_USART2_RECV)
{
unsigned char c = UDR2;
store_char(c, &rx_buffer2);
}

SIGNAL(SIG_USART3_RECV)
{
unsigned char c = UDR3;
store_char(c, &rx_buffer3);
}
......

Podrías añadir código dentro de la funcion del puerto en cuestión que estas trabajando (aunque cuidado que si es demasiado "pesado" puedes perder datos,ya que esta rutina debería ser lo más rápida posible).

Saludos :wink:

Igor R.

Voy a probar muchas gracias