Hola tengo poco programando y tengo un problema al que ya le he dado muchas vueltas y no he podido resolver.
Estoy utilizando un PIC18F4525, CCS 4.0xx y proteus 7.2 SP6
Lo que estoy intentando hacer es un tablero de concursos, algo asi como los de la television, es de 8 participantes que pulsaran un boton y solo el que pulso primero debe de encender un LED respectivo para cada participante, estos botones los estoy metiendo al puerto A del pic y tambien los estoy metiendo todos a una logica OR, la salida de esta OR la utilizo para activarme la interupcion externa de RB0.
Cuando sucede la interupcion externa lo que hace es lo siguiente:
1.-Asignar el valor del puerto A aun variable llamada "participante" para que encienda su LED respectivo.
2.- Habilita la interupcion del timer0 o RTCC para que empiece a aumentar la variable "tiempo" con cada desborde, ya que el participante tiene 10 segundos para contestar, de terminarse el tiempo enciende todos los LED para indicar que se termino el tiempo (El timer0 esta habilitado como contador interno, se desborda a 1 segundo y de inicio u interupcion estaba deshabilita).
3.- Pone la variable tiempo=0 y setea el RTCC(0) para asegurar que el conteo del tiempo sea axacto.
4.- La interrupcion externa se deshabilita a si misma para que ignore las pulsaciones de los demas participantes y solo considere la primer pulsacion.
Una vez que la pregunta se contesto o que el tiempo se termino uso la interupcion 1 en RB1 de mi PIC18F4525 para prepara el programa para la siguiente pregunta lo que hago en el codigo de la interupcion es lo siguiente:
1.-Pongo la variables tiempo y participante =0
2.- Habilito de nuevo la interucion externa de RB0 y deshabilito la interrupcion del timer0, para deje de incrementar la variable tiempo y este listo para recivir la siguiente pulsacion.
"Este es el problema"
De inicio todo se ve bien si solo precionamos un boton de participante si enciende su respectivo led y precionamos el boton de RB1 si se alista para la siguiente pregunta...Perooo..cuando presiona mas de una vez cualquiera de los botones, es decir, cuando sucede mas de una vez la interupcion RB0 al momento de aplastar RB1 para preparar para la siguinte pregunta no es suficiente con aplastarlo una sola vez sino que necesita 2 veces para que haga lo que debe de hacer. Repito, este problema pasa cuando sucede mas de una vez la int_EXT, todo va bien cuando solo hay una interupcion externa.
Lo que he observado es que la interrupcion externa 1 la primera vez que se ejecuta solo pone Tiempo=0 y participante=0, pero no hace las modificaciones correspondientes de las interrupciones, esto la hace hasta la segunta vez que se pulsa.
Quiza piensen que no es un gran detalle que se le tenga que aplastar 2 veces al boton pero este error no me deja agregarle mas funciones a mi programa.
De antemano muchas gracias por su tiempo amigos, espero con ancias sus respuestas.
Estoy utilizando un PIC18F4525, CCS 4.0xx y proteus 7.2 SP6
Lo que estoy intentando hacer es un tablero de concursos, algo asi como los de la television, es de 8 participantes que pulsaran un boton y solo el que pulso primero debe de encender un LED respectivo para cada participante, estos botones los estoy metiendo al puerto A del pic y tambien los estoy metiendo todos a una logica OR, la salida de esta OR la utilizo para activarme la interupcion externa de RB0.
Cuando sucede la interupcion externa lo que hace es lo siguiente:
1.-Asignar el valor del puerto A aun variable llamada "participante" para que encienda su LED respectivo.
2.- Habilita la interupcion del timer0 o RTCC para que empiece a aumentar la variable "tiempo" con cada desborde, ya que el participante tiene 10 segundos para contestar, de terminarse el tiempo enciende todos los LED para indicar que se termino el tiempo (El timer0 esta habilitado como contador interno, se desborda a 1 segundo y de inicio u interupcion estaba deshabilita).
3.- Pone la variable tiempo=0 y setea el RTCC(0) para asegurar que el conteo del tiempo sea axacto.
4.- La interrupcion externa se deshabilita a si misma para que ignore las pulsaciones de los demas participantes y solo considere la primer pulsacion.
Una vez que la pregunta se contesto o que el tiempo se termino uso la interupcion 1 en RB1 de mi PIC18F4525 para prepara el programa para la siguiente pregunta lo que hago en el codigo de la interupcion es lo siguiente:
1.-Pongo la variables tiempo y participante =0
2.- Habilito de nuevo la interucion externa de RB0 y deshabilito la interrupcion del timer0, para deje de incrementar la variable tiempo y este listo para recivir la siguiente pulsacion.
"Este es el problema"
De inicio todo se ve bien si solo precionamos un boton de participante si enciende su respectivo led y precionamos el boton de RB1 si se alista para la siguiente pregunta...Perooo..cuando presiona mas de una vez cualquiera de los botones, es decir, cuando sucede mas de una vez la interupcion RB0 al momento de aplastar RB1 para preparar para la siguinte pregunta no es suficiente con aplastarlo una sola vez sino que necesita 2 veces para que haga lo que debe de hacer. Repito, este problema pasa cuando sucede mas de una vez la int_EXT, todo va bien cuando solo hay una interupcion externa.
Código:
#include <18F4525.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Low power osc < 200 khz
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOPUT //No Power Up Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#use delay(internal=8000000)
#use fast_io(c)
#use fast_io(b)
#use fast_io(a)
#define part input_a
#define salida output_c
int tiempo,participante;
#int_RTCC
RTCC_isr()
{
if (tiempo>=10){tiempo=0;participante=255;disable_interrupts(INT_RTCC);}
tiempo++;
}
#int_EXT
EXT_isr()
{
enable_interrupts(INT_RTCC);disable_interrupts(INT_EXT);participante=part();tiempo=0;set_rtcc(0);
}
#int_EXT1
EXT1_isr()
{
tiempo=0;participante=0;disable_interrupts(INT_RTCC);enable_interrupts(INT_EXT);
}
void main()
{
set_tris_a(0xff);
set_tris_c(0x00);
set_tris_b(0xff);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
disable_interrupts(INT_RTCC);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(GLOBAL);
tiempo=0;participante=0;
while(1)
{
salida(participante);
}
}
Lo que he observado es que la interrupcion externa 1 la primera vez que se ejecuta solo pone Tiempo=0 y participante=0, pero no hace las modificaciones correspondientes de las interrupciones, esto la hace hasta la segunta vez que se pulsa.
Quiza piensen que no es un gran detalle que se le tenga que aplastar 2 veces al boton pero este error no me deja agregarle mas funciones a mi programa.
De antemano muchas gracias por su tiempo amigos, espero con ancias sus respuestas.