Autor Tema: cambiar el valor de una variable antes funcionaba!  (Leído 3627 veces)

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

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
cambiar el valor de una variable antes funcionaba!
« en: 18 de Diciembre de 2016, 00:06:19 »
hola amigos estoy tratando de hacer un temporizador para mi calefon electrico .
Lo que se me ocurrìo ,no se si es ortodoxo , es cambiar por medio de swichs el valor de una variable que almacena el conteo del timer1.No se que hago mal ahora asi no funciona.
Me podrian dar vuestra opinion ?
Código: [Seleccionar]
#include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,MCLR
#use delay(clock=4000000)
#use fast_io(b)

int16 contador=0;

#int_ext
void ext_isr()
   {
   disable_interrupts(int_timer1);
   output_toggle(PIN_B1);
   enable_interrupts(int_timer1);
   }


#int_timer1
void TIMER1_isr(void)
   {
      contador++;
      if(contador==100)
         {
               output_toggle(PIN_B7);
               output_bit(PIN_B5,1);
            contador=0;
          }
       
   }
 
   
void main()   {
      set_tris_b (0b00000001);
      set_tris_a (0b00000001);//swich que intenta cambiar el valor de la variable
      output_bit(PIN_B1,0);
      ext_int_edge(0,L_TO_H);//output_low(int_timer1);//Inicia con el led encendido
      setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
      set_timer1(192);
      enable_interrupts(INT_EXT);
      enable_interrupts(INT_TIMER1);
      enable_interrupts(GLOBAL);
           
           
 while(true)       
         {           
             if(input(PIN_B1)==0)
                   contador=0;

              if(input(PIN_B1)==1)//cuando coloco este codigo aqui el programa no funciona
                  contador == 2550;
         }
   }
   



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #1 en: 18 de Diciembre de 2016, 02:43:59 »
Es obvio retovil que no va a funcionar. Ninguno de tus 2 if harian que funcione.. Y me voy a explicar...

En tu TMR1 tenes que usas contador para saber cuando es que llego a las 100 interrupciones, asi activar la salida.
Ahi dentro tenes 2 cosas importantes en una sola linea:

Código: C
  1. if(contador==100)

La primera es que tiene que ser IGUAL a 100, otro valor no es permitido, es decir la condicion de igualdad, la otra es el numero 100 que es tu limite el cual comparas.

Entonces vamos al programa principal y tenemos esto, nomas que escrito de otra forma:

Código: C
  1. if(input(PIN_B1)==0)
  2.              {
  3.                     contador=0;
  4.              }
  5.              else
  6.              {
  7.                   contador == 2550;
  8.              }

Ahora pensemos un momento.. Tenemos que durante la ejecucion siempre se esta ejecutando el while del main, es decir el codigo de antes siempre se esta ejecutando. Ocurre la interrupcion del timer, entra al timer incrementa contador y sale volviendo al main. En el main SI o SI se le asigna un valor. Hagamos un ejemplo practico

Supongamos que PIN_B1 esta en 0.
Mientras esta en el main, se pone un 0 en contador.
Entra a la interrupcion, incrementa contador a 1, sale
Vuelve al main, y contador en 0 de nuevo.

Lo cual nunca va a activar el TMR1 ya que jamas contador va a ser 100.

Ahora si hacemos lo mismo pero PIN_B1 esta en 1. Ocurre que contador en ves de quedarse siempre en cero, va a tener el valor 2550.
Entra a la interrupcion, aumenta en 1, al valor 2551 y sale
En el main nuevamente se le pone el valor 2550.

Nunca se llega a cumplir que contador sea igual a 100.

Luego de explicado el por que no te funciona, mi pregunta para vos es.. ¿Por que queres cambiar esa variable? ( cual es tu objetivo )

PD: no es necesario deshabilitar las interrupciones y habilitarlas de vueltas como tenes en la interrupcion externa.
« Última modificación: 18 de Diciembre de 2016, 03:04:10 por KILLERJC »

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #2 en: 18 de Diciembre de 2016, 09:51:28 »
Retovil, veo que has tomado un atajo y creo que no es el camino adecuado, aunque a veces funcione.
En el hilo que pusiste anteriormente te propuse un ejercicio, no era por capricho, se trataba de que comprendas lo que haces. Si te limitas a copiar partes del codigo y amontonarlas en otro programa, existe la posibilidad de que te funcione, pero hay muchas mas posibilidades de que no sea asi, sobretodo si no estas entendiendo al 100 % lo que tratas de hacer.

