uControl
Febrero 24, 2017, 06:46:39 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: encender el timer para controlar un led  (Leído 557 veces)
0 Usuarios y 1 Visitante están viendo este tema.
pastor007
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 7



« : Noviembre 16, 2016, 10:28:15 »

hola ,gente del foro ,soy nuevo y estoy tratando de aprender algo de pic en c ,tengo el c compiler y el proteus 7.4 .
Bueno lo que quiero es que con un boton o sw encender un timer1 y que este al cabo de un tiempo apague el led y por medio de otro sw que detenga el conteo .Hice muchas pruebas pero no llegue a ningun lado , no pude lograr que el sw prenda al timer .

   #include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,MCLR
#use delay(clock=4000000)
#BYTE PORTB = 0X86
#BIT RB7 = 0x06.7
#use fast_io(b)

int16 contador=0;

#int_timer1
int1 start=0;               //Bandera de arranque del temporizador
         
//Coloca aqui la rutina de interrupcion del RB0
#int_EXT
void EXT_isr(void){
If (start){
  output_low(PIN_B0);
    }
      delay_ms(40);
      if(input(pin_b0)==1)
   {
      output_toggle(pin_b7);   
}
}

 void TIMER1_isr(void)
   {

      if(start)            //Si activado temporizador

         output_bit(PIN_B7,1);      //Inicia con el led encendido
       
         {

            contador++;

            if(contador==200)      //Si llega al final del tiempo
               {
                  output_bit(PIN_B7,0);         //Apaga el led
                  contador=0;
                  start=0;         //Desactiva el temporizador
               }
         }

   }


void main()
   {
      set_tris_b (0b00000001);         //Puerto B como salidas bits de 1 a 7, el 0 es entrada
         ext_int_edge(L_TO_H);     // activacion flanco de subida ,aunque por default es por flanco de subida .
       setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
      set_timer1(192);
      enable_interrupts(INT_TIMER1);
      enable_interrupts(GLOBAL);

  while(1)
  {

         }
   }
 
En línea

A la tierra que fueres haz lo que vieres.
ruibal69
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 254


« Respuesta #1 : Noviembre 17, 2016, 08:50:34 »

Hola.
No pongas delays dentro de las interrupciones.
Te falta habilitar interrupcion ext o por RB0 "enable_interrupts(int_ext);"
Si detectas la pulsasion del boton por interrupcion externa para que pones las intrucciones con los delays dentro del bloque de interrupcion, pones que te detecte por flanco de subida y sirve.
Nunca deshabilitas el timer1 para que pare de contar.
¿Donde esta conectado el 2º pulsador?
Si me equivoco pues lo mire un poco por encima, corregirlo.
« Última modificación: Noviembre 17, 2016, 08:58:32 por ruibal69 » En línea
ruibal69
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 254


« Respuesta #2 : Noviembre 17, 2016, 11:12:24 »

Prueba esto, no lo probe fisicamente , duracion del timer1 y del contador estan altos para apreciar cambios

#include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT
#use delay(clock=4000000)

int32 contador = 0;
int8 start = 0;
int8 tiempo = 0; //para timer1


        
//Coloca aqui la rutina de interrupcion del RB0
//Cuando pulsamos pulsador 1 activamos cuenta y encendemos led
#int_EXT
void EXT_isr(){
  
   set_timer1(0);  //Precargamos timer1
   start = true;    // Bandera activa
   output_high(PIN_B7); //encendemos led
   enable_interrupts(INT_TIMER1);
   tiempo = 0;
}

//Pasada cuenta timer, apagamos led
#int_TIMER1
void TIMER1_isr(){
   tiempo = tiempo + 1;
   set_timer1(0);
   if (tiempo > 5){ //  para 2.5 segundos encedido led aproximadamente
      output_low(PIN_B7);
      disable_interrupts(INT_TIMER1); //paramos timer1
      start = false;
   }
}

