Я новичок в разработке UC и дурачусь с серией PIC уже около 6 месяцев. Недавно я начал работать с PIC32 и компилятором Microchip XC32 C++. Я не знаю, есть ли у меня фундаментальное непонимание того, как WDT работает в серии PIC, или есть какое-то предостережение, о котором я не знаю, однако у меня есть код, который, я думаю, должен зажечь светодиод на RA0, а затем включить он выключен, и через 512 мс WDT должен сбросить UC, и процесс должен начаться заново. На самом деле происходит то, что светодиод загорается на мгновение, затем гаснет и больше никогда не включается. Я не знаю, означает ли это, что WDT неправильно настроен или что. Вот мой код:
#include <xc.h>
#define LED _LATA0
/*
*
*/
int main(int argc, char** argv) {
WDTCONbits.WDTPS = 0b1001; //512ms postscaler
WDTCONbits.WDTCLR = 1; // feed the watchdog
WDTCONbits.ON = 1; // enable the watchdog
TRISAbits.TRISA0 = 0; //output on RA0
ANSELAbits.ANSA0 = 0; // digital only
LED = 1; //led on
int i = 100000;
while(i--);
LED = 0; // led off
while(1); // hang up and let WDT reset us
return 0;
}
Какую часть успешного использования WDT я упускаю?
Покопавшись еще немного, я думаю, что нашел ответ. Согласно этому документу , WDTCONbits.WDTPS
регистр — это просто теневая копия битов постскейлера. Чтобы установить постскейлер, мне пришлось добавить в свой основной файл #pragma config WDTPS = PS512
. Мой успешный код теперь гласит:
#define LED _LATA0
#pragma config WDTPS = PS512 // this is the magic line
/*
*
*/
int main(int argc, char** argv) {
//WDTCONbits.WDTPS = 0b1001; //512ms postscaler
WDTCONbits.WDTCLR = 1; // feed the watchdog
WDTCONbits.ON = 1; // enable the watchdog
TRISAbits.TRISA0 = 0; //output on RA0
ANSELAbits.ANSA0 = 0; // digital only
LED = 1; //led on
int i = 100000;
while(i--);
LED = 0; // led off
while(1); // hang up and let WDT reset us
return 0;
}