Autor Tema: DUDA WHILE PIC16F628A  (Leído 1580 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado nomakon

  • PIC10
  • *
  • Mensajes: 7
DUDA WHILE PIC16F628A
« en: 30 de Mayo de 2016, 15:40:38 »
Buenas tardes, soy nuevo en esto de programar en C para pics

necesito una manito

Código: [Seleccionar]
#include <main.h>
void main()
{
   //Led Rotatorio
   while(true)
   {
      output_high(LED1);
      output_low(LED2);
      delay_ms(500);
      output_high(LED2);
      output_low(LED1);
      delay_ms(500);
   }
//Led Parpadeo 1 o consiguientes
while(true)
   {
      output_low(LED3);
      delay_ms(500);
      output_high(LED3);
      delay_ms(500);
      output_low(LED4);
      delay_ms(500);
      output_high(LED4);
      delay_ms(500);
      output_low(LED5);
      delay_ms(500);
      output_high(LED5);
      delay_ms(500);
   }
}

La primer rutina en el while me la ejecuta pero la segunda no

Que estoy haciendo mal?

Necesito que por un lado secuencie los leds en el primer while y a su vez ejecute otra secuencia por otras salidas del pic encendiendo y apagando 1 o mas salidas con diferentes tiempos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DUDA WHILE PIC16F628A
« Respuesta #1 en: 30 de Mayo de 2016, 15:52:24 »
En todo programa debe existir un solo while(true) o while(1), esto es un loop infinito.

El while va a ejecutar lo que tenga dentro mientras la condicion dentro de sus parentesis sea verdadera ( o distinto de 0 ). Ejemplo:

Código: C
  1. int i=0;
  2. while( i < 7 )
  3. {
  4.     i++;
  5.     output_toggle(LED2);
  6.     delay_ms(500);
  7. }
  8.  
  9. while(true);
Este ejemplo va a comenzar con i = 0, lo cual la condicion es verdadera y ejecuta el codigo dentro, el primer paso se incrementa i a 1, se enciende el LED2 y espera 500ms, segundo paso i=2, se apaga el LED2 y espera otros 500ms. Asi hasta que i vale 6, cuando entra de nuevo al codigo i se aumenta a 7, se cambia el estado de la salida, espera 500ms, y al valer 7 ya no cumple mas la condicion de i menor a 7, por lo tanto no se ejecuta mas.

El while(true) que puse al final es para que se quede ahi sin hacer mas nada hasta que se resetee el micro. ( Como dije siempre debe existir un while(true) )

Respecto a tu programa entra a tu primer while, y cuando llega al final se fija en la condicion, al seguir siendo verdadera ( true ) vuelve a repetirlo. Una y otra ves, por lo cual NUNCA va a salir de alli.
Si quisieras que se ejecute lo otro, incorporalo todo dentro de un solo while:

Código: C
  1. void main(void)
  2. {
  3.    //Led Rotatorio
  4.    while(true)
  5.    {
  6.       output_high(LED1);
  7.       output_low(LED2);
  8.       delay_ms(500);
  9.       output_high(LED2);
  10.       output_low(LED1);
  11.       delay_ms(500);
  12.       //Led Parpadeo 1 o consiguientes
  13.       output_low(LED3);
  14.       delay_ms(500);
  15.       output_high(LED3);
  16.       delay_ms(500);
  17.       output_low(LED4);
  18.       delay_ms(500);
  19.       output_high(LED4);
  20.       delay_ms(500);
  21.       output_low(LED5);
  22.       delay_ms(500);
  23.       output_high(LED5);
  24.       delay_ms(500);
  25.    }
  26. }

Buscate un tutorial sobre los loops y control de flujo de C, para que aprendas sobre los if, while, for, do..while , switch, etc.
Seguro que hay ejemplos y de esa forma podes ver las diferencias.
« Última modificación: 30 de Mayo de 2016, 15:57:31 por KILLERJC »

Desconectado nomakon

  • PIC10
  • *
  • Mensajes: 7
Re:DUDA WHILE PIC16F628A
« Respuesta #2 en: 30 de Mayo de 2016, 15:57:27 »
Si pero lo que yo deseo es que se ejecuten los 2 a la vez, si la rotacion de A0 y A1 y a su vez A2 y A3 con sus respectivos tiempos, de la manera en que lo hemos puesto ahi primero se ejecuta uno, termina de ejecutarse ejecuta lo segundo y vuelta a empezar. lo que necesito es que ambos programas inicien juntos.

Iluminame porfa =)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DUDA WHILE PIC16F628A
« Respuesta #3 en: 30 de Mayo de 2016, 16:10:30 »
Una cosa que tenes que pensar es que nunca vas a tener 2 cosas ejecutandose a la ves, asi que tenes que pensar una forma de hacerlo todo "junto"

