Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

03/09/2012 #1


Microcontrolador ejecuta varias veces de más las interrupciones
Hola, soy nuevo en el foro así que aprovecho para saludarlos a todos!

Antes de nada me gustaría pedir perdón si este tema no va aquí o he hecho algo mal. He estado leyendo todas las normas del foro para no meter la pata y creo que esto va aquí. Perdón a los moderadores en caso de que me haya equivocado. Por otra parte, como no he visto un apartado de presentaciones aprovecho este primer post para hacerlo.

Bueno, y ahora la pregunta que me lleva fastidiando varios días:

Hace poco monté un demodulador del cual estoy tomando la señal demodulada (digital) y la señal de detección de portadora (digital también, claro está). Para empezar a tratar la salida del demodulador estoy utilizando un PIC, en este caso para no complicarme la vida se trata de una placa Arduino que supongo que ya conocereis.

El caso es que la señal de detección de portadora la he conectado al puerto que activa las interrupciones (las cuales se activan cuando hay un cambio de estado: CHANGE) para que el microcontrolador lea cuando hay algo. El problema es que cuando se produce un cambio de estado se ejecutan las interrupciones varias veces (unas seis veces, depende del momento).

Como comprendereis, eso resulta un problema porque me impide saber cuando está emitiendo y cuando no y porque no me gusta que un circuito haga cosas raras (Si, soy así de pijo con las cosas).

He estado leyendo por Internet y he visto que esto se produce por culpa del overshooting de la señal y que puede ser arreglado mediante un filtro RC o esperando un tiempo cuando se active la primera interrupcción.

Bien, el filtro RC no termina de solucionar el problema: reduce a solo dos disparos. Pero de todos modos no me gusta demasiado esta idea porque supongo que retrasaría el tiempo de activación de esta señal...

La idea de dar un tiempo tras la primera interrupción: no funciona, supongo que debe ser porque se producen muy rápido... El código que metí era anular las interrupcciones y esperar... pero ni esperando un millón de años, así que supongo que se produce una interrupción antes de que le de tiempo al PIC a desactivarlas...

Y esto es todo lo que llevo por ahora. ¿Qué me recomendaríais hacer para solucionar esto?

¡Muchas gracias por adelantado y un saludo!
03/09/2012 #2

Avatar de Daniel Meza

Saludos.... ¿utilizas PIC o AVR? AVR es el inlcuido en el Arduino, aunque en esencia ambos son MCU's, es necesario aclarar que estas usando
03/09/2012 #3


Hola Daniel, la placa Arduino es la Duemilanove y lleva un ATMEL ATMEGA328P-PU, supongo que es AVR... ¿no?

¡Gracias por tu respuesta!
03/09/2012 #4

Avatar de Daniel Meza

Bien.. aclarado ese punto habrá que ver la configuración de las interrupciónes, me suena a un problema de banderas de interrupción que provocan un "reciclado" de estas. Muestra el circuito así como la programación para ver en que podemos ayudar
04/09/2012 #5

Avatar de Scooter

Eso huele a rebotes en los contactos. Pon un condensador en la entrada o mejor aún un monoestable.
04/09/2012 #6


Hola, el circuito no lo tengo pintado, pero básicamente es el que viene en la documentación del XR-2211 en la página 14 en la página superior (figura 10). La única modificación que tiene es que para que funcione la patilla 6 la he conectado ha Vcc a través de una R de 5K1. El demodulador funciona bien, todas las salidas son correctas y está ajustado con la R variable.

La placa arduino la he conectado directamente a las patas 6 y 7 del demodulador. Ya probé metiendo un condensador de 220nF pero no soluciona el problema (Si que es verdad que no salta tantas veces como antes, pero no me gusta deformar la señal a no ser que sea estrictamente necesario).

Respecto al código fuente, he probado muchas combinaciones, pero básicamente es:

Código:
void setup(void) {
        attachInterrupt(1,incoming,CHANGE); // Se activa cuando cambian de estado y ejecuta incoming
}

void loop(void) {
}

void incoming(void) {
        detachInterrupt(1);  //Desconecto interrupciones
        delay(100); // Espero a que termine de cambiar
        Serial.begin(9600); // Inicio serial
        Serial.println("CAMBIO"); // Notifico cambio
        attachInterrupt(1,incoming,CHANGE); // Reactivo las interrupciones
}
Gracias por la ayuda!

PD: El código lo acabo de escribir de memoria porque no lo tengo a mano, asi que perdonad si se me escapa algún fallo.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.