Зачем шагать через смену тактовой частоты? Я не требую невозможного. Чтобы сохранить целостность канала отладки в момент переключения тактовой частоты, нужно делать асинхронный интерфейс. А это сложно и дорого. Пусть работает как есть. Ещё замечал проблему - если чип работает на очень низкой частоте, скажем, на 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 вместе включил, его можно вызывать и из ловушек, если есть другой способ вывода информации об отказе, кроме мигания.