Desde la interrupción del temporizador hasta la ejecución de la función principal (PIC16f877)

-3

Estoy trabajando en un proyecto básico para un sistema de seguridad con PIC16f877 en MikroC, y tuve un problema relacionado con la interrupción del temporizador. Quiero que la interrupción se cancele cuando se alcanza la cantidad de tiempo elegida y quiero que el programa se vuelva a ejecutar desde el principio (comenzando desde cero). Esto es lo que he hecho hasta ahora (gracias de antemano, chicos):

    void InitTimer1() 
 {

       T1CON          = 0x39;
       TMR1IF_bit     = 0;
       TMR1H          = 0x0B;
       TMR1L          = 0xDB;
       TMR1IE_bit     = 1;
       INTCON         = 0xC0;
 }

 void Interrupt()
 {
 if (TMR1IF_bit){
  TMR1IF_bit = 0;
  TMR1H      = 0x0B;
  TMR1L      = 0xDB;
  time++;
  if(time == 38){   //20 == 5 sec, 38 == 10 sec   
  PORTB.RB1=0;

  //i want the interruption to be cancelled here and rerun 
  // the program since the begining of main function
          }
              }
}


   void main()
  {  //declaraion ...

  //i want the program to restart from loop
   LOOP :
   //some code

       else
       {
        InitTimer1();
        // some code running with the interrupt
        //if condition then rerun(no need to w8 for the 10seconds set in the interrupt)
                  {goto LOOP  ;}

                  }while (1);
       }

   }
    
pregunta ta7foun

2 respuestas

1

Varios problemas:

  1. Tu comentario es abismal, hasta el punto de la irresponsabilidad. Cargar constantes fijas como 39h, DBh, etc., en registros sin ninguna explicación de lo que significan los bits o incluso la intención general es ridícula. Deberías avergonzarte de ti mismo por tirar esa mierda delante de otros.

  2. ¿Cuál es el punto de restablecer el temporizador 1 a un valor fijo en la interrupción si va a reiniciar el programa, que luego inicializará el temporizador 1 de todos modos?

  3. La variable TIEMPO nunca se define ni se inicializa. Parece que quieres reiniciar el programa cuando llega a 38, pero sin que se haya inicializado, no hay garantía de cuándo será.

  4. Para reiniciar el programa, solo GOTO 0. No conozco las convenciones de ese compilador, pero para estar seguro, debe establecer PCLATH en 0 antes del salto. De lo contrario, el salto podría terminar en 800 h, 1000 h o 1800 h en su lugar.

respondido por el Olin Lathrop
0

No conozco los detalles específicos de su controlador, pero dudo que tenga algo como restablecer el software. Mi primer pensamiento sería establecer un indicador de "reinicio" en la ISR y verificar eso desde el bucle principal. Si está configurado, haz un goto principal. Sin embargo, esta solución tiene la desventaja de hacer ese salto no inmediatamente. Tienes que esperar hasta que el programa llegue a la comprobación de la bandera.

Segundo pensamiento sería asamblea. No puedo escribirlo, pero puedo imaginar que podría borrar su pila de llamadas y restablecer el puntero del programa al principio de main. Aunque no estoy seguro de eso.

Editar: tercer pensamiento: deja que el perro guardián se reinicie.

    
respondido por el jwsc

Lea otras preguntas en las etiquetas