TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MINDFIELD en 12 de Mayo de 2015, 22:38:24

Título: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 12 de Mayo de 2015, 22:38:24
Hola tengo un codigo masomenos asi

Código: [Seleccionar]
#int_ext

void interrup_RA2()
{
      switch (flag1){
      case 0: flag1=1; ext_int_edge(L_TO_H);break;      
      case 1: flag1=0; ext_int_edge(H_TO_L);break;  
      }
      
      salida2_off;            
      delay_us(/*intensidad*/DELAYCOM);                          
      salida2_on;            
}

void main()
{
setup_comparator(NC_NC_NC_NC);
enable_interrupts(global);
enable_interrupts(int_rda);
set_tris_D(0x00);          
  
   enable_interrupts(int_ext);  
   ext_int_edge(H_TO_L);        
   setup_adc_ports (NO_ANALOGS);

while (TRUE)
{
        valor_B=getc();
      
        DELAYCOM = valor_B;
}

el problema es que me gustaria poder cambiar el valor de DELAYCOM que está en la linea (delay_us(/*intensidad*/DELAYCOM); vareandola segun (DELAYCOM = valor_B;) pero no puedo! como se hace para poder cambiarlo?
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: AngelGris en 12 de Mayo de 2015, 22:58:51
  Hola. Antes que nada decir que por lo general no es aconsejable utilizar delays dentro de las rutinas de interrupción. Por otro lado, no veo donde está definida DELAYCOM, si es una variable global no debería haber ningún problema en modificarla ya sea dentro del main o dentro de alguna función.
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 12 de Mayo de 2015, 23:57:01
Hola, no me funciona ni como una variable global ni local
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: KILLERJC en 13 de Mayo de 2015, 00:34:53
Deberias poder como dijo Angelgris

Código: C
  1. int DELAYCOM,valor_B;
  2.  
  3. #int_ext
  4. void interrup_RA2()
  5. {
  6.       switch (flag1){
  7.       case 0: flag1=1; ext_int_edge(L_TO_H);break;      
  8.       case 1: flag1=0; ext_int_edge(H_TO_L);break;  
  9.       }
  10.        
  11.       salida2_off;            
  12.       delay_us(/*intensidad*/DELAYCOM);                          
  13.       salida2_on;            
  14. }
  15.  
  16. void main()
  17. {
  18. setup_comparator(NC_NC_NC_NC);
  19. enable_interrupts(global);
  20. enable_interrupts(int_rda);
  21. set_tris_D(0x00);          
  22.  
  23.    enable_interrupts(int_ext);  
  24.    ext_int_edge(H_TO_L);        
  25.    setup_adc_ports (NO_ANALOGS);
  26.  
  27. while (TRUE)
  28. {
  29.         valor_B=getc();
  30.        
  31.         DELAYCOM = valor_B;
  32. }

Yo tambien apoyo la mocion de no poner un delay en la interrupcion
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: fuente en 13 de Mayo de 2015, 04:15:31
DELAYCOM tiene pinta de ser una constante definida en algún lugar que no vemos del código. Si la vuelve a definir como entero se le va a quejar, y con razón, el compilador.

Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 13 de Mayo de 2015, 19:54:30
Deberias poder como dijo Angelgris

Código: C
  1. int DELAYCOM,valor_B;
  2.  
  3. #int_ext
  4. void interrup_RA2()
  5. {
  6.       switch (flag1){
  7.       case 0: flag1=1; ext_int_edge(L_TO_H);break;      
  8.       case 1: flag1=0; ext_int_edge(H_TO_L);break;  
  9.       }
  10.        
  11.       salida2_off;            
  12.       delay_us(/*intensidad*/DELAYCOM);                          
  13.       salida2_on;            
  14. }
  15.  
  16. void main()
  17. {
  18. setup_comparator(NC_NC_NC_NC);
  19. enable_interrupts(global);
  20. enable_interrupts(int_rda);
  21. set_tris_D(0x00);          
  22.  
  23.    enable_interrupts(int_ext);  
  24.    ext_int_edge(H_TO_L);        
  25.    setup_adc_ports (NO_ANALOGS);
  26.  
  27. while (TRUE)
  28. {
  29.         valor_B=getc();
  30.        
  31.         DELAYCOM = valor_B;
  32. }

Yo tambien apoyo la mocion de no poner un delay en la interrupcion

el codigo, lineas más lineas menos esta como este! estoy tratando de varear
Código: [Seleccionar]
salida2_off;           
      delay_us(/*intensidad*/DELAYCOM);                         
      salida2_on;
mediante el retardo delay_us definido por DELAYCOM, es para hacer un dimmer y es el unico ejemplo que tengo funcionando, ademas despues tenia ganas de adaptarlo para controlar 8 dimmer con un pic... ya no se que hacer, no me funciona nada de nada  :?
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: AngelGris en 13 de Mayo de 2015, 20:13:46
  Si como dice fuente, es un "define", no lo vas a poder variar, ya que es una constante. Por otro lado, habría que ver si a la función delay_us se le pueden pasar variables o sólo se le pueden pasar valores. En el caso de poder pasarle variables, bastaría con definir una variable (con otro nombre, por ejemplo delayCom) y cambiar el valor de dicha variable según se lo necesite.
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 13 de Mayo de 2015, 20:43:01
  Si como dice fuente, es un "define", no lo vas a poder variar, ya que es una constante. Por otro lado, habría que ver si a la función delay_us se le pueden pasar variables o sólo se le pueden pasar valores. En el caso de poder pasarle variables, bastaría con definir una variable (con otro nombre, por ejemplo delayCom) y cambiar el valor de dicha variable según se lo necesite.

no es define porque es una variable creada por mi de tipo entero! ahora tendria que ver como dices si delay_us se le puede pasar variables o solo valores... con variables no funciona ya que ese es mi problema!
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: KILLERJC en 13 de Mayo de 2015, 21:47:35
segun el manual de CCS delay_us() y delay_ms() aceptan variables y constantes de hasta 16 bits
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 14 de Mayo de 2015, 06:52:40
Entonces no se porque no cambia de valor... en pic c como se hace para correr el compilador paso por paso?
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: KILLERJC en 14 de Mayo de 2015, 10:01:20
Ahora que le veo tengo un par de dudas....

#int_ext
void interrup_RA2()


Generalmente el que acepta interrupcion por flanco es el RB0, pero ahi tenes puesto RA2, esta bien conectado o es un error de tipeo?

Te das cuenta que el maximo tiempo de espera para el cambio de tu salida es de 255us , imposible de ver con el ojo humano y esto ocurriria cuando se detecte un flanco.?
Aunque con algunas teclas sea aun mucho menor ese tiempo

Todo lo que dije se esta cumpliendo o es lo que queres hacer ?
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 14 de Mayo de 2015, 18:34:35
tendria que hacer más pruebas pero te puedo decir que delay_us(/*intensidad*/DELAYCOM); si cambia! si ago por ejemplo delay_us(1000); y ese valor (1000) es real y asi si se ve como en el osciloscopio de proteus hay cambios, no recuerdo cuantos micro segundos son pero no sobrepasa un semiciclo de 50hz de la simulacion de la red...
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 14 de Mayo de 2015, 18:46:27
No entiendo como, pero por RB0 entran los 50hz   :shock: Como se configura RB0 para que detecte los 50hz en un pic 16f877??
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: KILLERJC en 14 de Mayo de 2015, 19:09:38
Esta bien, por eso pregunte si era un error de tipeo.

El maximo es de 255us

por que :

        valor_B=getc();

Espera un valor desde la UART y lo guarda en valor_B, si es que no estas usando la UART, podrias probar nomas con un codigo


Código: C
  1. int DELAYCOM,valor_B;
  2.  
  3. #int_ext
  4. void interrup_RA2()
  5. {
  6.       switch (flag1){
  7.       case 0: flag1=1; ext_int_edge(L_TO_H);break;      
  8.       case 1: flag1=0; ext_int_edge(H_TO_L);break;  
  9.       }
  10.        
  11.       salida2_off;            
  12.       delay_us(DELAYCOM);         /*intensidad*/                
  13.       salida2_on;            
  14. }
  15.  
  16. void main()
  17. {
  18. setup_comparator(NC_NC_NC_NC);
  19. enable_interrupts(global);
  20. enable_interrupts(int_rda);
  21. set_tris_D(0x00);          
  22.  
  23.    enable_interrupts(int_ext);  
  24.    ext_int_edge(H_TO_L);        
  25.    setup_adc_ports (NO_ANALOGS);
  26.  
  27. while (TRUE)
  28. {
  29.         valor_B=1000;
  30.        
  31.         DELAYCOM = valor_B;
  32. }

Le saque el comentario fuera de la funcion por que me molestaba.. no deberian ir dentro. Y lo que hice fue ponerle un valor fijo, de esa forma vas a ver si funciona o no.
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 14 de Mayo de 2015, 19:17:34
 :x Funciona pero hace esto, si escribo
Código: [Seleccionar]

salida2_off;           
delay_us(1000);                       
salida2_on;           
se nota mucho mejor el cambio, y si ago esto
Código: [Seleccionar]
while (TRUE)
{
        valor_B=1000;
       
        DELAYCOM = valor_B;
}
funciona pero casi no se nota el cambio, porque?
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: KILLERJC en 14 de Mayo de 2015, 20:05:20
Un error mio, seguro que no se nota por que yo puse:

int DELAYCOM,valor_B;

8 bits , maximo 255
Reemplazalo por:

int16 DELAYCOM,valor_B;

De esa forma puede llegar a 1000.


Si anda quiere decir que era tu problema, ya que el getc() espera un caracter por la UART y tal ves no se lo estabas enviando
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 14 de Mayo de 2015, 20:18:51
No funciona, solo si ago
Código: [Seleccionar]
salida2_off;           
      delay_us(19750);   //maximo 19750                         
      salida2_on;
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: KILLERJC en 14 de Mayo de 2015, 20:46:36
Proba:

Código: C
  1. int16 DELAYCOM,valor_B;
  2.  
  3. #int_ext
  4. void interrup_RA2()
  5. {
  6.       switch (flag1){
  7.       case 0: flag1=1; ext_int_edge(L_TO_H);break;      
  8.       case 1: flag1=0; ext_int_edge(H_TO_L);break;  
  9.       }
  10.       DELAYCOM = 1000;
  11.        
  12.       salida2_off;            
  13.       delay_us(DELAYCOM);         /*intensidad*/                
  14.       salida2_on;            
  15. }
  16.  
  17. void main()
  18. {
  19. setup_comparator(NC_NC_NC_NC);
  20. enable_interrupts(global);
  21. enable_interrupts(int_rda);
  22. set_tris_D(0x00);          
  23.  
  24.    enable_interrupts(int_ext);  
  25.    ext_int_edge(H_TO_L);        
  26.    setup_adc_ports (NO_ANALOGS);
  27.  
  28. while (TRUE)
  29. {
  30. }

Si no funciona me doy por vencido.
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 14 de Mayo de 2015, 21:13:57
Asi si funciona pero si lo ago dentro del while (true) no, porque?
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: hortoedro en 15 de Mayo de 2015, 05:50:06
Asi si funciona pero si lo ago dentro del while (true) no, porque?

Comprueba con el proteus el valor de DELAYCOM después de pasar por el while (TRUE) a ver si se almacena bien para trabajar con el en la interrupción.

Un saludo
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 15 de Mayo de 2015, 06:57:22
y como ago eso?
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 17 de Mayo de 2015, 08:59:36
ya no voy a renegar más con ese codigo, ahora estoy renengando con otro  :mrgreen: saludos y gracias a todos los que me ayudaron! porque demasiado buenos son para aguantarme  :D
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: KILLERJC en 17 de Mayo de 2015, 10:49:50
Sinceramente no se por que no te hace caso, ahi se ve claramente que que funciona con variables, asi que no entiendo por que.
Título: Re: Ayuda para cambiar variable fuera de void main()
Publicado por: MINDFIELD en 17 de Mayo de 2015, 19:46:37
Gracias por tú ayuda! te agradezco mucho!!! ya deje ese codigo pero ahora tengo que preguntar por otro parecido con el que estoy renegando  :(