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
10.1 K Visitas
sdguez
Respuestas: 6
Topic starter
(@sdguez)
Active Member
Registrado: hace 16 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
beamspot
Respuestas: 1132
(@beamspot)
Noble Member
Registrado: hace 18 años

Por cierto, si quereis un ejemplo de programación de AVR's, en la Wiki de este portal colgué algo de información:

http://wiki.webdearde.com/index.php/Introduccion_al_DSP:_Medida_y_filtrado_de_temperaturas_con_NTC " onclick="window.open(this.href);return false;

aunque no recuerdo si está para el IAR, el WinAVR, o para los dos (con algún método se selección, bien automático, bien manual).

Sin leer el código, en la misma página hay un ejemplo de iniciación del ADC donde se ve claramente cómo uso este modelo de asignación.

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

El bucle while (inicio) no lo cierras donde tu crees....
Mea culpa, en ese aspecto el código está bien, lo que ocurre es que por acortarlo no lo he puesto completo y la llave donde me indicas que se cierra el while pertenece a un "if" que está un poco más arriba.

Por lo demás, he probado lo que comentáis de no optimizar el código, y en efecto, a partir de ahí me ha funcionado todo correctamente. La verdad ese tipo de cosas deberían de venir en un manual o algo así porque jamás se me hubiera ocurrido que esa fuera la causa.

Una vez solventado el problema del código, me surge otro nuevo, esta vez a la hora de intentar conectar con el micro, usando el propio AVR Studio:
captura 1

El cable de conexión por un lado (el del micro) tiene un conector de 10 pines y por otro (el del Pc) el del puerto paralelo (25 pines). El problema es que todos los programadores del AVR emplean el USB o el Serie (como se ve en la imagen primera) y ninguno el paralelo. Sabéis cómo se puede añadir alguno al AVR Studio que utilice el paraelo?.
Detalle de conexiones del micro:

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

¿Que programador tienes? Personalmente, no me rompería el coco mucho e iría por algo seguro: el AVRISP MkII, USB, robusto, fiable y actualizable cuesta menos de 30 €, original de Atmel. Estas navidades miraré de comprarme otro, aunque igual intento conseguir otra cosa muy diferente (JTAGICE MkII, mucho más apetitoso y caro).

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

Pues en prinicipio entiendo que varios, me explico. El AVR Studio al abrir el cuadro de conexiones (la primera de las imágenes en mi post anterior) me deja escoger entre varios programadores, entre ellos el que comentas, el AVRISP MkII. Pero claro tengo el problemilla del puerto paralelo, aunque supongo que se puede resolver comprando un adaptador.
Saludos.

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

Y ¿Cómo se llama lo que conectas al puerto paralelo para luego conectarlo al conector ISP? Es decir, ¿que programador, chisme, placa, invento, etc tienes para programar el AVR? Si pones puerto paralelo, todo tiene la pinta de ser un STK200, obsoleto y de fabricación casera, probablemente sin comprobar. Si es así, mala suerte, el AVRStudio hace tiempo que dejó de programarlo. Para eso, se usa el PonyProg. Por desgracia, no tengo más información sobre este tipo de programadores.

Responder
Página 2 / 3
Compartir: