Перейти к содержанию
    

Проблема с dspic33FJ128MC706A

Здравствуйте, столкнулся с такой проблемой при программирование микроконтроллера 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Недостаточно информации для ответа.

Главное: непонятно, как Вы узнали о том, что "функция опроса кнопки перестала работать".

 

Попробуйте простейший цикл:

 

while (1)
{
if ( 0 == BUTTON_IN)
{
TEST_PIN_OUT = 0;
}
else
{
TEST_PIN_OUT = 1;
}
}

 

разумеется, предварительно определите и проинициялизируйте ноги BUTTON_IN и TEST_PIN_OUT

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Главное: непонятно, как Вы узнали о том, что "функция опроса кнопки перестала работать"."

Ну из под внутрисхемного отладчика всё работало при запуске программы через MPLAB - я нажимал кнопку, двигатель крутился, я нажимал снова - двигатель переставал крутиться. Перевёл программу в Release режим, и просто такое ощущние создалось что МК перестал воспринимать port B.

Попробывал этот цикл, да всё получается - жму кнопку в debug режиме из под внутрисхемного отладчика, зажигается светодиод на плате, отпускаю тухнет. Всё как и должно быть. - запускаю тот же код в release режиме - ничего не происходит.

Я не знаю какую информацию ещё дать. Все настройки хоть как-нибудь причастные к данной проблеме я привёл в коде в своём посте. Суть проблемы описал - код работает всё нормально в debug режиме в MPLAB, хочу сделать так чтобы МК сам по себе работал, как я понимаю надо просто перевести в MPLAB режим с debug в release и прошить МК под меню Programmer а не под Debugger. Вот и всё.

Я просто надеялся может кто-нибудь программировал уже dsPIC и встречался с подобной проблеммой. Может в UARTе что-нибудь подкрутить надо что я просто из-за неопытности не могу определить, или с АЦП какая-та проблемма в release режиме? Других модулей к этой ноге не привязано и я сомневаюсь что в чём-нибудь другом проблемма.

Изменено пользователем Cursedsmite

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не знаю какую информацию ещё дать. Все настройки хоть как-нибудь причастные к данной проблеме я привёл в коде в своём посте. Суть проблемы описал - код работает всё нормально в debug режиме в MPLAB, хочу сделать так чтобы МК сам по себе работал, как я понимаю надо просто перевести в MPLAB режим с debug в release и прошить МК под меню Programmer а не под Debugger. Вот и всё.

Хм. А программатор после программирования отключать пробовали? если да и все равно не работает, то....

 

проблемы либо в WDT, или в других установках Fuse регистров. или в ногах, которые в ICD подключаются. Без схемы и полного проекта не разобраться. Дайте МПЛАБ проект целиком, причем с релиз режимом включенным. И версию MPLAB укажите.

Схему будем пока считать условно рабочей и попробуем проверить программу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Программатора отдельного нет, схема программатора располагается прямо на плате Digilent. И я не могу отключить USB шнур , поскольку МК питается от него. Только мотор питается от отдельного питания. Но я подключал плату и к отдельному питанию не через USB провод, а через другие разъмы на плате - и всё равно МК на кнопку не реагировал. Я удалил кусок кода который запускает мотор от нажатия кнопки и оставил чтобы он сам по себе запускался - всё работает. Причём к port B привязаны 4 канала АЦП которые я используя для оцифровки сигнала с датчика тока. И они прекарсно работают в соответствие с логикой программы.

WDT я не использую, может проблема в FUSE но я вот в лоб не вижу где там может быть не правильно. Прикрепил к посту проект и схемы платы приложил. Только скажу что я там перелопатил некоторые моменты с создания моего поста, так что я вернул старые куски кода и разкоментил то что я решил оставить с того момента, но всё равно в любом случае прога работает как надо в debug режиме, в release кнопка не работает.

Версия MPLAB которую я использовал 8.89. C30 - 3.30b

DsPic23.rar

Изменено пользователем Cursedsmite

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очень удивительно что все остальное работает, а эта нога нет.

 

 

1. Поставьте галочку Configure->ConfigurationBits->"Configuration Bits set in code". Так как сейчас непонятно что конфигурируется.

Но это как раз проверить легко при наличии железа: прочитайте hex-код обратно из программатора и посмотрите эти биты конфигурации. Биты защиты, естественно, должны быть выключены.

 

2. У вас включена оптимизация, причем очень высокого уровня. Попробуйте то же самое без оптимизации.

 

3. Странно, что вы делаете инициализацию "#define TEST_PIN_OUT PORTDbits.RD4" а не "LAT" регистра и у Вас все работает при отладке.

 

Попробуйте все-таки оставить в коде только цикл из кнопки-светодиода И БОЛЬШЕ НИЧЕГО. И прерывания выключите.

 

Еще одна непонятность- встроенный программатор, но как-то хитро оно должно быть, чтобы часть кода работала а часть нет....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чудес не бывает :)

 

1. какой-то служебный регистр не устанавливается или модифицируется во время выполнения, вариантов немного, там всего-то, отвечающих за ножку RB8... Я бы в первую очередь проконтролировал AD1PCFG и AD2PCFG.

2. что-то еще, например что-то из ерраты.

3. Проблема в железе на плате (но если Вы прямо на НОГЕ RB8 осциллографом видите изменение лог уровней 0-1 при нажатии-отпускании кнопки, то к железу претензий нет. Кстати, судя по схеме, там кнопка на плате так включена, что при включенной внутренней подтяжке могут быть проблемы, в ноль она тянуть будет плохо).

 

Идеал- если Вы можете из программы передать во время нормальной работы (в RS232 или показать светодиодами) интересующие байтики (в служебных регистрах ADxPCFG, TRISB, PORTB, CNxPUE) и убедиться что они в нужном состоянии.

 

Upd: извиняюсь, кажется подтяжку на эту ногу включить невозможно, так что версия про подтяжку отпадает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Я бы в первую очередь проконтролировал AD1PCFG и AD2PCFG."

Всё, проблема решилась. Я раньше не прописывал вот эти 2 строчки AD2PCFGLbits.PCFG8 = 1; AD2PCFGLbits.PCFG14 = 1. Видимо каким-то образом в debug режиме второй АЦП не мешал работать ножкам на вход, но в release режиме из-за того что для второго модуля АЦП ножки были сконфигурированы как аналоговые, а не цифровые, он не давал им нормально работать на вход. Спасибо за помощь, у меня вообще из головы вылетело что есть ещё второй АЦП модуль, как всегда у меня и бывает проблема крылась просто в невнимательности...

Изменено пользователем Cursedsmite

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё, проблема решилась.

Ну и замечательно :)

 

А про невнимательность- это у вас чепуха по сравнению с некоторыми. Вон, уже ракеты взрываются при старте из-за вверх ногами прикрученных датчиков...

Вот это да, "невнимательность" :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...