terminar abruptamente una interrupcion

MSP son los MSP430, microcontroladores de TI. Pense que tenia una nota de aplicacion pero buscando vi que es parte de un libro que yo tengo, sobre como hacer debouncing combinado con poner al controlador en modo de bajo consumo... pero es todo muy especifico de ese micro, y aparte es parte de un libro. Se llama MSP430 microcontroller basics.
 
pero como se hace ? si interrumpo por RB0 y quiero hacer un antirrebote ya estoy adentro de la interrupcion?

Alli te va mi metodo:

Normalmente asigno uno o varios registros de uso general para contener varias banderas personalizadas que me permiten efectuar acciones entre interrupciones y main

Cuando alguien presiona un boton se genera la interrupcion de RB0, dentro de esta lo que se hace es inicializar un contador con el TMR0 y encender un bit en el registro de banderas personalizado, indicando que se esta revisando una tecla, cuando llega la interrupcion del TMR0 apago el bit de revision y defino si la tecla es valida o no, en caso de ser invalida simplemente termino, en caso de ser valida determino que tecla es, coloco su valor en un registro de memoria asignado para el teclado y enciendo otra bandera personalizada indicando que hay una tecla nueva

Durante Main se estan revisando constantemente las banderas personalizadas, cuando termina la interrupcion el micro regresa a main y este determina que esta habilitada la bandera de nueva tecla, entonces ejecuta la subrutina de atencion que obtiene el valor y realiza la accion, al terminar simplemente apago la bandera y vuelvo al loop de revision de banderas...
 
al final hice esto sin usar otra interrupcion ( TMR0) no se si estará bien como antirrebote:

#INT_EXT{
delay_ms(100); // espero 100 ms por cualquier rebote
if (input_state(PIN_RB0)==1)
return; // fue un rebote entonces salgo de la interrupcion, pero el return en C es igual
// que el retfie en assembler ? o como deberia poner para regresar al main ?
else
continua el programa de interrupcion....


gracias!
 
Hola ilcapo, la solucion que propones esta bien, con retardo de 100ms basta y sobra para que el rebote desaparesca, asi que lo unico que te queda es armar y probar el circuito.

en cuanto al return para este caso su funcion es similar al retfie pero no es exactamente igual, con return; se restablese los valores de los registros STATUS, W, borra el flag que señaliza la interrupcio y finalmente "hace el" retfie.
 
al final hice esto sin usar otra interrupcion ( TMR0) no se si estará bien como antirrebote:

#INT_EXT{
delay_ms(100); // espero 100 ms por cualquier rebote
if (input_state(PIN_RB0)==1)
return; // fue un rebote entonces salgo de la interrupcion, pero el return en C es igual
// que el retfie en assembler ? o como deberia poner para regresar al main ?
else
continua el programa de interrupcion....


gracias!

NO!!

Después de todo lo que pusieron arriba, venís con eso amigo... :LOL:

Es una locura poner una demora de 100mS dentro de una interrupción, una interrupción debe ser lo más corta y concisa. Si quisieras aplicar esa demora, deberías levantar un flag en la interrupción, salir de la misma e inhabilitarla (solo la externa, no las globales!!), dentro del main preguntas si hubo alguna interrupción externa por medio del flag, en caso de haber, inmediatamente tiras el delay 100mS y ya.

Pero tené en cuenta que hacer eso significa trabar el resto de los proceso.
 
SAINT!

osea que esta bien colocar return para salir de una interrupcion, genial :apreton:
no sabia si borraba el flag y habilitaba de nuevo el GIE, pensé que salia pero dejaba todo mal
( en la simulacion en el proteus no anda muy bien a lo mejor porque el pulsador de proteus no tira rebotes!)


