TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: badtzdizzy en 09 de Septiembre de 2004, 18:40:00

Título: Que estoy haciendo mal
Publicado por: badtzdizzy en 09 de Septiembre de 2004, 18:40:00
No se que estoy haciendo mal a la hora de querer generar una señal cuadrada de frecuencia constante y ciclo de trabajo del 50%. Estoy utilizando for"s pero al momento de encender el pic pues solo me manda un nivel bajo si dejo fuera de los for los output y un nivel alto si dejo los output dentro de uno de los for.
Codigo:

#include <16f874A.h>
#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT  //define los fusibles que se deben poner en al parte al momento de programar
#use delay(clock=20000000)  //le dice al compilador la velocidad del procesador y habilita el uso de las funciones delay_ms() and delay_us().

void main()
{
   int i,j;
   int periodo=1;
   int ciclo=10;
   
   set_tris_a(0x00);
   set_tris_b(0xFF);
   
   while(TRUE)
      {
   
         for(i=1;i=periodo;i++)
            {
               for(j=1;j=ciclo;j++)
                  {
                     //output_high(PIN_A0);
                     delay_ms(1);
                  }
            }
         output_high(PIN_A0);
                  for(i=1;i=periodo;i++)
            {
               for(j=ciclo;j<20;j++)
                  {
                     //output_low(PIN_A0);
                     delay_ms(1);
                  }
            }
         output_low(PIN_A0);
               }
}




Ahora si que no se ni por donde. De antemano gracias por la ayuda
Título: RE: Que estoy haciendo mal
Publicado por: cucaracha en 09 de Septiembre de 2004, 20:34:00
Debes repasarte la instrucción for.

Recuerda, for(A;B;C)
Primero al entrar ejecuta A y compara si cumple B. Si cumple entra. Una vez finalizado ejecuta C y comprueba B. Si cumple entra. Esto se vuelve a repetir hasta que no se cumpla B. Entonces sale.
Por ejemplo:
int ciclo=10;
 for(j=1;j=ciclo;j++) {.... }
Al entrar hace j=1, compara si j=ciclo, osea si 1=10. Como es distinto sale de for (no se si te das por aludido)

for (j=1;j<=ciclo;j++){.....}
En este caso el ciclo se repite por 10 veces.
o lo que es lo mismo:
 for(j=0;j<ciclo;j++) {....}

Revisa esos bucle for.

Por cierto, el 16F874A tiene 2 módulos CCP, osea que puedes tener 2 PWM de la misma frecuencia con distinto duty. Si la frecuencia está dentro del rango para ese cristal, te será mejor usar eso, ya que al ser hard no ocupas al micro en realizarla. La programas y listo, salida PWM por pin. Y en C es bastante fácil.

Saludos!!
Título: RE: Que estoy haciendo mal
Publicado por: pocher en 10 de Septiembre de 2004, 01:33:00
Hombre badzdizzy eso de repetir el tema no está bien, yo contestando a esta misma pregunta por otra parte y resulta que Cuca ya te la había solucionado.