ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
931931
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 }