Cosme!: si tenes razon voy a probar un poco mas a ver si me resulta pero en todos mis intentos de hacer un antirebote con el timer0 me deja de funcionar la simulacion, no se como salir de la interrupcion por RB0 para interrumpir por Timer0 verificar si es un rebote y en caso de que no sea un rebote continuar con la int por RB0, estube buscando algun ejemplo por el magico google pero todavia no encontre nada , solo veo que usan antirebotes haciendo un delay_ms(100) Voy a probar como dice CHICO 3001 lo tube que leer como 5 veces hasta que lo capté ja ! espero que me salga
 
Última edición:
El histérico de la liga anti-bucles vacíos informa:
Personalmente prohibiría por ley toda función delay o similar superior al ms. Me parece una barbaridad.
Dentro de las interrupciones prohibiría cualquier delay mas allá de dos NOPs

Cuesta acostumbrarse a activar un flag por aquí y borrarlo por allá, pero piensa que mientras dure un delay TIENES EL SISTEMA MUERTO M-U-E-R-T-O y eso siempre es malo. La demostración es que todos nos ponemos muy nerviosos si movemos el ratón y no se mueve el cursor o si apretamos una tecla y no sale en la pantalla.
 
El histérico de la liga anti-bucles vacíos informa:
Personalmente prohibiría por ley toda función delay o similar superior al ms. Me parece una barbaridad.
Dentro de las interrupciones prohibiría cualquier delay mas allá de dos NOPs

Cuesta acostumbrarse a activar un flag por aquí y borrarlo por allá, pero piensa que mientras dure un delay TIENES EL SISTEMA MUERTO M-U-E-R-T-O y eso siempre es malo. La demostración es que todos nos ponemos muy nerviosos si movemos el ratón y no se mueve el cursor o si apretamos una tecla y no sale en la pantalla.


:LOL: segun mi profesor de digital 1 ( cuando vimos interupciones en assembler) las interrupciones son tan rapidas que si cada uno tiene un teclado ( eramos como 100 alumnos) y cada uno presiona una tecla no hay forma que 2 teclas se solapen ( osea saldrian todas las teclas apretadas por pantalla) si le digo que hice un bucle en la interrupcion seguro que me mata tambien ! jaja seguire intentando usar solo flags en las interrupciones, si me sale lo posteo saludos!
 
Bueno, yo no soy Dios, me equivoco y no poco. Por otro lado por el hecho de ser profesor no se tiene el don de la infalibilidad como tiene Susan(tidad) de hecho yo soy profesor y me equivoco y profesores míos han metido la pata ni te cuento, los honestos y que aprecio por ello lo han admitido y los que no aprecio han sido capaces de decir que los burros vuelan con tal de no admitir su error.

Me puedo equivocar pero ya sabes mi lema:
Retardos cortos con bucles. Cortos significan 100 iteraciones o así: para 1ms tiras por la ventana 1000 instrucciones si se trabaja a 1µs de ciclo. Con 1000 instrucciones se pueden hacer muchas cosas interesantes como para ir tirándolas.
 
Buenas noches escribo porque tengo una duda sobre esto de salir de las interrupciones de manera abrupta, yo tengo lo siguiente:

#int_RDA
void RDA_isr(){


valor=getc();

printf(lcd_putc, "\fRecibido %d ", valor);
delay_ms(500);

}

pero cuando compilo me lanza 4 warnings:

Interrupts disabled during call to prevent re-entrancy (delay_ms1)
Interrupts disabled during call to prevent re-entrancy (lcd_send_byte)
Interrupts disabled during call to prevent re-entrancy (@PSTRINGCN7_95)
Interrupts disabled during call to prevent re-entrancy (@PRINTF_D_95)

Entiendo que es porque estoy haciendo muchas cosas dentro de la interrupción (interrupción por recepción de datos por RS232) como el delay y el printf y al ser así me deshabilita el GIE para que otra interrupción no sea atendida mientras esta lo está, entonces intenté colocar un FLAG dentro de la interrupción y habilitar el GIE luego cosa que no funcionó le he dado mil vueltas y nada tengo días pensando como hacerle porque necesito que al ser llamada esa interrupción imprima esos datos por pantalla y nada. Gracias.
 
Atrás
Arriba