Autor Tema: Ayuda para cambiar variable fuera de void main()  (Leído 2986 veces)

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

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Ayuda para cambiar variable fuera de void main()
« 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?
« Última modificación: 12 de Mayo de 2015, 22:53:08 por MINDFIELD »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #1 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #2 en: 12 de Mayo de 2015, 23:57:01 »
Hola, no me funciona ni como una variable global ni local

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #3 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

Desconectado fuente

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 571
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #4 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.


Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #5 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  :?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #6 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #7 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!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #8 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
« Última modificación: 13 de Mayo de 2015, 21:56:52 por KILLERJC »

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #9 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?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #10 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 ?

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #11 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...

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #12 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??

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #13 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.

Desconectado MINDFIELD

  • PIC16
  • ***
  • Mensajes: 139
Re: Ayuda para cambiar variable fuera de void main()
« Respuesta #14 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?


 

anything