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: