Autor Tema: Ayuda con codigo para un temporizador  (Leído 1456 veces)

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

Desconectado sokoloko

  • PIC12
  • **
  • Mensajes: 77
Ayuda con codigo para un temporizador
« en: 03 de Noviembre de 2010, 13:42:50 »
Hola amigos!!

Estoy programando un sencillo temporizador, con una entrada que establece el tiempo de conteo, y otra que activa el temporizador.

El codigo lo tengo y funciona, pero no consigo "pensar" la forma en que se reinicie el programa, es decir, que si ya a empezado a contar y doy del pulsador de nuevo, empiece la cuenta desde cero.

Existe alguna instruccion que puesta en el codigo de la interrupcion me "resetee" el PIC??? o sino a ver si alguno me puede ayudar a realizarlo con codigo.

Dejo el .c y la simulacion en proteus. Saludos y gracias.

Código: [Seleccionar]
// Control temporizado con PIC 16F88
// Puerto A como salida y B como entrada
// Hay 2 entradas:
//   - RB0 o INT que inica y resetea el temporizador
//   - RB3 segun su estado cambia el valor de la temporizacion.
// Funcionamiento:
// Al pulsar el pulsador de RB0 segun este RB3 se inicia la temporizacion de 60 o de 30 sg.
// En el primer cuarto de ese tiempo, no se activa ninguna salida.
// En el segundo, tercero y cuarto cuartos, se activa un led en cada uno.
// Despues se activa otro led durante 2sg.

#include <16f88.H>
#fuses INTRC, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO, NOMCLR, NOBROWNOUT, CCPB3, INTRC_IO
#use delay(clock=8000000)
#use fast_io(B)
#use fast_io(A)
#byte port_A = 0x05  
#byte port_B = 0x06  

int Ttotal=0;  // Valor del tiempo total
int Band=0;    // Variable de bandera

// interrupcion por cambio de B0
#INT_EXT
void INTER (void){
   Band=1;   //Cambia la variable bandera.
}

void Espera (void) {    // Espera un cuarto del tiempo total.
   int i;
   for(i=0;i<=Ttotal/4;i++){
      delay_ms(1000);
   }
}
//----------------------------------Funcion Main--------------------------------------
void main(void) {                //Funcion principal del microprocesador.

   setup_oscillator(OSC_8MHZ);    
   ext_int_edge(L_TO_H);                    // Se activa la interrupcion de B0 en el flanco de subida.
   enable_interrupts(GLOBAL);               // Permite interrupciones.  
   enable_interrupts(INT_EXT);              // Activa la interrupcion externa de B0.
   set_tris_A(0x00);                       // Puerto A como salida.
   set_tris_B(0xFF);                       // Puerto B como entrada.  
   port_A = 0b00000000;                    // Salidas todas a cero.

   while(TRUE) {   // Bucle que se ejecuta siempre.
    
   if (Band==0){  // Si se pulsa el pulsador, sino no hace nada.
      
         if(input(PIN_B3)) {  //leemos la entrada y asignamos el valor a Ttotal valor en Sg.
            Ttotal=60;       // Valor para un minuto.
         } else {
            Ttotal=30;  
       }      
       delay_ms(50);  // para no recargar emulacion.
      
      } else {     //Si se ha pulsado la interrucion empieza la temporizacion.

   //-------------------------------- Primer -------------------------------------------
      port_A = 0b00000000;
      espera();
   //-------------------------------- Segun -------------------------------------------
      port_A = 0b00001000;  
      espera();
   //-------------------------------- Tercer -------------------------------------------
      port_A = 0b00000100;    
      espera();
   //-------------------------------- Cuarto -------------------------------------------
      port_A = 0b00000010;    
      espera();
   //-------------------------------- Final -------------------------------------------
      port_A = 0b00000001;  
      delay_ms(2000);
      Band=0;

   }
        
   }
}
« Última modificación: 03 de Noviembre de 2010, 13:45:12 por sokoloko »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con codigo para un temporizador
« Respuesta #1 en: 03 de Noviembre de 2010, 13:57:15 »
Existe la función reset_cpu()


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado sokoloko

  • PIC12
  • **
  • Mensajes: 77
Re: Ayuda con codigo para un temporizador
« Respuesta #2 en: 03 de Noviembre de 2010, 15:20:56 »
Gracias por la respuesta Suky,

Desconocia esa instrucción, y viene bien conocerla.

Lo malo es que si la pongo en  el codigo el proteus se vuelve loco, usa el 100% de la cpu y se cuelga.

Asi que de momento (al menos para una simulacion) no me vale.

Pero gracias, jeje!!

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Ayuda con codigo para un temporizador
« Respuesta #3 en: 03 de Noviembre de 2010, 19:08:47 »
Hola sokoloko, una pequeña observación es que de estos dos fuses solo debes utilizar uno: INTRC o INTRC_IO.  Ahora con el tema, creo que lo mejor para lo que quieres hacer, sería implementar el contador de tiempo por medio de un Timer del PIC.  Lo que ocurre cuando utilizas instrucciones como: delay_ms(); o cualquier tipo de bucle como por ejemplo for(), la interrupción de la rutina solo se puede hacer cuando temine una de estas instrucciones o bucles, a menos que hagas lo que te sugiere Suky.

Saludos!

Desconectado sokoloko

  • PIC12
  • **
  • Mensajes: 77
Re: Ayuda con codigo para un temporizador
« Respuesta #4 en: 08 de Noviembre de 2010, 09:01:26 »
Hola,

Tras probar con la instruccion de reset, y ver que no me simula bien. He conseguido solucionar el problema.   :-/!!

Solo tenia que usar la entrada MCLR del pic para resetearlo mediarte señal externa, y de esta forma me funciona sin problema.

MUchas gracias a todos por los consejos  :)

Saludos.


 

anything