Saludos.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #3 en: 18 de Diciembre de 2016, 16:56:43 »
Retovil, veo que has tomado un atajo y creo que no es el camino adecuado, aunque a veces funcione.
En el hilo que pusiste anteriormente te propuse un ejercicio, no era por capricho, se trataba de que comprendas lo que haces. Si te limitas a copiar partes del codigo y amontonarlas en otro programa, existe la posibilidad de que te funcione, pero hay muchas mas posibilidades de que no sea asi, sobretodo si no estas entendiendo al 100 % lo que tratas de hacer.

Saludos.
Me parecio claro el objetivo, que es sencillamene cambiar de un tiempo menor a un tiempo mayor


Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #4 en: 19 de Diciembre de 2016, 13:18:41 »
Es obvio retovil que no va a funcionar. Ninguno de tus 2 if harian que funcione.. Y me voy a explicar...
Supongamos que PIN_B1 esta en 0.
Mientras esta en el main, se pone un 0 en contador.
Entra a la interrupcion, incrementa contador a 1, sale
Vuelve al main, y contador en 0 de nuevo.

Lo cual nunca va a activar el TMR1 ya que jamas contador va a ser 100.
 
y KillerJc la pregunta del millon ,donde registra el programa el conteo de 100
para dar un uno en el pin B1 sino es en la variable contador? yo pense que todo el conteo se registraba en esa variable.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #5 en: 19 de Diciembre de 2016, 13:45:29 »
Vamos por parte... ¿Vos entendes como es que funciona una interrupcion en un microcontrolador?

Basicamente el micro se encuentra ejecutando lo del main ( es decir su loop infinito que es el while ) hasta que recibe una señal de interrupcion, en ese momento guarda la posicion donde estaba,  salta al vector de interrupcion y se atiende (ejecuta) el mismo, en tu caso es el #INT_TIMER1, finalizada esa rutina toma ese valor guardado ( cuando dejo el main) y sigue desde donde dejo.

Yo creo ( por que no se que estas queriendo hacer) que vos intentas hacer algo asi:

Código: C
  1. #include<16f628A.h>
  2. #Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,MCLR
  3. #use delay(clock=4000000)
  4. #use fast_io(b)
  5.  
  6. int16 contador=0,limite=100;
  7.  
  8. #int_ext
  9. void ext_isr()
  10. {
  11.    disable_interrupts(int_timer1);
  12.    output_toggle(PIN_B1);
  13.    enable_interrupts(int_timer1);
  14. }
  15.  
  16.  
  17. #int_timer1
  18. void TIMER1_isr(void)
  19. {
  20.       contador++;
  21.       if(contador>=limite)
  22.       {
  23.                output_toggle(PIN_B7);
  24.                output_bit(PIN_B5,1);
  25.             contador=0;
  26.       }
  27.        
  28.    }
  29.  
  30.    
  31. void main()   {
  32.       set_tris_b (0b00000001);
  33.       set_tris_a (0b00000001);//swich que intenta cambiar el valor de la variable
  34.       output_bit(PIN_B1,0);
  35.       ext_int_edge(0,L_TO_H);//output_low(int_timer1);//Inicia con el led encendido
  36.       setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
  37.       set_timer1(192);
  38.       enable_interrupts(INT_EXT);
  39.       enable_interrupts(INT_TIMER1);
  40.       enable_interrupts(GLOBAL);
  41.            
  42.            
  43.         while(true)      
  44.         {            
  45.                 if(input(PIN_B1)==0)
  46.                 {
  47.                         limite=100;
  48.                 }
  49.                 else
  50.                 {
  51.                         limite=200;
  52.                 }
  53.          }
  54.    }

