реклама на сайте
подробности

 
 
> Проблема с dspic33FJ128MC706A, не работает в Release режиме опрос PORTB
Cursedsmite
сообщение Aug 19 2013, 14:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 21-09-11
Пользователь №: 67 320



Здравствуйте, столкнулся с такой проблемой при программирование микроконтроллера dspic33FJ128MC706A на вот этой плате Digilent Cerebot MC7 https://www.digilentinc.com/Products/Detail...rod=CEREBOT-MC7.
На плате встроенный внутрисхемный отладчик, программирую я через 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();
...
}


Сообщение отредактировал Cursedsmite - Aug 19 2013, 14:49
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Cursedsmite
сообщение Aug 23 2013, 08:44
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 21-09-11
Пользователь №: 67 320



Две ноги не работают, две кнопки, я их переобозначал для одной и той же функции - обе не воспринимает. Самое удивительное, что когда другие ноги (RB0,RB1,RB2,RB3) сконфигурированы на вход для использования с АЦП (регистр AD1PCFGL за это отвечает) - они прекрасно оцифровывают сигнал с датчика тока.

1. Я случайно как то снял, даже не заметил, вообще я в коде прописывал настройки. Но нет - не помогло. Насчёт прочитать hex-код, я в жизни этого никогда не делал, сейчас попробывал, понял что ничего там не понимаю sad.gif

2. Написал новый проект чисто под кнопки чтобы просто смотреть реагирует или нет МК на кнопку - и выключил оптимизацию. Не помогло, в release режиме всё равно не считывает высокий логический уровень с кнопки.

3. Я до сих пор не понял сокровенного смысла между записью в LAT регистр и PORT регистр когда он настроен как выход, может я просто схемотехнику не до конца понимаю. В самом мануале написано что при порте настроенном на выход, при записи в порт или в Лат происходит одно и тоже. Но я переопределил TEST_PIN_OUT LATDbits.LATD4, и всё равно ничего не имзенилось, ни в debug ни в release режиме.

Да мне кажется часть кода работает, просто в этом моменте if ( 0 == BUTTON_IN) что-то происходит из-за чего МК не видит высокий логический уровень.

Ещё сделал эксперимент, решил в release режиме сделать ту ножку (RB8) к которой привязана кнопка - сконфигурировать на выход и просто поддергать ей вверх и вниз. В release режиме эта ножка на выход прекрасно работает, я видел чёткий меандр, а другая ножка (RB14) которая работала на вход , так и не продолжала читать кнопку. Я думал может косяк с тем что маленькое напряжение на входе, но нет - 3.3 питание, а на вход 3.28 - так что вряд ли триггер шмитта не правильно работает.

Сообщение отредактировал Cursedsmite - Aug 23 2013, 10:29
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 08:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016