void main(){
      
      set_tris_b (0b00000011);         //Puerto B como salidas bits de 2 a 7, el 0 y 1 es entrada, pulsadores
                
      setup_timer_1(T1_INTERNAL| T1_DIV_BY_8);
      set_timer1(0);                    //Precargamos timer1, salta cada 500ms
      enable_interrupts(INT_EXT);      // Habilitamos interrupcion externa
      ext_int_edge(0,L_TO_H);           // activacion flanco de subida
      enable_interrupts(GLOBAL);

  while(true){
      if (start) {
         contador = 1;
         while(contador <= 30000){
            if (input(PIN_B1) ==1){         //pulsamos 2 pulsador
               disable_interrupts(INT_TIMER1); //paramos timer1
               output_low(PIN_B7);        //apagamos led
               contador = 30000;           //salimos cuenta
               start = false;
            }
        
         contador = contador + 1;
        
            //llegamos final cuenta bucle
            if (contador > 30000) {
               disable_interrupts(INT_TIMER1); //paramos timer1
               output_low(PIN_B7);        //apagamos led
               start = false;
            }
         }
      }
  }
}
« Última modificación: Noviembre 18, 2016, 11:02:26 por ruibal69 » En línea
pastor007
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 7



« Respuesta #3 : Noviembre 19, 2016, 12:23:54 »

ruibal69,maestro, muchas gracias ,te comento que el timer1 no funciona si el contador y las interrupciones.supongo que el timer1 no funciona porque es el que tiene que apagar el led y este no se apaga .Lo que hace despuès de un tiempo habilita los sw,si los sw porque en el momento de conteo los sw no funcionan .
Cuando funcionan ,el sw del rb1 apaga y con el sw del rb0 prende ,la idea es que se apague con el timer el led .Ahora a mi me parecio que estas instrucciones en c estaban bien  Huh?
 //Pasada cuenta timer, apagamos led
#int_TIMER1
void TIMER1_isr(){
   tiempo = tiempo ++;
   set_timer1(0);
   if (tiempo > 5 ){ //  para 2.5 segundos encedido led aproximadamente
      output_low(PIN_B7);
      disable_interrupts(INT_TIMER1); //paramos timer1
      start = false;
   }
}

De todos modos me falta aprender mucho de C no entiendo me voy a pique todas las instrucciones que pusiste .
En línea

A la tierra que fueres haz lo que vieres.
ruibal69
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 254


« Respuesta #4 : Noviembre 19, 2016, 07:56:53 »

Lo probe en proteus y funciona.
¿Que instrucciones no entiendes?

Pulsamos Sw1, detecta pulsacion por RB0 y entra en instrucciones del #int_ext.
 .Precargamos timer1 y habilitamos su intrrrupcion
 . Prendemos led

Pulsando Sw2 apagamos led y deshabilitamos timer1.

En el bloque main del programa principal, miramos si:
 .Si se pulso Sw1 la bandera start es true
 .Si start = true entonces :
      - Iniciamos una cuenta de hasta 30000 para mentener encendido el led
      - Si pulsamos sw2 salimos del bucle y deshabilitamos timer1, y start = false.

Lo que tenemos al final son dos contadores, uno controlado por el timer1 y otro por un bucle que va desde 0 a 30000. Ambos se anula su ejecucion por Sw2
Fue lo que entendi cuando planteastes el problema.

Trata de buscarte el siguiente libro, puede servirte de ayuda:
 "Compilador C CCS y simulador PROTEUS para Microcontroladores PIC"
 autor: Eduardo Garcia Breijo
editorial : Marcombo

Mira tambien como en Proteus cargar el fichero tipo .COF y poder crear puntos de control en programa fuente y asi sabes si hace lo que tu deseas.
En línea
ruibal69
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 254


« Respuesta #5 : Noviembre 19, 2016, 08:07:35 »

