Проблема вот в чём. Контроллер должен вычислять и задавать температуру, с использованием PID алгоритма.
Обмен между компом, контроллером и платой я наладил. Всё работает адекватно.
А в формулах для вычисления коэффициентов, используются переменные типа float. И вот тут начинаются чудеса.
До этого моделировал работу в Кейловском симуляторе, там всё было корректно.
А как только я начинаю делать расчёты с этими переменными в камне, у меня либо камень после прошивки повисает в стартапе в строчке DAbt_Addr/
Либо всё таки прошивается, но после вычисления получается ответ 0. Причём, если залезть в камень ULINKOм то даже если переменные типа флоат, он вполне адекватно показывает, что в них прописано, но стоит запустить программу в штатном режиме, снова 0.
Перешел от float к int, проблема в основном ушла, но мистика все равно осталась. Доходит до того, что просто добавление переменной, может после прошивки посылать контроллер в DAbt_Addr. Тоесть тупо добавил, и нигде не использую. Какие то танцы с бубном

Я до этого не имел дело с АРМами. Возможно я не правильно инициирую камень в самом начале? Может у меня смешиваются области данных и области переменных? В стартапе надо что то прописать?
Или это проблемы в кейле самом, он у меня с лекарством. Компиллер RealViev Сам кеил Enterprise-ARM.
У меня состояние уже близко к панике, вторую неделю ересь какая то творится, все сроки уже горят. Поискал на форуме, не нашел никого с такой проблемой. Прикладываю свой startup и кусочек кода из мэин, ту часть где идёт начальная инициализация.
Код
#include <LPC214x.h>
#include <math.h>
#include <float.h>
#include <fenv.h>
void initFiq (void);
void initLPC (void);
void init_PLL(void);
int main (void)
{
init_PLL();
initLPC();
initFiq();
////////////////////////////////////////////////////////////////////////////////////////////////////
__irq void FIQ_Handler(void) ////prerivanie
{
if (state1 ==0x7f)
{
flajok =flajok+1;
}
EXTINT = 0x00000002; //Clear the peripheral interrupt flag
}
//////////////////////////// INTERRUPT //////////////////////////////////////////////
void initFiq(void)
{
PINSEL0 = 0x20000000; //Enable the EXTINT1 interruptand p0.16, p0.17-input
VICIntSelect = 0x00008000; //Enable a Vic Channel as FIQ
VICIntEnable = 0x00008000;
}
////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////// INICIALIZATION //////////////////////////////////////////////
void initLPC(void)
{
IODIR0 |= 0x00000000; //DATA
IODIR1 |= 0x007F0000; //ADDR
IOSET1 |= 0x00630000; //ADDR =3, WR =1; RD=1; 0x00630000
//IOSET1 |= 0x00230000; //ADDR =3, WR =1; RD=0;
}
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// PLL ///////////////////////////////////////////////
void init_PLL(void)
{
PLL0CFG = 0x00000024; // Set multiplier and divider of PLL to give 60.00 Mhz
PLL0CON = 0x00000001; // Enable the PLL
PLL0FEED = 0x000000AA; // Update PLL registers with feed sequence
PLL0FEED = 0x00000055;
while (!(PLL0STAT & 0x00000400)) // test Lock bit
{
;
}
PLL0CON = 0x00000003; // Connect the PLL
PLL0FEED = 0x000000AA; //Update PLL registers
PLL0FEED = 0x00000055;
VPBDIV = 0x00000001; //Set the VLSI peripheral bus to 30.000Mhz
}
/////////////////////////////////////////////////////////////////////////////////////
#include <math.h>
#include <float.h>
#include <fenv.h>
void initFiq (void);
void initLPC (void);
void init_PLL(void);
int main (void)
{
init_PLL();
initLPC();
initFiq();
////////////////////////////////////////////////////////////////////////////////////////////////////
__irq void FIQ_Handler(void) ////prerivanie
{
if (state1 ==0x7f)
{
flajok =flajok+1;
}
EXTINT = 0x00000002; //Clear the peripheral interrupt flag
}
//////////////////////////// INTERRUPT //////////////////////////////////////////////
void initFiq(void)
{
PINSEL0 = 0x20000000; //Enable the EXTINT1 interruptand p0.16, p0.17-input
VICIntSelect = 0x00008000; //Enable a Vic Channel as FIQ
VICIntEnable = 0x00008000;
}
////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////// INICIALIZATION //////////////////////////////////////////////
void initLPC(void)
{
IODIR0 |= 0x00000000; //DATA
IODIR1 |= 0x007F0000; //ADDR
IOSET1 |= 0x00630000; //ADDR =3, WR =1; RD=1; 0x00630000
//IOSET1 |= 0x00230000; //ADDR =3, WR =1; RD=0;
}
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// PLL ///////////////////////////////////////////////
void init_PLL(void)
{
PLL0CFG = 0x00000024; // Set multiplier and divider of PLL to give 60.00 Mhz
PLL0CON = 0x00000001; // Enable the PLL
PLL0FEED = 0x000000AA; // Update PLL registers with feed sequence
PLL0FEED = 0x00000055;
while (!(PLL0STAT & 0x00000400)) // test Lock bit
{
;
}
PLL0CON = 0x00000003; // Connect the PLL
PLL0FEED = 0x000000AA; //Update PLL registers
PLL0FEED = 0x00000055;
VPBDIV = 0x00000001; //Set the VLSI peripheral bus to 30.000Mhz
}
/////////////////////////////////////////////////////////////////////////////////////