fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

CCS ejecuta IF sin ...
 
Avisos
Vaciar todo

CCS ejecuta IF sin cumplir la condicion

9 Respuestas
6 Usuarios
0 Reactions
24.4 K Visitas
jcobreros
Respuestas: 11
Topic starter
(@jcobreros)
Active Member
Registrado: hace 17 años

Buenas tardes, hoy tengo el día raro.
Veamos, tengo una interrupcion que salta cuando entra algo por el puerto serie. Esta interrupcion escribe en la variable Keypress el valor ASCII recibido, y en el bucle principal hay una rutina que se ejecuta si Keypress es distinto de 0, y al final lo vuelve a poner a 0.
Esto funciona correctamente y nunca me ha dado problemas.
He añadido otro IF más adelante en el Main (encerrando una rutina que antes ya estaba y no daba problemas) y ahora se ejecuta la rutina del Keypress cuando Keypress vale 0 (no todas las veces, pero a intervalos regulares).
Pego código relevante:

int Keypress=0x00;
int ready=0;

#int_rda //interrupcion puerto serie
void rda_isr() {
Keypress=0x00;
if(kbhit()){
Keypress=getc();
}
}

#int_TIMER1
void TIMER(){
ready=1;
}

void main() {
setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
enable_interrupts(int_rda);
enable_interrupts(global);
enable_interrupts(INT_TIMER1);
set_TIMER1(0);
do {
// CONTROL DESDE LA RS-232
if(Keypress!=0) //ESTE ES EL BUCLE QUE HACE COSAS RARAS. ENTRA Y EL PRINTF IMPRIME QUE KEYPRESS=0
{
printf("%d",Keypress);
Keypress=0;
}

if (ready==1) //ESTE ES EL IF QUE FASTIDIA TODO. EL CODIGO QUE SE EJECUTA YA ESTABA, ES SOLO AL AÑADIR LA CONDICION
{

if (angl>6.28)
{
angl=0;
}
angl+=0.01;
tservo0=2000*sin(angl)+3800;
tservo1=2000*cos(angl)+3800;
ready=0;
}
}
while (TRUE);
}

Lo que pasa es que cuando meto la condicion de ready==1, entra en la rutina de Keypress!=0. Es curioso ver que justo despues de evaluar la condicion, escribe el valor de Keypress y es 0. Muy raro. He comprobado (poniendo printf por todas partes) que la interrupcion rda_isr se ejecuta solo cuando pulso una tecla. es el if(keypress!=0) el que la lía.
Esto es lo más contradictorio que me ha pasado... Si elimino el if(ready==1) el otro IF funciona bien. Si lo vuelvo a poner, el otro IF entra cuando le da la gana.

Alguna idea??

Responder
8 respuestas
jcobreros
Respuestas: 11
Topic starter
(@jcobreros)
Active Member
Registrado: hace 17 años

Una aclaración. El MPLAB SIM ejecuta el programa correctamente, es decir, nunca entra en la rutina IF (Keypress!=0). es al ejecutarlo en un PIC16f876A cuando entra constantemente aún sin tocar ninguna tecla, y cuando Keypress sigue valiendo 0.

Responder
joviwap
Respuestas: 301
(@joviwap)
Ardero
Registrado: hace 20 años

Alguna que otra vez me ha pasado algo así con CCS y siempre se ha solucionado metiendo más código... La verdad es que no se porque pasaba, ni porque se solucionaba, lo que personalmente no me ha gustado nunca.

Espero que a tí esta chapucilla te sirva.
Un saludo.

Responder
dragonet80
Respuestas: 1328
(@dragonet80)
Ardero
Registrado: hace 18 años

Y que es lo que le envías por el puerto serie, porque no todos los carácteres son imprimibles.
Además, tienes definido keypress como int, no debería ser como char?

Responder
jcobreros
Respuestas: 11
Topic starter
(@jcobreros)
Active Member
Registrado: hace 17 años

@dragonet80: por el puerto serie llegan pulsaciones del teclado. La variable Keypress es int porque he pensado que es lo más directo, a mi no me importa qué letra represente. Por otro lado, si mi ordenador le está mandando caracteres no imprimibles, que es posible, la variable Keypress tendrá algun valor distinto de 0, no? Pero me extraña, porque la interrupcion no se está ejecutando.

@joviwap: gracias por el consejo. Lo voy a probar, aunque me deprime bastante pensar que pueden pasar estas cosas. Si ya es dificil encontrar bugs cuando el fallo es mío, si el fallo es del compilador mucho peor, y si encima es aleatorio... ya ni te cuento... Contemplando la situacion me parece casi imposible solucionar mi otro problema http://foro.webdearde.com/viewtopic.php?f=16&t=2693 , jejeje.

Muchas gracias a los dos!

Responder
Página 1 / 2
Compartir: