Estou com um probleminha em um LPC1766, tenho o programa abaixo, onde eu tenho a leitura de um acelerometro atravez do A/D e apos isso executo um calculo para determinar o angulo de inclinação do aceletrometro.
To da vez que o calculo vai ser executado acontece uma exeção: HardFault_handler. e o programa fica travado no vetor de exeção. Estou trabalhando com o complidador uViosin V4.12. o programa todo é escrito em C++;
Desculpe pela pessima identação mas este é meu primeiro tópico, a formatação se perdeu ao colar o código.
volatile unsigned long Cont15ms=0;
volatile unsigned long Cont1s=0;
volatile unsigned short Flag1s, Flag15ms;
extern "C"
{
void SysTick_Handler()
{
Cont15ms++;
if(Cont15ms>15)
{
Flag15ms=1;
Cont15ms=0;
}
Cont1s++;
if(Cont1s>1000)
{
Flag1s=1;
Cont1s=0;
}
}
}
extern "C"
{
void HardFault_Handler(void )//CPU fica travada neste ponto
{
}
}
int main(void)
{
unsigned int AnguloLimiteX=60,AnguloLimiteY=60;
unsigned int ContAmostra;
unsigned char teste[15];
unsigned int Cont1Seg=0x5000;
unsigned int ContADC=500;
FiltroInclinometroX=0;
FiltroInclinometroY=0;
LPCPort.ConfiguraPino(PIO0_27);
LPCPort.ConfigIOPin(PIO0_27,1);
LPCPort.EscrevePino(PIO0_27,1);
init_calibration_val_dir(32768000);
Sistema.ConfiguraCPUClock();
SysTick_Config(0x176FF);
LPCPort.ConfiguraPino(PIO2_06);
LPCPort.ConfigIOPin(PIO2_06,1);
LPCPort.EscrevePino(PIO2_06,1);
Display.InicializaLcd();
Display.SetBackLite(7);
Display.ChaveLCD(1);
Display.Clr(0x00);
LPCPort.EscrevePino(PIO2_06,0);
teste[0]='Y';
teste[1]=0;
Display.GDispPixStrAt(90,1,teste, 5,1);
teste[0]='X';
teste[1]=0;
Display.GDispPixStrAt(25,1,teste, 5,1);
Display.GDispPixStrAt(80,50,teste, 5,1);
Display.DesenhaRetangulo(64,1, 64,63,1);
Display.DesenhaRetangulo(1,48, 127,63,1);
while(1)
{
if (Flag1s==1)//Rotina executada a cada 1 segundo
{
MostraDataHora();
Flag1s=0;
FiltroInclinometroX+= (double)ADC.LeADC(1);
FiltroInclinometroY+= (double)ADC.LeADC(2);
FiltroInclinometroX*=0.0008056640625;//neste ponto acontece a exeçao e trava o programa
FiltroInclinometroY*=0.0008056640625;
FiltroInclinometroX-=1.65;
FiltroInclinometroY-=1.65;
FiltroInclinometroX/=0.462;
FiltroInclinometroY/=0.462;
FiltroInclinometroY=asin(FiltroInclinometroY);
FiltroInclinometroX=asin(FiltroInclinometroX);
FiltroInclinometroX*=57.295779513082320876798154814105;
FiltroInclinometroY*=57.295779513082320876798154814105;
FiltroInclinometroX+=1; //corrreção de hardware
FiltroInclinometroY-=3;
inttostr(teste,(int)FiltroInclinometroX,0x20);
Display.GDispPixStrAt(15,18,teste, 8,1);
inttostr(teste,(int)FiltroInclinometroY,0x20);
Display.GDispPixStrAt(80,18,teste, 8,1);
}
}
}

