ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
885597 Топик полностью
Nikolay_Po (29.11.2018 23:01 - 23:03, просмотров: 315) ответил m16_home на Спасибо
Зачем шагать через смену тактовой частоты? Я не требую невозможного. Чтобы сохранить целостность канала отладки в момент переключения тактовой частоты, нужно делать асинхронный интерфейс. А это сложно и дорого. Пусть работает как есть. Ещё замечал проблему - если чип работает на очень низкой частоте, скажем, на 32кГц, отладка становится такой же, очень медленной. Поначалу думал, что вообще не работает. Потом дождался. Поотключал лишние переменные в просмотре - осталость медленно, но терпимо. После ICSP(D) Microchipa (в смысле, имея ввиду недостатки), мои лучшие отладчики - светодиод и UART. Встроенный отладчик помогает в случаях фатальных сбоев, типа вылета указателя или в условиях, когда UARTа нет под рукой. Рекомендую обязательно прописать заглушки для ловушек, типа такого: #include <xc.h> #include "main.h" // Must be included before of libpic30.h #include <libpic30.h> //For delays void ErrorHandler(Errors_t Err) { //Error handler //The safety procedures and error indication may be inserted here #ifdef __DEBUG while(1); #endif asm volatile ("RESET"); } void __attribute__((interrupt(no_auto_psv)))_OscillatorFail(void) { while (1) { //Blink 8 times per second LEDon(); __delay_ms(63); LEDoff(); __delay_ms(63); } } void __attribute__((interrupt(no_auto_psv)))_AddressError(void) { while (1) { //Blink 4 iimes per second LEDon(); __delay_ms(125); LEDoff(); __delay_ms(125); } } void __attribute__((interrupt(no_auto_psv)))_StackError(void) { while (1) { //Blink 2 times per second LEDon(); __delay_ms(250); LEDoff(); __delay_ms(250); } } void __attribute__((interrupt(no_auto_psv)))_MathError(void) { while (1) { //Blink 1 time per second LEDon(); __delay_ms(500); LEDoff(); __delay_ms(500); } } void __attribute__((interrupt, no_auto_psv)) _DMACError(void) { static unsigned int DMA_error_location; // Peripheral Write Collision Error Location if (DMACS0 & 0x0100) { DMA_error_location = DMA0STA; } // DMA RAM Write Collision Error Location if (DMACS0 & 0x0002) { DMA_error_location = DMA1STA; } DMACS0 = 0; //Clear Write Collision Flag INTCON1bits.DMACERR = 0; //Clear Trap Flag } Чем хороши трэпы - так это тем, что у них наивысший приоритет и их не перебьют другие источники прерываний. Можно спокойно помигать светодиодом (после обеспечения безопасности аппаратной части). ErrorHandler туда же, в traps.c вместе включил, его можно вызывать и из ловушек, если есть другой способ вывода информации об отказе, кроме мигания.