A0 y A1 lo que hacen simplemente es cambiar de estado.

Código: C
  1. #USE FAST_IO(A)
  2.  
  3. void main(void)
  4. {
  5.      int temp;
  6.      set_tris_a(0x00);
  7.      output_a(0b00010001);
  8.      while(1)
  9.      {
  10.         delay_ms(500);
  11.         temp = input_a() & 0b00011100;     //Dejo solo A4 a A2
  12.         temp >>= 1;                                 // Roto
  13.         if(temp == 0b10 )                         // Me pregunto si llego al final, es decir si roto 3 veces.
  14.         {
  15.             temp = 0b00010000;                  // Si es asi repongo el valor para A4
  16.         }
  17.         temp = temp | ( input_a() & 0b11);   // Junto el valor rotado + el valor de las salidas de A1 y A0
  18.         output_a(temp ^ 0b11);       // Invierto los bits A0 y A1 y muestro en puerto.
  19.      }
  20. }

No se si va a funcionar pero podes ir viendo las instrucciones y ver que intente hacer.

Desconectado nomakon

  • PIC10
  • *
  • Mensajes: 7
Re:DUDA WHILE PIC16F628A
« Respuesta #4 en: 31 de Mayo de 2016, 13:01:33 »
No fui capaz =(

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DUDA WHILE PIC16F628A
« Respuesta #5 en: 31 de Mayo de 2016, 14:43:51 »
No fui capaz =(

De que cosa ?, de entenderlo ?

Vos intentabas hacer esto:

1- Encender A0 y apagar A1
2- 500ms espera
3- Encender A1 y Apagar A0
4- 500ms de espera.
5- Volver a empezar

Por otro lado tambien querias hacer esto:

1- Encender A4
2- 500ms espera
3- Apagar A4 y encender A3
4- 500ms de espera
5- Apagar A3 y encender A2
6- 500 ms de espera.
7- Volver a empezar

Como te decia para que se ejecuten las 2 cosas al mismo tiempo tenes que hacerlo JUNTO!, una forma seria tomar los dos del mismo numero de ambos programas:

1- Encender A0 y apagar A1, Encender A4
2- Espera 500ms
3- Encender A1 y Apagar A0, Apagar A4 y encender A3
4- Espera 500ms
5- Encender A0 y apagar A1, Apagar A3 y encender A2
6- Espera 500ms
7- Encender A1 y Apagar A0, Encender A4
etc...

Y tendrias tu programa corriendo. Esta forma es bastante simple de realizar. Tal ves con la otra te la complique.

Código: C
  1. int8 Valores[6] = {0b00010001,0b00001010,0b00000101,0b00010010,0b00001001,0b00000110};
  2. void main(void)
  3. {
  4.   int8 i = 0;
  5.   while(true)
  6.   {
  7.       output_b(Valores[i]);
  8.       i++;
  9.       if ( i == 6 )
  10.       {
  11.              i = 0;     //Reseteo por que llego a 6
  12.       }
  13.       delay_ms(500);
  14.   }
  15. }

Desconectado nomakon

  • PIC10
  • *
  • Mensajes: 7
Re:DUDA WHILE PIC16F628A
« Respuesta #6 en: 03 de Junio de 2016, 13:50:33 »
No lo que yo intento hacer es que A0 y A1 empiecen su secuencia con sus tiempos y que A2 y A3 tambien trabajen a la vez con otra diferencia de tiempos en los intervalos.

Muchas gracias por tu ayuda... creo que al final terminare armando 2 circuitos con 555 JAJAJAJ

UN abrazo!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DUDA WHILE PIC16F628A
« Respuesta #7 en: 03 de Junio de 2016, 14:00:59 »
Entonces usa los timers, vas a necesitar 2 para hacer lo que queres.

Desconectado nomakon

  • PIC10
  • *
  • Mensajes: 7
Re:DUDA WHILE PIC16F628A
« Respuesta #8 en: 05 de Junio de 2016, 01:28:53 »
Nunca los use asi que tendre que ponerme a estudiar un poquito al respecto. Tenes algun ejemplo ? Mil Gracias!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DUDA WHILE PIC16F628A
« Respuesta #9 en: 05 de Junio de 2016, 02:02:45 »
Con CCS nada. No me manejo con el. Pero busca en el foro o en internet que seguro hay ejemplos de sobra


 

anything