fbpx

Expresate

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

Procblema con bucle...
 
Avisos
Vaciar todo

Procblema con bucle while()

12 Respuestas
3 Usuarios
0 Reactions
9,833 Visitas
sdguez
Respuestas: 6
Topic starter
(@sdguez)
Active Member
Registrado: hace 15 años

Buenas a todos:
Os dejo un pequeño fragmento de código, pues no acabo de entender por qué a la hora de depurar el compilador hace un par de cosas, a mi juicio, un tanto raras.

Dentro de la función main(), he puesto un bucle while(1) para que se ejecute continuamente. Bien, dentro de este bucle hay básicamente dos cosas:
- Otro bucle while con la "chicha" del programa, controlada por una variable boolena
- Tres instrucciones (sei(),cli(),etc) para el control de las interrupciones.
Es decir:

bool inicio = false;

void main ()
{
DDRA = 0xFF; // set PORTA as output
PORTA = 0xff;
while(1)
{
while(inicio)
{
if (contador_s == 20) // Han pasado 20 seg.
{
contador_s=0;
if (regula== 1) salida++; // Incrementamos +1 registro del PuertoA.
if (regula== 2) salida--; // Decrementamos -1.....
PORTA = salida;// escribe registro en Puerto A.
}
if (contador_s2 == 5400) // Han pasado 90 minutos.
{
contador_s2=0;
-------> PORTA = 0xFF;// escribe registro en Puerto A.
}

// más código//

TCNT0 = 0x00; //Poner a 0 resgistro del Timer0
contador_s2=0;
contador_s3=0;
contador_s4=0;
}
sei();
TIMSK |= (1 << TOIE0); // Máscara interrupción timer0
cli();
} //del while(inicio)
sei();
TIMSK |= (1 << TOIE0); // Máscara interrupción timer0
cli();
}// del while (1)
} // del main

Pues bien, resulta que depurando todo paso a paso comienza con normalidad hasta alcanzar el bucle while(inicio). Como dicha variable está inicializada a "false" no se debiera ejecutar. No obstante resulta que se mete dentro del bucle, unas 10 instrucciones más abajo (la instrucción en concreto está señalada en el código con una flecha pr la izquierda) y yo creo que no llega a ejecutar dicha instrucción, le doy otro paso y vuelve al bucle while(inicio), ahora sí lo ignora y salta al final, a la instrucción sei() que está dentro de las llaves del while(1);

Acto seguido, mediante una interrupción:
ISR(IO_PINS_vect)
{
inicio = !inicio;
}

Por cierto, si escribo la instrucción así: "inicio !=;" me da error al compilar, es normal?.

El caso es que el boolean "inicio" pasa a true, se acaba la interrupción, continua con la ejecución de la función cli() y ahora entiendo que debería entrar en el bucle while(inicio), pero pasa olímpicamente del y continua ejecutando las tres últimas instrucciones cíclicamente.

Alguien sabe por qué sucede esto?.

Muchas gracias.

Responder
11 respuestas
sdguez
Respuestas: 6
Topic starter
(@sdguez)
Active Member
Registrado: hace 15 años

A ver, me parece que hoy habrá un dependiente menos en la tierra, me explico.

El micro que tengo, un Attiny26, viene un una pequeña placa de desarrollo, que es esta:
Placadedesarrollo

Bien, además del micro, un par de puertos, regulador de tensión para la alimentación, led's, pulsador, etc etc y el famoso puerto de 10 pines. Bien, cuando me lo vende, pregunto qué necesito para programar dicho micro, y el sr. dependiente me dice un cable programador AVR ISP puerto Paralelo S310335, es decir, ésto:
cabledeprogramacin

En definitiva, a tu pregunta de qué chisme, placa, o sucedáneo pongo "en medio", la respuesta es nada. De lo que me dijo el de la tienda, entiendo que se conecta directamente al Pc y el propio AVR Studio (o el compilador que sea) digamos se "encargaría del resto".

Por contra, por lo que me comentas Beamspot, entiendo que en medio de esta placa y el Pc habría que poner un cacharro tal cual el AVRRISP mkII, con lo cual el cable paralelo ese superchupi que me han colado sólo me vale para darle en la cabeza la fulano en cuestión.

PD: Si estas en lo cierto creo que puedo ir presentando mi candidatura a novato (o pardillo) del año 😛 .

Responder
beamspot
Respuestas: 1132
(@beamspot)
Noble Member
Registrado: hace 17 años

Hola:

Por desgracia no puedo ver las fotos en el curro (cosas de los jefes de IT), así que no te puedo decir nada.

Por lo que explicas, podría ser perfectamente que sí que fuese un programador, ya que el STK200 que te comentaba no son más que un puñado de resistencias que se suelen montar directamente en el conector del puerto paralelo, dentro de la cajita, y de ahí sale directamente el cable ISP de 10 pines, así que no voy a decirte directamente que lo que tienes no te vale sin verlo antes.

Lo que sí parece es que lo que te han vendido es un STK200 y por tanto necesitas el PonyProg (gratuito, si no voy equivocado), de manera que lo más probable es que nadie haya sido un pardillo ni un tonto, simplemente que no se ha dado toda la información necesaria, presumiblemente por desconocimiento del mismo dependiente.

Responder
Página 3 / 3
Compartir: