MPLAB X IDE
- Сообщения: 22
- Зарегистрирован: Чт июл 28, 2022 20:33:37
- Реклама
Да качал я эту по ссылке не становится она ничерта. Пишет,что не для той системы винды.
Последний раз редактировалось Alex_ka Сб дек 10, 2022 07:13:39, всего редактировалось 1 раз.
А внимательнее поискать на сайте Микрочипа не вышло?
https://www.microchip.com/en-us/tools-r ... -ecosystem
В архиве, надеюсь, найдете то что вам нужно...
Если в архиве нет, то этого и не существовало никогда...
Добавлено after 9 minutes 27 seconds:
[uquote="Alex_ka",url="/forum/viewtopic.php?p=4334067#p4334067"]Может у кого на облаке есть рабочая MLAB X IDE любой версии под WIN7x32 бросьте ссылку.[/uquote]
В догон, небольшой коммент.
MPLABX создана на основе Netbeans и потому, если я не ошибаюсь, не имеет 32-разрядной версии. Зато эту версию имеет старая среда MPLAB 8. Её последняя версия 8.92.
https://www.microchip.com/en-us/tools-r ... -ecosystem
В архиве, надеюсь, найдете то что вам нужно...
Если в архиве нет, то этого и не существовало никогда...
Добавлено after 9 minutes 27 seconds:
[uquote="Alex_ka",url="/forum/viewtopic.php?p=4334067#p4334067"]Может у кого на облаке есть рабочая MLAB X IDE любой версии под WIN7x32 бросьте ссылку.[/uquote]
В догон, небольшой коммент.
MPLABX создана на основе Netbeans и потому, если я не ошибаюсь, не имеет 32-разрядной версии. Зато эту версию имеет старая среда MPLAB 8. Её последняя версия 8.92.
Запустилась версия 4.20. 5.45 ставится не хочет. Может конфликт с другими прогами на ноуте. Спасибо за помощь.
Всех приветствую. Такой у меня вопрос. А точнее, крик души. Вот пишу я код, пишу... Думал, что будет если и не просто, то хотя бы проще со временем. Но эти регистры меня убивают. Мало того, что не всегда понятно, че за что отвечает, и в какой последовательности их включать, так еще их столько... И хорошо еще, если удастся найти более-менее подходящий Code Example, но если нет, любая простая задача превращается в сложную. Есть ли способы как-то облегчить жизнь? Библиотеки или хотя бы база Code Example на 95% случаев...
- Реклама
[uquote="Linuxoid91",url="/forum/viewtopic.php?p=4351176#p4351176"]Библиотеки или хотя бы база Code Example...[/uquote]
Озвучьте тип МК и задачу, которую вы на нем реализуете. Конфигураторы типа MCC имеются. Можете им пользоваться. Но без понимания как решать задачу трудности с регистром тупо перекочуют на трудности с окошками в MCC.
Озвучьте тип МК и задачу, которую вы на нем реализуете. Конфигураторы типа MCC имеются. Можете им пользоваться. Но без понимания как решать задачу трудности с регистром тупо перекочуют на трудности с окошками в MCC.
[uquote="КРАМ",url="/forum/viewtopic.php?p=4351184#p4351184"][uquote="Linuxoid91",url="/forum/viewtopic.php?p=4351176#p4351176"]Библиотеки или хотя бы база Code Example...[/uquote]
Озвучьте тип МК и задачу, которую вы на нем реализуете[/uquote]
PIC24FJ64GA004. Компилятор XC16. Устройство состоит из DF-Player (для звукового сопровождения, связь по UART), дисплея 1602 (связь по I2C через PCF8574) и кнопочной матрицы 3х4.
С помощью некоторых плясок с бубном, какой-то матери и трех вечеров времени
, из UART, в итоге, выплевывается какой-то сигнал. Пока непригодный в пищу, DFPlayer просто плюется в ответ, не издав ни звука...
В общем, как по мне, путь честного дрыгнанья регистрами мне не очень нравится - довольно трудоемок...
Озвучьте тип МК и задачу, которую вы на нем реализуете[/uquote]
PIC24FJ64GA004. Компилятор XC16. Устройство состоит из DF-Player (для звукового сопровождения, связь по UART), дисплея 1602 (связь по I2C через PCF8574) и кнопочной матрицы 3х4.
С помощью некоторых плясок с бубном, какой-то матери и трех вечеров времени
В общем, как по мне, путь честного дрыгнанья регистрами мне не очень нравится - довольно трудоемок...
- Сообщения: 7018
- Зарегистрирован: Сб янв 28, 2006 22:47:24
[uquote="Linuxoid91",url="/forum/viewtopic.php?p=4351277#p4351277"]из UART, в итоге, выплевывается какой-то сигнал. Пока непригодный в пищу, DFPlayer просто плюется в ответ, не издав ни звука...[/uquote]
Тут желательно иметь под рукой PICkit Serial Analyzer и хотя бы простенький лог. анализатор. Чтобы не гадать где косяки возникли.
Тут желательно иметь под рукой PICkit Serial Analyzer и хотя бы простенький лог. анализатор. Чтобы не гадать где косяки возникли.
Астролябия-сама меряет, было бы что мерять!!!
Есть snap и PIC KIT 3. Возможно, с этим можно работать как с чем-то большим, чем программаторы? Я по буржуйски просто не сильно понимать, поэтому даже не знаю всего того, что там есть... Или как-то посмотреть в MPLAB, к чему, вообще, приводит мой код. Помню еще, симулятор там какой-то был. Попробовал, и ничего не понял. Я ожидал от него большего, чем предупреждения в окошке о переполнении стека от кода, который просто мигает светодиодом. Сам МК в железе при этом от того же кода работает корректно. Хотя бы картиночку с МК, где нарисовано, какие ножки и регистры затронуты...
- Сообщения: 7018
- Зарегистрирован: Сб янв 28, 2006 22:47:24
PICkit 3 в принципе может работать логическим анализатором. С родной программой PICkit 3 Programmer. Только возможности программного обеспечения крайне ограничены. Китайские клоны Saleae Logic куда как интереснее в этом плане.
Астролябия-сама меряет, было бы что мерять!!!
Господа, есть вопрос по компилятору XC32 камень PIC32MX460F512L
Собираю я данные по уарт, периодически смотрю, собрался весь пакет или нет, и тут я попадаю на грабли, точнее уже не первый раз.
Есть массив unsigned char uart_rx[512], в него по прерыванию прилетают байты, по последовательности байтов алгоритм начинает понимать что пришла посылка и далее начинает её разбирать, чтобы долго не возится была написана структура. В указатель на структуру копируется адрес начала посылки, и далее по логике остается только получить данные из структуры, вроде бы да, но если указатель на начало посылки начинается с нечётного числа то всё вылетает в аут поскольку в структуре присутствуют short, и при попытке получить данные через указатель на short получаю аналогичную шляпу или полную белеберду, поскольку копирует байт не с той стороны.
Есть какое нибудь решение кроме копирования для исправления ошибки смещения?
Собираю я данные по уарт, периодически смотрю, собрался весь пакет или нет, и тут я попадаю на грабли, точнее уже не первый раз.
Есть массив unsigned char uart_rx[512], в него по прерыванию прилетают байты, по последовательности байтов алгоритм начинает понимать что пришла посылка и далее начинает её разбирать, чтобы долго не возится была написана структура. В указатель на структуру копируется адрес начала посылки, и далее по логике остается только получить данные из структуры, вроде бы да, но если указатель на начало посылки начинается с нечётного числа то всё вылетает в аут поскольку в структуре присутствуют short, и при попытке получить данные через указатель на short получаю аналогичную шляпу или полную белеберду, поскольку копирует байт не с той стороны.
Есть какое нибудь решение кроме копирования для исправления ошибки смещения?
Судя по некоторым понятным фразам, проблема с выравниванием.
Объясните проблему по подробнее, с кусками кода. Мало что понятно из Вашего поста
Объясните проблему по подробнее, с кусками кода. Мало что понятно из Вашего поста
Вечером времени не оказалось

