|
|
  |
Проблема с dspic33FJ128MC706A, не работает в Release режиме опрос PORTB |
|
|
|
Aug 19 2013, 14:28
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 20 2013, 07:25
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Недостаточно информации для ответа. Главное: непонятно, как Вы узнали о том, что "функция опроса кнопки перестала работать". Попробуйте простейший цикл: Код while (1) { if ( 0 == BUTTON_IN) { TEST_PIN_OUT = 0; } else { TEST_PIN_OUT = 1; } } разумеется, предварительно определите и проинициялизируйте ноги BUTTON_IN и TEST_PIN_OUT
|
|
|
|
|
Aug 21 2013, 07:41
|
Участник

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

|
"Главное: непонятно, как Вы узнали о том, что "функция опроса кнопки перестала работать"." Ну из под внутрисхемного отладчика всё работало при запуске программы через MPLAB - я нажимал кнопку, двигатель крутился, я нажимал снова - двигатель переставал крутиться. Перевёл программу в Release режим, и просто такое ощущние создалось что МК перестал воспринимать port B. Попробывал этот цикл, да всё получается - жму кнопку в debug режиме из под внутрисхемного отладчика, зажигается светодиод на плате, отпускаю тухнет. Всё как и должно быть. - запускаю тот же код в release режиме - ничего не происходит. Я не знаю какую информацию ещё дать. Все настройки хоть как-нибудь причастные к данной проблеме я привёл в коде в своём посте. Суть проблемы описал - код работает всё нормально в debug режиме в MPLAB, хочу сделать так чтобы МК сам по себе работал, как я понимаю надо просто перевести в MPLAB режим с debug в release и прошить МК под меню Programmer а не под Debugger. Вот и всё. Я просто надеялся может кто-нибудь программировал уже dsPIC и встречался с подобной проблеммой. Может в UARTе что-нибудь подкрутить надо что я просто из-за неопытности не могу определить, или с АЦП какая-та проблемма в release режиме? Других модулей к этой ноге не привязано и я сомневаюсь что в чём-нибудь другом проблемма.
Сообщение отредактировал Cursedsmite - Aug 21 2013, 07:52
|
|
|
|
|
Aug 21 2013, 11:42
|
Участник

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

|
Программатора отдельного нет, схема программатора располагается прямо на плате Digilent. И я не могу отключить USB шнур , поскольку МК питается от него. Только мотор питается от отдельного питания. Но я подключал плату и к отдельному питанию не через USB провод, а через другие разъмы на плате - и всё равно МК на кнопку не реагировал. Я удалил кусок кода который запускает мотор от нажатия кнопки и оставил чтобы он сам по себе запускался - всё работает. Причём к port B привязаны 4 канала АЦП которые я используя для оцифровки сигнала с датчика тока. И они прекарсно работают в соответствие с логикой программы. WDT я не использую, может проблема в FUSE но я вот в лоб не вижу где там может быть не правильно. Прикрепил к посту проект и схемы платы приложил. Только скажу что я там перелопатил некоторые моменты с создания моего поста, так что я вернул старые куски кода и разкоментил то что я решил оставить с того момента, но всё равно в любом случае прога работает как надо в debug режиме, в release кнопка не работает. Версия MPLAB которую я использовал 8.89. C30 - 3.30b
Сообщение отредактировал Cursedsmite - Aug 21 2013, 14:06
|
|
|
|
|
Aug 23 2013, 08:44
|
Участник

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

|
Две ноги не работают, две кнопки, я их переобозначал для одной и той же функции - обе не воспринимает. Самое удивительное, что когда другие ноги (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 - Aug 23 2013, 10:29
|
|
|
|
|
Aug 23 2013, 19:20
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
чудес не бывает  1. какой-то служебный регистр не устанавливается или модифицируется во время выполнения, вариантов немного, там всего-то, отвечающих за ножку RB8... Я бы в первую очередь проконтролировал AD1PCFG и AD2PCFG. 2. что-то еще, например что-то из ерраты. 3. Проблема в железе на плате (но если Вы прямо на НОГЕ RB8 осциллографом видите изменение лог уровней 0-1 при нажатии-отпускании кнопки, то к железу претензий нет. Кстати, судя по схеме, там кнопка на плате так включена, что при включенной внутренней подтяжке могут быть проблемы, в ноль она тянуть будет плохо). Идеал- если Вы можете из программы передать во время нормальной работы (в RS232 или показать светодиодами) интересующие байтики (в служебных регистрах ADxPCFG, TRISB, PORTB, CNxPUE) и убедиться что они в нужном состоянии. Upd: извиняюсь, кажется подтяжку на эту ногу включить невозможно, так что версия про подтяжку отпадает.
|
|
|
|
|
Aug 26 2013, 09:33
|
Участник

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

|
"Я бы в первую очередь проконтролировал AD1PCFG и AD2PCFG." Всё, проблема решилась. Я раньше не прописывал вот эти 2 строчки AD2PCFGLbits.PCFG8 = 1; AD2PCFGLbits.PCFG14 = 1. Видимо каким-то образом в debug режиме второй АЦП не мешал работать ножкам на вход, но в release режиме из-за того что для второго модуля АЦП ножки были сконфигурированы как аналоговые, а не цифровые, он не давал им нормально работать на вход. Спасибо за помощь, у меня вообще из головы вылетело что есть ещё второй АЦП модуль, как всегда у меня и бывает проблема крылась просто в невнимательности...
Сообщение отредактировал Cursedsmite - Aug 26 2013, 09:35
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|