TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: jhordy en 30 de Septiembre de 2018, 20:32:24
-
#include <avr/io.h>
#include "util/delay.h"
int main(void){
DDRD=0XFF;
PORTD=0x00;
/* Replace with your application code */
while(1){
for(int i=1;i<=128;i=i*2){
PORTD=i;
_delay_ms(300);
}
for(int j=128;j>=1;j-=j/2){
PORTD=j;
_delay_ms(300);
}
};
return 0 ;
}
// alguien sabe por que mi codigo no se ejecuta de manera infinita si esta dentro del while, solo hace los dos lasos for y nada mas
espero me puedan ayudar con esto soy nuevo en el tema.
-
Prueba a hacer un Debug, y verás de inmediato si realmente no se está ejecutando el bucle infinito, o es un problema de la manera de programar el puerto.
Quita ese punto y coma que hay tras la llave de cierre del While, no tiene utilidad y no se si puede afectar al bucle, en principio no debería.
-
suena curioso pero lo unico que ise para que funcionara fue cambiar en el ultimo lazo "for" , la parte de la condición j>=1 por j>1 , y el lazo funciona la perfección de adelante para atrás y así infinitamente.
-
Estás haciendo una división (1/2) que da de resultado 0.5 y guardandola en una variablede tipo int, es decir ese 0.5 se ha de truncar, si en lugar de guardarse en el int como 0 (que sería lo suyo) se guardase como 1 (u otro valor distinto de cero) te pasaría lo que inicialmente comentas.
Puedes dejar el código inicial, correr el debugger y visualizar el estado de la variable, o ver el código en ensamblador generado para ver lo que estaba haciendo el compilador.
-
El código original si se ejecuta de manera infinita. El detalle está en el segundo for que es infinito pues j nunca es menor a 1 (como ya notaste y corregiste).
Revisando la que se supondría última iteración cuando j vale 1, el siguiente valor de j se calcula:
j -= j / 2j vale 1, por lo que la división sería 1/2, como se está manejando enteros la división resulta en 0, con lo que la operación quedaría:
j -= 0por lo que j no sufre ningún cambio al no restarle nada.
Por lo tanto, en lugar de terminar el ciclo for se continúa de manera indefinida pues j se mantiene en 1.
La corrección es la que ya realizaste, cambiar la condición.
-
Es mejor escribir el código con la herramienta de código como ha hecho Geo, el "-" del "-=" yo ni lo había visto en el mensaje inicial.