Спойлер
Код: Выделить всё
struct Serv485u8// данные выдаются в формате char
{
unsigned char Addr; //1 1
unsigned char contr; //1 2//0x5A
unsigned short len; //2 4
unsigned char pak[2];//2 6
unsigned char c[1024];//передаваемые данные
};
struct
{
unsigned char pac;
unsigned char read;
}uk;//указатель на точки чтения и записи
unsigned char uart_rx[1024]; // кольцевой буфер приёма
unsigned char adr = 0x50;
void InPac();
bool СheckCRC485(unsigned char *Buff, unsigned short len);
void ReadPac(unsigned char * pcBlock, unsigned short len);
//----------------------------------------------------------
void __ISR(_UART_2_VECTOR, IPL1AUTO) UART2Interrupt(void)//
{
unsigned short i0=10;//блокировка зацикливания
if(IFS1bits.U2EIF)//проверить на наличие ошибок
{
CheckError(); //читаем биты ошибок
}
else
{ // ошибок нет, читаем
do
{
uart_rx[uk.pak] = U2RXREG;
if(uk.pak<sizeof(uart_rx)-1)//индекс сдвинули на байт
uk.pak++;
else uk.pak=0;
i0--;
} while(U2STAbits.URXDA && i0);
}
IFS1bits.U2RXIF=0; //сброс флага прерывания
}
//========================
void main()
{
while(1)
{
if((uk.pac - uk.read) >4)
InPac();
// тут ещё много всяких if'ов которые по флагам от таймеров и иных прерываний выполняют различные задания
}
}
//------------------------------------------------------------------------------
void InPac()
{
struct Serv485u8 *serv;
while(uk.read!=uk.pac)// пока всё не прочитаем
// помню что буфер кольцевой, но этот вопрос буду решать позже, главное с выравниванием разобраться
{
if(uart_rx[uk.read]==adr && uart_rx[uk.read+1]==0x5A)//;
{//собираем пакет
serv=(void*)&uart_rx[uk.read];// можно было и так serv=(struct Serv485u8*)&uart_rx[uk.read]; но ничего особо не меняет
//если uk.read не чётное число, адрес получается тоже нечётный
//если обратиться к структуре(например serv->len) то тут вылетаем в ошибку
if(serv->len < (uk.pac - uk.read))//если пришёл весь пакет
{
if(СheckCRC485(uart_rx[uk.read], serv485->len-2))
{
ReadPac(uart_rx[uk.read], serv485->len-2);//передаём пакет на разборку
uk.read+=serv485->len; // данные считали, двинули указатель чтения
if(uk.read>=sizeof(uart_rx))//если вышли за пределы кольцевого массива, вернутся к началу
uk.read-=sizeof(uart_rx);
}
else uk.read++;
}
else break; // выходим, зайдём в следующий раз, возможно к тому моменту успеет всё собраться
}
else// не нашли нужных байт, двигаем указатель чтения
uk.read++;
}
}// Ну как то так
Естественно. Ошибка вылетает из-за того, что адрес получается невыровненный.alex_ писал(а):если обратиться к структуре(например serv->len) то тут вылетаем в ошибку
Создайте объект своей структуры и делайте побайтную копию из буфера. А потом уже работайте с ней.
Добавлено after 3 minutes 1 second:
Вопрос. Для чего Вам кольцевой буфер, если Вы данные принимаете в виде готовой структуры ? Не проще сразу в неё и принимать ? Или без кольца - приняли в буфер, скопировали в структуру, обработали.
Собственно так уже и сделал, при сходстве начальных 2 байт и по достижению заданного размера копирую в другой буфер и уже указатель на структуру приравниваю к выровненному массиву. Я в начале думал, что ему пофиг откуда начинать считать байты, ан нет, он же блин 32разрядный, по 2 байта за раз засылает
Кольцевой буфер нужен для того чтобы не потерять данные в процессе обработки, к тому же не факт что успеет разобрать пакет до прихода новых данных.
Эх по уму надо на ДМА кольцевой буфер сделать, чтоб вообще без прерываний
Кольцевой буфер нужен для того чтобы не потерять данные в процессе обработки, к тому же не факт что успеет разобрать пакет до прихода новых данных.
Эх по уму надо на ДМА кольцевой буфер сделать, чтоб вообще без прерываний
С чего они потеряются, если они уже приняты и их осталось обработать ? Принимать нужно весь пакет от и до, а потом уже заниматься обработкой.alex_ писал(а):Кольцевой буфер нужен для того чтобы не потерять данные в процессе обработки
Да но на камне висит куча других задач, и он просто во время не факт что успеет запрос обработать, я сначала так и делал, собирало всё нормально но когда загрузил камень основными задачами то всё и отвалилось, контроллер начал сваливаться в ресет
Что-то Вы намудрили, если ресетится проц
По поводу "успеет" / "не успеет" обработать. Если Ваш код не успевает с обычным буфером, то кольцевой Вам не поможет. Оно и с ним будет не успевать. Нужно в корне пересматривать структуру программы.
Запустите FreeRtos и, из прерывания, по семафору отдавайте управление в задачу-обработчик, которая будет по приоритету выше остальных. Тогда всё будет успевать
По поводу "успеет" / "не успеет" обработать. Если Ваш код не успевает с обычным буфером, то кольцевой Вам не поможет. Оно и с ним будет не успевать. Нужно в корне пересматривать структуру программы.
Запустите FreeRtos и, из прерывания, по семафору отдавайте управление в задачу-обработчик, которая будет по приоритету выше остальных. Тогда всё будет успевать
Я не использую никакие Rtos, обработка идёт в общем цикле while(1) по выставленным флагам, которые выставляются от таймеров и прерываниям а так же по внешнему входу(W5500). Когда было просто на прерываниях то постоянно в ресет вываливался, полагаю что просто попадал на переполнение стека. После сделал обработку по флагам, - кому надо все в очередь.
По прежнему вопросу, сделал пока без кольца, чтобы протестировать, и когда всё запустил программа по окончанию обработки стабильно вываливается в ресет, может опять на переполнение стека попадаю, какие регистры можно посмотреть после рестарта чтобы понять по какой причине вылетаем? Регистр RCON показывает софт ресет, но это фишка MPLABа он при ошибке сам ресетит контроллер, до этого писал на микросях, там контроллер просто вис и перезагружался по собаке.
По прежнему вопросу, сделал пока без кольца, чтобы протестировать, и когда всё запустил программа по окончанию обработки стабильно вываливается в ресет, может опять на переполнение стека попадаю, какие регистры можно посмотреть после рестарта чтобы понять по какой причине вылетаем? Регистр RCON показывает софт ресет, но это фишка MPLABа он при ошибке сам ресетит контроллер, до этого писал на микросях, там контроллер просто вис и перезагружался по собаке.
Может кто сталкивался, есть ли возможность поменять в настройках компилятора отключить функцию стирания всей прошивки перед записью, а стирать и писать постранично? При условии что не установлен бит защиты. Для чего это надо: после основного кода прошивки находятся настройки устройства, и он постоянно их затирает, при каждой перезаливке, несмотря на то что я только что откалибровал устройство
Согласен можно поставить внешнюю флешку, хотя бы на момент написания и отладки прошивки, но вдруг можно и в софтине настройки поменять
Согласен можно поставить внешнюю флешку, хотя бы на момент написания и отладки прошивки, но вдруг можно и в софтине настройки поменять


