Autor Tema: Que estoy haciendo mal  (Leído 1644 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Que estoy haciendo mal
« 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

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Que estoy haciendo mal
« Respuesta #1 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!!
Saludos desde Huelva (ESPAÑA)

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Que estoy haciendo mal
« Respuesta #2 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.


 

anything