Quiero hacer un boton de reinicio

estaba pensando hacerlo con una interrupcion externa, lo que quiero esque al pisarlo el programa se ejecute de nuevo, mi programa comienza con una presentacion y se queda parado en pulse iniciar iniciar es un boton que esta en una pc, pense usar una interrupcion externa pero nose, y pense que usando el master clear haria esto pero me borra el micro. este es el codigo






Código:
                                           ///**** EN NOMBRE DE DIOS TODOPODEROSO****///







#INCLUDE <18f4550.h>
#device adc=10
#fuses xt,nowdt
#use delay(CLOCK=20MHZ)
#FUSES XT,NOWDT,NOPROTECT,NOMCLR,CPUDIV1,NOLVP,HS,PUT
#INCLUDE <lcd.C>
#USE RS232 (BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, PARITY=N, BITS=8)
#include <math.h> // libreria de funciones matematicas 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ignore_warnings 216 
#define LED PIN_C0





             //Declaracion de Variables

     float MtCm,resRad,Tao1,Tao2,Tao3,AngRadMenor,res1=0,prom2=0,prom1=0,prom=0,masa1,masa2,masa3,X,PesoTuerca,PesoCuna,PesoBarra,PesoAcople,Mt,Tao=0,x1,x4,x5,x6,x7,lectura,conversion,Dx,Dy,Longitud,Diametro,J,Jx,C,r=0,res=0,rad,DyR,BaseTriangIso,Y1,Ang=0,AngMenor=0,AngMayor=0;
    
     int16 grad_may=0,vueltas=0;
     char P1[5],p2[5],p3[5],l[5],d[5];
     int z=0,y=0,bandera=0,cont=0;
     char valor;

     /// zona de codigo


VOID Configuracion()
{
    lcd_init();
    enable_Interrupts(Global);
    ENABLE_INTERRUPTS(INT_RDA);
    setup_adc_ports(AN0_TO_AN1);
    set_adc_channel(0);
    setup_adc(adc_clock_internal);
    enable_interrupts(int_ext);//configuracion de interrupcion externa
    enable_interrupts(int_ext1);
    ext_int_edge(h_to_l);
   // ext1_int_edge(h_to_l);                 // flanco
  
}

#INT_EXT
VOID Conteo_Timon()
{
    
               
    grad_may=(4*vueltas);
    vueltas++;
}

#INT_EXT1
VOID REINICIAR()
{

}







VOID Potenciometro()

{
    lectura=read_adc();
    conversion=((lectura*5)/1023);
    Dx=(10*conversion+0.5);
    X=(Dx-0.09); // correcion del datum
    prom=X+prom;
    cont++;
 }

 Void Ecuaciones()
 
{
             J=pow(Diametro,4);//Constantes
             Jx=((pi*J)/64)/5;    //Constantes
             C=Diametro/2;//Constantes
             rad=pi/180;
             //radio mm 260
             Dy=(pow(260,2)-pow(prom1,2)); //Ecuc. Circunferencia
             DyR=sqrt(Dy); // raiz cuadrada (260 2 -  x 2)
             Y1=(260-DyR);
             BaseTriangIso=sqrt(pow(prom1,2)+ pow(Y1,2)); // Base del triangulo isoceles
             Ang=((BaseTriangIso/2)/260);
             AngMenor=(2*asin(Ang)*180/pi);    //GRados
             AngRadMenor=(2*asin(Ang));       //Radianes                       
             AngMayor=grad_may;
          //   r=260*(AngMayor-AngMenor);
            // res=(r/Longitud); // Distorsion 
              
            // Calculo del Momento
            
      
           //Densidad=0.00000785; // kg/mm3
             
        
             //peso1=(masa1);  // pesa pequena 
             //peso2=(masa2); // pesa grande
             //peso3=(masa3); //pesa pequena 
             PesoCuna=4.500;
             PesoBarra=45.50;
             PesoAcople=3.300;
             //CircunSup=7.50;
             PesoTuerca=1.50;
             // distancias en milimetros
             x1=(1731.47)*sin(AngRadMenor);      //radianes
             x4=(1289.97)*sin(AngRadMenor);       //radianes
             x5=(746.7)*sin(AngRadMenor);        //radianes
             x6=(332.5)*sin(AngRadMenor);       //radianes
             x7=(1731.47)*sin(AngRadMenor);     //radianes
             Mt=(x1*(masa1+masa2+masa3)+(x4*PesoAcople)+(x5*PesoBarra)+(x6*PesoCuna)+(x7*PesoTuerca)); 
               MtCm=Mt/10;                                       //Mt en kg.mm
             Tao=Mt*C/Jx; 
             Tao2=Tao*9810;     // esfuerzo cortante por torsion,se expresa en mega pascales Kg/mm2
             Tao3=Tao2/1000;        // GigaPascal
              r=C*(AngMayor-AngMenor); // calculo del angulo de distorsion
             res=(r/Longitud); 
             resRad=res*pi/180; 

}

