Cursedsmite 0 19 августа, 2013 Опубликовано 19 августа, 2013 (изменено) · Жалоба Здравствуйте, столкнулся с такой проблемой при программирование микроконтроллера 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(); ... } Изменено 19 августа, 2013 пользователем Cursedsmite Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 20 августа, 2013 Опубликовано 20 августа, 2013 · Жалоба Недостаточно информации для ответа. Главное: непонятно, как Вы узнали о том, что "функция опроса кнопки перестала работать". Попробуйте простейший цикл: while (1) { if ( 0 == BUTTON_IN) { TEST_PIN_OUT = 0; } else { TEST_PIN_OUT = 1; } } разумеется, предварительно определите и проинициялизируйте ноги BUTTON_IN и TEST_PIN_OUT Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cursedsmite 0 21 августа, 2013 Опубликовано 21 августа, 2013 (изменено) · Жалоба "Главное: непонятно, как Вы узнали о том, что "функция опроса кнопки перестала работать"." Ну из под внутрисхемного отладчика всё работало при запуске программы через MPLAB - я нажимал кнопку, двигатель крутился, я нажимал снова - двигатель переставал крутиться. Перевёл программу в Release режим, и просто такое ощущние создалось что МК перестал воспринимать port B. Попробывал этот цикл, да всё получается - жму кнопку в debug режиме из под внутрисхемного отладчика, зажигается светодиод на плате, отпускаю тухнет. Всё как и должно быть. - запускаю тот же код в release режиме - ничего не происходит. Я не знаю какую информацию ещё дать. Все настройки хоть как-нибудь причастные к данной проблеме я привёл в коде в своём посте. Суть проблемы описал - код работает всё нормально в debug режиме в MPLAB, хочу сделать так чтобы МК сам по себе работал, как я понимаю надо просто перевести в MPLAB режим с debug в release и прошить МК под меню Programmer а не под Debugger. Вот и всё. Я просто надеялся может кто-нибудь программировал уже dsPIC и встречался с подобной проблеммой. Может в UARTе что-нибудь подкрутить надо что я просто из-за неопытности не могу определить, или с АЦП какая-та проблемма в release режиме? Других модулей к этой ноге не привязано и я сомневаюсь что в чём-нибудь другом проблемма. Изменено 21 августа, 2013 пользователем Cursedsmite Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 21 августа, 2013 Опубликовано 21 августа, 2013 · Жалоба Я не знаю какую информацию ещё дать. Все настройки хоть как-нибудь причастные к данной проблеме я привёл в коде в своём посте. Суть проблемы описал - код работает всё нормально в debug режиме в MPLAB, хочу сделать так чтобы МК сам по себе работал, как я понимаю надо просто перевести в MPLAB режим с debug в release и прошить МК под меню Programmer а не под Debugger. Вот и всё. Хм. А программатор после программирования отключать пробовали? если да и все равно не работает, то.... проблемы либо в WDT, или в других установках Fuse регистров. или в ногах, которые в ICD подключаются. Без схемы и полного проекта не разобраться. Дайте МПЛАБ проект целиком, причем с релиз режимом включенным. И версию MPLAB укажите. Схему будем пока считать условно рабочей и попробуем проверить программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cursedsmite 0 21 августа, 2013 Опубликовано 21 августа, 2013 (изменено) · Жалоба Программатора отдельного нет, схема программатора располагается прямо на плате Digilent. И я не могу отключить USB шнур , поскольку МК питается от него. Только мотор питается от отдельного питания. Но я подключал плату и к отдельному питанию не через USB провод, а через другие разъмы на плате - и всё равно МК на кнопку не реагировал. Я удалил кусок кода который запускает мотор от нажатия кнопки и оставил чтобы он сам по себе запускался - всё работает. Причём к port B привязаны 4 канала АЦП которые я используя для оцифровки сигнала с датчика тока. И они прекарсно работают в соответствие с логикой программы. WDT я не использую, может проблема в FUSE но я вот в лоб не вижу где там может быть не правильно. Прикрепил к посту проект и схемы платы приложил. Только скажу что я там перелопатил некоторые моменты с создания моего поста, так что я вернул старые куски кода и разкоментил то что я решил оставить с того момента, но всё равно в любом случае прога работает как надо в debug режиме, в release кнопка не работает. Версия MPLAB которую я использовал 8.89. C30 - 3.30b DsPic23.rar Изменено 21 августа, 2013 пользователем Cursedsmite Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 21 августа, 2013 Опубликовано 21 августа, 2013 · Жалоба Очень удивительно что все остальное работает, а эта нога нет. 1. Поставьте галочку Configure->ConfigurationBits->"Configuration Bits set in code". Так как сейчас непонятно что конфигурируется. Но это как раз проверить легко при наличии железа: прочитайте hex-код обратно из программатора и посмотрите эти биты конфигурации. Биты защиты, естественно, должны быть выключены. 2. У вас включена оптимизация, причем очень высокого уровня. Попробуйте то же самое без оптимизации. 3. Странно, что вы делаете инициализацию "#define TEST_PIN_OUT PORTDbits.RD4" а не "LAT" регистра и у Вас все работает при отладке. Попробуйте все-таки оставить в коде только цикл из кнопки-светодиода И БОЛЬШЕ НИЧЕГО. И прерывания выключите. Еще одна непонятность- встроенный программатор, но как-то хитро оно должно быть, чтобы часть кода работала а часть нет.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cursedsmite 0 23 августа, 2013 Опубликовано 23 августа, 2013 (изменено) · Жалоба Две ноги не работают, две кнопки, я их переобозначал для одной и той же функции - обе не воспринимает. Самое удивительное, что когда другие ноги (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 - так что вряд ли триггер шмитта не правильно работает. Изменено 23 августа, 2013 пользователем Cursedsmite Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 23 августа, 2013 Опубликовано 23 августа, 2013 · Жалоба чудес не бывает :) 1. какой-то служебный регистр не устанавливается или модифицируется во время выполнения, вариантов немного, там всего-то, отвечающих за ножку RB8... Я бы в первую очередь проконтролировал AD1PCFG и AD2PCFG. 2. что-то еще, например что-то из ерраты. 3. Проблема в железе на плате (но если Вы прямо на НОГЕ RB8 осциллографом видите изменение лог уровней 0-1 при нажатии-отпускании кнопки, то к железу претензий нет. Кстати, судя по схеме, там кнопка на плате так включена, что при включенной внутренней подтяжке могут быть проблемы, в ноль она тянуть будет плохо). Идеал- если Вы можете из программы передать во время нормальной работы (в RS232 или показать светодиодами) интересующие байтики (в служебных регистрах ADxPCFG, TRISB, PORTB, CNxPUE) и убедиться что они в нужном состоянии. Upd: извиняюсь, кажется подтяжку на эту ногу включить невозможно, так что версия про подтяжку отпадает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cursedsmite 0 26 августа, 2013 Опубликовано 26 августа, 2013 (изменено) · Жалоба "Я бы в первую очередь проконтролировал AD1PCFG и AD2PCFG." Всё, проблема решилась. Я раньше не прописывал вот эти 2 строчки AD2PCFGLbits.PCFG8 = 1; AD2PCFGLbits.PCFG14 = 1. Видимо каким-то образом в debug режиме второй АЦП не мешал работать ножкам на вход, но в release режиме из-за того что для второго модуля АЦП ножки были сконфигурированы как аналоговые, а не цифровые, он не давал им нормально работать на вход. Спасибо за помощь, у меня вообще из головы вылетело что есть ещё второй АЦП модуль, как всегда у меня и бывает проблема крылась просто в невнимательности... Изменено 26 августа, 2013 пользователем Cursedsmite Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба Всё, проблема решилась. Ну и замечательно :) А про невнимательность- это у вас чепуха по сравнению с некоторыми. Вон, уже ракеты взрываются при старте из-за вверх ногами прикрученных датчиков... Вот это да, "невнимательность" :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться