mrVladimir (06.07.2019 23:14, просмотров: 6673)
Как определить причину зависания программы на LPC2214 (NXP)? После освоения мигания светодиода решил замахнуться на что-то более существенное. Устройство управляет технологическими командами (такими как включение/выключение шпинделя, эмульсии, смены инструмента) на токарном станке. Программа написана с помощью IAR'а , залита в кристалл с помощью Flash Magic'а. Проблема в том, что на столе все работает без нареканий (все ответы имитирую с помощью различных кнопок и переключателей) а вот непосредственно на станке после нескольких удачных смен инструмента (команда "Т") происходит зависание процессора. Сперва думал, что какое-то из прерываний не учел (не правильно что-то прописал), и поэтому отключил __disable_interrupt(). На прерывании по таймеру была реализована задержка Sleep (из примера IAR). Задержку сделал с помощью (for). Попробовал запустить на станке - вроде зависания прекратились. Но через какое- то время опять зависло. Отладчика нет - заливаю по UART. Подскажите кто-нибудь примерный план действий в моем случае.
#include <intrinsics.h>
#include <NXP/iolpc2214.h>
#include "lpc2214.h"
void algT();
void TimerBeat(void);
void Sleep(int milliseconds);
unsigned int Stop_Spind = 0;
static volatile int ms_ctr = 0;
static volatile int ms_ctr1 = 0;
static volatile int ms_ctr2 = 0;
// Timer interrupt callback
void TimerBeat(void)
{
// Called at 1000 Hz rate.
ms_ctr++; // Sleep counter.
ms_ctr1++;// для мигания М3/М4
if (ms_ctr1 == 100){ //каждые 300 прерываний
IO3SET = 8;
//IO3SET = 0x80000;//устанавливаем P3.3 - это лампа M3/M4
}
if (ms_ctr1 == 200){//Затем через еще каждые 300 прерываний
if (Stop_Spind == 0)IO3CLR = 8;//если не было M3/M4, выключаем лампу.
ms_ctr1 = 0; // Обнулением приводим в исходное состояние
}
}
void TimerBeat1(void)
{
ms_ctr2++;
if (ms_ctr2 == 28800){ //
//IO3SET = 0x40000; //
}
if (ms_ctr2 == 57600){//
//IO3CLR = 0x40000;//
ms_ctr2 = 0; //
}
}
void Sleep(int milliseconds)
{
//ms_ctr = 0;
//while (ms_ctr < milliseconds) ;
for (int t1=0; t1<milliseconds; t1++)
{for (int t=0; t<3000; t++);}
}
__irq __arm void IRQ_Handler(void)
{
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; // Get interrupt vector.
interrupt_function = (void(*)())vector;
(*interrupt_function)(); // Call vectored interrupt function.
VICVectAddr = 0; // Clear interrupt in VIC.
}
int main (void)
{
unsigned int In_P2;
// System initialization, this will map the exception vectors.
//LPC2214SystemInit();
// Set up peripheral registers.
LPC2214InitPIO();
// First disable interrupts.
__disable_interrupt();
// Setup interrupt controller.
LPC2214InitVIC();
LPC2214InitTimerInterrupt(TimerBeat);
//LPC2214InitTimerInterrupt1(TimerBeat1);//***my***
// Periodic timer initialization.
LPC2214InitTimer();
//LPC2214InitTimer1();
// Enable interrupts.
__enable_interrupt();
// Start periodic timer.
LPC2214StartTimer();
__disable_interrupt();
// Loop forever.
Sleep(200); //чтобы исключить ложное срабатывание РВК
IO3SET |=0x800004; //Гот. станка&&РВК
for (;;)
{
In_P2 = IO2PIN;
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if ((!(In_P2&0x1200))&&(In_P2&0x100)){ //БСМ & Гот.ЧПУ-минус-БСТ-- begin
IO3CLR = 4; //РВК = "0"
while (IO2PIN & 0x800){ // ожидаем прихода "Строб"
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;} // импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
In_P2 = IO2PIN;
In_P2 &= 0xff;
switch (In_P2){ //выбор команды M
//------------------------------------M38-------------------------------
case 0xc7: while((IO2PIN&0xFF)^0xFF){ //"M38"
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if(!(IO2PIN&0x40000)&&!(IO1PIN&0x200000)) // совпадение M38
{while (!(IO2PIN&0x800)){} // ожидаем снятия "Строб"
IO3SET |= 4; //РВК = "1"
break; }}
break;
//------------------------------------M39-------------------------------
case 0xc6: while((IO2PIN&0xFF)^0xFF){ //"M39"
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if((IO2PIN&0x40000)&&(IO1PIN&0x200000)) // совпадение M39
{while (!(IO2PIN&0x800)){} // ожидаем снятия "Строб"
IO3SET = 4; //РВК = "1"
break; }}
break;
//------------------------------------M40-------------------------------
case 0xbf: while((IO2PIN&0xFF)^0xFF){ //"M40"
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if((IO2PIN&0x40000)&&!(IO1PIN&0x200000)) // совпадение M40
{while (!(IO2PIN&0x800)){} // ожидаем снятия "Строб"
IO3SET = 4; //РВК = "1"
break; }}
break;
//------------------------------------M3--------------------------------
case 0xfc:
while((IO2PIN&0xFF)^0xFF){ //"M3"
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if (!(IO2PIN&0x20000)) // если нет сигнала Стоп Шпинделя
{IO3SET = 0x80; // Вкл.гл.прив.
Stop_Spind = 1;}
if (!(IO2PIN&0x2000000)) //ответ M3
{while (!(IO2PIN&0x800)){} // ожидаем снятия "Строб"
IO3SET = 4; //РВК = "1"
break;
}}
break;
//------------------------------------M4--------------------------------
case 0xfb: if (!(IO2PIN&0x20000)) // если нет сигнала Стоп Шпинделя
{IO3SET = 0x80; // Вкл.гл.прив.
Stop_Spind = 1;}
while((IO2PIN&0xFF)^0xFF){ //"M4"
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if (!(IO2PIN&0x20000)) // если нет сигнала Стоп Шпинделя
{IO3SET = 0x80; // Вкл.гл.прив.
Stop_Spind = 1;}
if (!(IO2PIN&0x2000000)) //ответ M3
{while (!(IO2PIN&0x800)){} // ожидаем снятия "Строб"
IO3SET = 4; //РВК = "1"
break;
}}
break;
//------------------------------------M5--------------------------------
case 0xfa: IO3CLR = 0x80; // Выкл.гл.прив.
Stop_Spind = 0;
while((IO2PIN&0xFF)^0xFF){ //"M5"
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if ((IO2PIN&0x2000000)) //ответ M5
{while (!(IO2PIN&0x800)){} // ожидаем снятия "Строб"
IO3SET = 4; //РВК = "1"
break;
}}
break;
//------------------------------------M8--------------------------------
case 0xf7: IO3SET = 0x10; //"M8"
while ((IO2PIN&0xFF)^0xFF){
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if (!(IO2PIN&0x10000000)) //ответ M8
{while (!(IO2PIN&0x800)){} // ожидаем снятия "Строб"
IO3SET = 4; //РВК = "1"
break;
}}
break;
//------------------------------------M9--------------------------------
case 0xf6: IO3CLR = 0x10; //"M9"
while((IO2PIN&0xFF)^0xFF){
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if ((IO2PIN&0x10000000)) //ответ M9
{while (!(IO2PIN&0x800)){} // ожидаем снятия "Строб"
IO3SET = 4; //РВК = "1"
break;
}}
break;
//------------------------------------M30-------------------------------
case 0xcf: IO3CLR = 0x10; //"M9"
while((IO2PIN&0xFF)^0xFF){
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if ((IO2PIN&0x10000000)) //ответ M9
{while (!(IO2PIN&0x800)){}
IO3SET = 4; //РВК = "1"
break;
}}
break;
}
} //БСМ & Гот.ЧПУ-- end
//-----------------------------------------------------------------------------
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
//-----------------------------------------------------------------------------
if (IO2PIN&0x20000) //если есть сигнал Стоп Шпинделя
IO3CLR = 0x80; else {if ((Stop_Spind == 1)&&(!(IO2PIN&0x1000))) IO3SET = 0x80;}
//-----------------------------------------------------------------------------
if ((IO2PIN&0x100000)||(IO2PIN&0x8000)||(IO2PIN&0x1000)) //если есть сигнал Стоп Подачи или РГ разжата
IO3CLR = 1; else IO3SET = 1; // если РГ зажата, то вкл. подачи
//-----------------------------------------------------------------------------
//-------------------------Смена инструмента-- begin --------------------------
if ((!(In_P2&0x1100))&&(In_P2&0x200)){ //БСМ & Гот.ЧПУ-минус-БСТ-- begin
IO3CLR = 4; //РВК = "0"
IO3CLR = 1; //Стоп подачи, пока идет смена инструмента
while (IO2PIN & 0x800){ // ожидаем прихода "Строб"
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;} // импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
Stop_Spind = 0;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
In_P2 = IO2PIN;
In_P2 &= 0xff;
switch (In_P2){
case 0xfe:IO3SET = 0x800; //1
IO3CLR = 0xff000; //все остальные обнуляем
algT();
break;
case 0xfd:IO3SET = 0x1000; //2
IO3CLR = 0xfe800; //все остальные обнуляем
algT();
break;
case 0xfc:IO3SET = 0x2000; //3
IO3CLR = 0xfd800; //все остальные обнуляем
algT();
break;
case 0xfb:IO3SET = 0x4000; //4
IO3CLR = 0xfb800; //все остальные обнуляем
algT();
break;
case 0xfa:IO3SET = 0x8000; //5
IO3CLR = 0xf7800; //все остальные обнуляем
algT();
break;
case 0xf9:IO3SET = 0x10000; //6
IO3CLR = 0xef800; //все остальные обнуляем
algT();
break;
case 0xf8:IO3SET = 0x20000; //7
IO3CLR = 0xdf800; //все остальные обнуляем
algT();
break;
case 0xf7:IO3SET = 0x40000; //8
IO3CLR = 0xbf800; //все остальные обнуляем
algT();
break;
case 0xf6:IO3SET = 0x80000; //9
IO3CLR = 0x7f800; //все остальные обнуляем
algT();
break;
} // end switch
}
//-------------------------Смена инструмента-- end ----------------------------
}//for(;;)
}//main
void algT(){
while (((IO2PIN&0xFF)^0xFF) && ((IO2PIN&0x10000) || (IO2PIN&0x8000))){
if (!(IO2PIN&0x3000)) IO3SET |=0x200; else IO3CLR |=0x200;// импульсная смазка
if (IO2PIN&0x1000) { //если Гот.ЧПУ пропала, выключаем все "механизмы"
IO3CLR = 0x6f1;
} else {IO3SET = 0x40;} //если Гот.ЧПУ присутствует, включаем смазку шпинд.
if (IO2PIN&0x10000){ //если нет совпадения поз.
IO3CLR = 0x20; //выключаем фиксацию
Sleep(10);
IO3SET = 0x400;} //вкл. поиск
else {
IO3CLR = 0x400; //выключаем поиск
Sleep(10);
IO3SET = 0x20;} //вкл. фиксацию
}
if ((!(IO2PIN&0x10000)) && (!(IO2PIN&0x8000))){
IO3CLR = 0x400; //выключаем поиск
Sleep(10);
IO3SET = 0x20;
Sleep(40);
IO3SET = 4;} //РВК = "1"
IO3CLR = 0xffc20; //выключаем все выходы D1-D9
}