Void Transmitir()
{
prom1=prom/cont;

Ecuaciones();
prom2=prom1/100;
Tao1=Tao3/1000.00000;
res1=resRad/100.00000;
prom=0;
cont=0;
printf("%2.5f",res1);
printf("*");
printf("%2.5f",Tao1);
printf("*");
delay_ms(5000);
}

#INT_RDA
Void Serial()
{
valor=getc();

if (valor!=\'#\')
   {
   switch(y)
      {
      case 0: p1[z]=valor;
            break;
      case 1: p2[z]=valor;
            break;
      case 2: p3[z]=valor;
            break;
      case 3: d[z]=valor;
            break;
      case 4: l[z]=valor;
            break;
      }
   z++;
   }
else
   {
   y++;
   z=0;
   }
   if (y==5)
      {
      y=0;
      bandera=1;
      prom=0;
      cont=0;
      
      masa1=atof(p1);
      masa2=atof(p2);
      masa3=atof(p3);
      Longitud=atof(l);//Longitud de la probeta
      Diametro=atof(d); //Diametro de la probeta
      
      
     
      
      
      }
   }

Void Vizualizacion_LCD()
{

       lcd_gotoxy(1,1);
       printf(lcd_putc,"Tm=%2.2f",AngMenor); 
       printf(lcd_putc," ");
      
       printf(lcd_putc,"TM=%2f",AngMayor);
    
      
       lcd_gotoxy(1,2);
       printf(lcd_putc,"Mt=%2.2f",MtCm);
       



















       
       
}

Void Main()
{
set_tris_c(0X00);
//Port_C_Pullups(true);
output_C(0x00);




     Configuracion();
  
   lcd_gotoxy(1,1);
  lcd_putc("   ENSAYO DE");
  lcd_gotoxy(1,2);
   lcd_putc("    TORSION  ");
  delay_ms(4000);
  
  lcd_gotoxy(1,1);
  lcd_putc("              ");
  lcd_gotoxy(1,2);
  lcd_putc("              ");
  
  
  
  
  

While(TRUE)

{
       Potenciometro();
       Potenciometro();
       Potenciometro();
       Potenciometro();
       Potenciometro();
         }
     
     
     
     
     
     
   if(bandera==1)
       {
      Transmitir();
        }
      
   
         if (X>=42.55)
{

OUTPUT_HIGH(LED);
}
else
{
OUTPUT_LOW(LED);
}
 
      if (bandera==1)
      {
      Vizualizacion_LCD();
       delay_ms(500);
      }
      
       else 
       {
  lcd_gotoxy(1,1);
  lcd_putc(" PULSE INICIAR");
  
       } 
   
   
   
   
   
   
   
   
   
}
 
Última edición por un moderador:
Estaba pensando hacerlo con una interrupción externa.
Lo que quiero es que al pisarlo, el programa se ejecute de nuevo.
Eso es lo que hace el pin de reset en el microcontrolador.
Mi programa comienza con una presentación y se queda parado en pulse iniciar.
Iniciar es un botón que está en una pc.
¿El botón está en algún programa para PC o es un botón físico?
Pensé usar una interrupción externa pero no sé, y pensé que usando el Master Clear haría esto pero me borra el micro.
Al usar el pin Master Clear, no se borra el contenido del microcontrolador, únicamente se reincia el programa desde el vector de reset o dirección 0.

Si realizas una comunicación por RS-232, puedes crear una rutina para invocar subrutinas.
 
ok, se conecta un pulsador con una resistencia que vaya a la alimentacion cierto? , y en el fuses le coloco MCLR o no le coloco nada? gracias

INICIAR es un botón echo en una interfaz en visual studio
 
Si requieres que ese pin funcione como reset (Master Clear), no tienes que configurar nada, porque esa es la función por defecto si no se establece lo contrario, que es como lo tienes configurado en el código que subiste.
O sea: NOMCLR (Pin número 1 "MCLR" como entrada digital)

¿Se conecta un pulsador con una resistencia que vaya a la alimentación, cierto?
Así es.
Para más información sobre "Master Clear" puedes ver la sección 4.2 (Página 47 de la hoja de datos)
 
Última edición:
Atrás
Arriba