На плате встроенный внутрисхемный отладчик, программирую я через MPLAB 8.90 компилятор C30. Писал прогу всё отладил в debug моде, начал переводить её в release режим чтобы МК запускался уже самостоятельно а не из под отладчика и тут функция опроса кнопки перестала работать. Я что только не делал, менял переменные, прописывал их в volatile, static extern и прочее. Смотрел что с моим портом происходит. В режиме отладки всё прекрасно видно как во время прерывания по брейкпоинту в порте RB8 выставляется единичка и всё работает правильно, но как только программирую в release режиме - всё, как будто порт перестаёт видеть высокий сигнал на RB8. Я смотрел осцилографом всё в порядке, напряжение есть на пине при нажатие кнопки, ничего на плате не отвалилось. К этому пину в dspic33FJ128MC706A привязано всего 2 модуля - UART и АЦП, АЦП я ещё при отладке отсоединил от этого пина, так чтобы при отладке всё работало, а насчёт UART не уверен, но проглядев ref.manual по UART я понял ну что там нечему мешать работе регистра PORTB, потому что я его и програмного отключил тоже, хотя он по умолчанию выключен. Кидаю часть своего кода, может кто скажет где у меня ошибка или нелепость какая-та, которую я просто из-за замыленности мозга уже не могу найти.
Код
...
#define BTN1 PORTBbits.RB8
#define BTN2 PORTBbits.RB14
#define BUTTON_FILTER 200
...
/*Variables*/
...
int buttonPressed;
int button2Pressed;
int buttonCounter;
int button2Counter;
...
/*----------------------------------------------------------------------------*/
//Begin
int main (void)
{
...
initPeripherals();
...
buttonPressed = 0;
button2Pressed = 0;
buttonCounter = 0;
button2Counter = 0;
...
/************************************ Infinite Loop *********************************/
while(1) //Main Infinitive loop
{
if(BTN1) //button 1 is pressed
{
//keep counting if button pressed and debounce value not reached
if(++buttonCounter > BUTTON_FILTER)
{
buttonCounter = BUTTON_FILTER+1; //limit the counter to avoid overflows
if( buttonPressed == 0) //button pressed and debounced
{
buttonPressed = 1; //set button presseed flag
}
}
}
else //button is not pressed
{
buttonCounter = 0; //clear counter and flag
buttonPressed = 0;
}
...
}
...
}
void initPeripherals(void)
{
//Настройка портов ADC модуля как цифровые (=1 - цифровые; =0 - аналоговые) и регистра TRISB,
//чтобы работали кнопки на плате
AD1PCFGLbits.PCFG8 = 1;
Nop();
AD1PCFGLbits.PCFG14 = 1;
Nop();
TRISBbits.TRISB8 = 1;
Nop();
TRISBbits.TRISB14 = 1;
Nop();
...
}
#define BTN1 PORTBbits.RB8
#define BTN2 PORTBbits.RB14
#define BUTTON_FILTER 200
...
/*Variables*/
...
int buttonPressed;
int button2Pressed;
int buttonCounter;
int button2Counter;
...
/*----------------------------------------------------------------------------*/
//Begin
int main (void)
{
...
initPeripherals();
...
buttonPressed = 0;
button2Pressed = 0;
buttonCounter = 0;
button2Counter = 0;
...
/************************************ Infinite Loop *********************************/
while(1) //Main Infinitive loop
{
if(BTN1) //button 1 is pressed
{
//keep counting if button pressed and debounce value not reached
if(++buttonCounter > BUTTON_FILTER)
{
buttonCounter = BUTTON_FILTER+1; //limit the counter to avoid overflows
if( buttonPressed == 0) //button pressed and debounced
{
buttonPressed = 1; //set button presseed flag
}
}
}
else //button is not pressed
{
buttonCounter = 0; //clear counter and flag
buttonPressed = 0;
}
...
}
...
}
void initPeripherals(void)
{
//Настройка портов ADC модуля как цифровые (=1 - цифровые; =0 - аналоговые) и регистра TRISB,
//чтобы работали кнопки на плате
AD1PCFGLbits.PCFG8 = 1;
Nop();
AD1PCFGLbits.PCFG14 = 1;
Nop();
TRISBbits.TRISB8 = 1;
Nop();
TRISBbits.TRISB14 = 1;
Nop();
...
}