Esquema que utilice en proteus

https://www.dropbox.com/s/fag05ji1ll6z4wa/Screenshot_3.png?dl=0
En línea
pastor007
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 7



« Respuesta #6 : Noviembre 19, 2016, 04:10:08 »

si puede que tengas razon no me hice entender al principio .y si funciona . Haber si me explico .
tengo un sw y un led ,este ultimo esta encendido ,cuando apreto el sw .El timer(programado de antemano) empieza a contar al cabo de la cuenta segun este programado el led se apaga .
Despuès incorporo otro sw que es el que detiene el conteo del timer ,como si fuera una pausa .al soltarlo sigue su conteo .
Bien hasta aca es eso lo que quise que hiciera el pic 16f628A .  rolleyes2
En línea

A la tierra que fueres haz lo que vieres.
ruibal69
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 254


« Respuesta #7 : Noviembre 19, 2016, 06:54:04 »

Pues lo que tienes que hacer con el  sw:
 .deshabilitar interrupcion  timer1
 .leer el valor de timer1 en ese momento, es de tipo INT16
 .realizar la pausa programada o mientrear sw pulsado
 .precargar el timer1 con el valor obtenido anteriormente
 .habilitar interrupcion timer1

Si no me equivoque en mis calculos con los valores que te puse de configuracion y precarga de timer1, la interrupcion salta cada 500 milisegundos
« Última modificación: Noviembre 19, 2016, 06:58:45 por ruibal69 » En línea
pastor007
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 7



« Respuesta #8 : Diciembre 02, 2016, 02:15:41 »

Hola Ruibal69 , me la traduce digo ,porque hasta la primera parte entendi ,desable_interrupts(INT_EXT) get_timer toma el valor del timer y lo trasladas a la variable escojida ,
 
realizar la pausa programada o mientrear sw pulsado
.precargar el timer1 con el valor obtenido anteriormente
 aca me predi no se como realizar dicha pausa y lo demas me lo explicas en codigo porfavor  bang
En línea

A la tierra que fueres haz lo que vieres.
pastor007
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 7



« Respuesta #9 : Diciembre 05, 2016, 11:07:53 »

Pues lo que tienes que hacer con el  sw:
 .deshabilitar interrupcion  timer1
 .leer el valor de timer1 en ese momento, es de tipo INT16
 .realizar la pausa programada o mientrear sw pulsado
 .precargar el timer1 con el valor obtenido anteriormente
 .habilitar interrupcion timer1

Si no me equivoque en mis calculos con los valores que te puse de configuracion y precarga de timer1, la interrupcion salta cada 500 milisegundos
Entendi mas o menos asi ,puede ser en cada interruptor que se coloque ,modificando la carga del timer1, en este caso con el pin b1 como ejemplo
Código:
int16 leo_t1;
void timer1_isr()
if(input(PIN_B1)==0)
  disable_interrupts(Timer1);
   leo_t1=get_tiemer1();
     ext_int_edge(H_to_L);
   set_timer1(1000);
  enable_interrupts(timer1);
En línea

A la tierra que fueres haz lo que vieres.
pastor007
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 7



« Respuesta #10 : Diciembre 19, 2016, 07:43:48 »

Ruibal69 no soy programador ni siquiera llego a junior ,no se si me explico.  me voy a pique
con todo respeto pero hay cosas que son de un conocimiento experto que no manejo.
Si me puedes explicar ,lo que pretendo es un temporizador con dos swich . uno para manejar un tiempo de 8 minutos y otro para 14minutos . Esto es dificil ?
En línea

A la tierra que fueres haz lo que vieres.
ruibal69
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 254


« Respuesta #11 : Diciembre 20, 2016, 10:03:33 »

No es dificil.
Primero intenta entender como funciona el timer como temporizador.

En línea
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.039 segundos con 24 consultas. (Pretty URLs adds 0.007s, 2q)
loggkey