En el que el estado del pin te permita seleccionar otro valor a igualar en el TMR1, cambiando el tiempo en el que se produce el toogle de B7, le cambie tambien el condicional a mayor o igual.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #6 en: 26 de Diciembre de 2016, 00:17:08 »
Si ,agrandamos la variable limite a 200 se supone que el tiempo es el doble .
Lo probe y bien .Ahora tengo dos tiempos con un swich. he agrandado los tiempos da para hacer otra variable. me gusta a que otro nivel lo puedo llevar ?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #7 en: 26 de Diciembre de 2016, 00:25:08 »
Podria ser presionar solo un boton, y que vaya intercambiando entre varias velocidades. Simplemente deberias tener un array con los valores y cada ves que se presiona el boton se procede a incrementar el indice del array. Ojo que debe tener proteccion para que antes se suelte el boton. Y proteccion de que el indice no supere la cantidad de valores que posee el array.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #8 en: 27 de Diciembre de 2016, 00:34:39 »
KillerJc ,he mirado el código y la verdad es que no entiendo como funciona el codigo que me mandaste ,esta buenisimo pero en este jpg te mando el interrogante.

* que es esto.jpg
(119.12 kB, 971x630 - visto 414 veces)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #9 en: 27 de Diciembre de 2016, 00:37:34 »
Simplemente cambia el PIN_B1 por el pin que estes usando como entrada ....

Yo no se cual es el circuito que estas usando. Use PIN_B1 para solo referencia. Y el codigo espera no un boton, sino una especie de llave.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #10 en: 27 de Diciembre de 2016, 18:48:41 »
No ,KillerJC , lo que  quiero decir es que así esta funcionando bien y no se si notas las contrariedades. En el bucle al pin b1 lo toma como entrada y en la interrupcion ext como salida ,de
echo esta configurado como salida .
Sin enbargo anda bien .Yo queria que me expliques porque funciona algo que esta incorrectamente
configurado. :(

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #11 en: 27 de Diciembre de 2016, 20:02:08 »
""funciona"". La idea esta para que con una llave externa uno pueda seleccionar entre una velocidad u otra, sin usar la interrupcion externa.

¿Por que funciona?

Lo primero que hicimos fue ponerlo como salida ( con el set_tris_b ), y decirle al compilador que no lo cambie ( con el fAST_IO ), por lo tanto SI o SI esta como salida. Entonces, la pregunta pasa a ser:
¿el input que valor da? ya que lo tengo como salida y no le permito que me lo cambie

El input te va a dar el valor que tengas puesto de salida. Es decir si hiciste output_low(PIN_B1) el input te va a dar que es un 0. Como la interrupcion externa produce un toggle sobre la salida, pasa de 0 a 1, y luego de 1 a 0. cambiando el estado de la salida, en la rutina principal al usar el input estaria leyendo el estado de esa salida y por lo tanto actuando en consecuencia ( modificando el valor de limite )
« Última modificación: 27 de Diciembre de 2016, 20:04:23 por KILLERJC »

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #12 en: 29 de Diciembre de 2016, 11:48:47 »
 :o genial ,a que bien!! .esta bien si saco el fast_io no funciona verdad .

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #13 en: 04 de Enero de 2017, 10:12:52 »
Citar
Podria ser presionar solo un boton, y que vaya intercambiando entre varias velocidades. Simplemente deberias tener un array con los valores y cada ves que se presiona el boton se procede a incrementar el indice del array. Ojo que debe tener proteccion para que antes se suelte el boton. Y proteccion de que el indice no supere la cantidad de valores que posee el array.
En esto estoy colocar un array ponele llamdo int8 vector[3]{300,800,1200};
int i;
int_ext
for (i=0;<=3;i=i+1); //aca es donde me hace ruido,accionando el boton pasa de una en una ,o for lo recorre todo?

en el while
 vector + limite ;
haber KillerJc que opinas de mi array ?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:cambiar el valor de una variable antes funcionaba!
« Respuesta #14 en: 04 de Enero de 2017, 11:21:06 »
Citar
int8 vector[3]{300,800,1200};

Tus valores no entran en un int8, deberian ser un int16.

Citar
for (i=0;<=3;i=i+1); //aca es donde me hace ruido,accionando el boton pasa de una en una ,o for lo recorre todo?

El for lo recorreria todo, como supongo esto debe estar relacionado con el codigo que le estas pidiendo a AcoranTf, en ese post te escribi una serie de dudas acerca de que queres hacer y como debe funcionar, por que hay muchas cosas que no estan dichas.