kan35 7 21 апреля, 2023 Опубликовано 21 апреля, 2023 (изменено) · Жалоба Доброго дня всем! Вот такая беда приключилась. Нужно написать приложение для PIC18F67J94. Есть железка и там крутилась уже какая то прошивка. То есть железо - гарантированно рабочее. Подключил к плате Pickit-3. Создал проект в MPLAB, совсем простой: //#include <xc.h> #include "C:\Program Files (x86)\Microchip\mplabc18\v3.47\h\p18f67j94.h" #pragma config XINST=OFF #pragma config STVREN=OFF #pragma config BOREN=OFF #pragma config FOSC=PRI #pragma config CLKOEN=OFF #pragma config IESO=ON #pragma config PLLDIV=PLL4X #pragma config POSCMD=HS #pragma config FSCM=CSECME #pragma config IOL1WAY=OFF #pragma config WDTEN=OFF #pragma config DSWDTEN=OFF extern void delay(unsigned int x); volatile int a = 0x55; void delay(unsigned int x) { unsigned int i; for ( i = 0; i<x; i++) ; } void main(void) { TRISE = 0xFC; LATE = 0x00; while (1) { LATE &= ~(0b11); delay(100000); LATE |= 0b11; delay(100000); } } Установил компилятор MCC, а так же X8. На X8 - компилирую, запускаю и он не прыгает в main, а где то подвисает, может около стартовых инструкции или еще где то ДО. Я ставлю точку останова на записи в порт - он через какое то время туда вроде как сваливается и лаже светодиод загорается, но если убрать точку останова и нажать пуск- он уходит в ресет или еще куда то и там останавливается. Если на плату подать питание - то вывод в Z состоянии, то есть он его даже в выход не переключает. Пробовал компилятор mcc - то же самое. Только еще и дебажить не дает - в точки останова совсем не падает. Крутил все биты конфигураций - и от внутреннего и от внешнего тактировался и все вотчдоги отключил, ничего не помогает. Контроллер поменял сегодня. Все, я в тупике. Прошу помощи! Изменено 23 апреля, 2023 пользователем haker_fox Переместил в среды разработки, как наиболее подходящий раздел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Driver_GV 1 21 апреля, 2023 Опубликовано 21 апреля, 2023 (изменено) · Жалоба Добрый день. Проблема с IDE MPLAB X. Они хотят SNAP или выше. И камни современные. Остальное не работает нормально. Из рабочего проекта mcc.c main.c Изменено 21 апреля, 2023 пользователем Driver_GV Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 21 апреля, 2023 Опубликовано 21 апреля, 2023 · Жалоба Спасибо за отклик! Я так понимаю SNAP это дебаггер такой. То есть с другими он дебажить не будет в принципе, парвильно? На счет современности камней - в смысле дата производства? Я вот что не пойму. Даже если дебагер не работает, жаль, конечно, но переживу. Но я не пойму, почему столь простая программка собирается успешно и вроде как шьется, а без дебаггера в принципе не работает, с дебаггером же работает как-то тоже через... Он то ли инструкции под PIC18 как-то неправильно генерирует или что? Попробовал утилиту Pickit3Programmer, он перепрошил Pickit3, но с микросхемой отказался работать - говорит не знает такую... и в списке нет этого партномера. Глупо как то. В итоге я даже не могу понять - прошивается ли она и корректно ли... Вот как это происходит. Он сперва попадает в main (хотя по Си не позволяет ходить, только в окне с дизассемблером, ну да пусть так). Делаю шаг, следующий и так через 3-5 шагов - он тупо в в нулевой адрес сваливается. И оттуда можно опять по шагам бродить. То есть как будто вотчдог или что то такое его сбрасывает, но ведь все отключено. Питание ровное - 3.3В. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Driver_GV 1 21 апреля, 2023 Опубликовано 21 апреля, 2023 (изменено) · Жалоба Просто бизнес микрочипа, все старое отключается, покупай новое - отладчик/программатор. Чем выше версия IDE тем более старое не работает. И тем менее поддержки старых камней в средствах отладки/ программирования. Все остальное работает как надо, и компиляторы и инструкции и железо. Где-то что-то не допилили. Через 10 лет с PIC я понял - это не камень/софт глючит. Это я не дочитал даташит. Использую PICKIT2, как программатор и то не из MPLABx а из его оболочки. Нужен новый DevicrFile и камни появятся и во 2 и в 3 ките. Отладка под симулятором работает , глюков не много. Последняя удачная отладка в железе со 2 китом работала только со старым MPLAB. Ну и начинать с моргания светодиодом. Ошибки есть и в даташите и в errata. Путь длинный, но в итоге все хорошо, на таком камне у меня крутятся WEB сервера, MQTT и очень много еще чего. Лучше начать с какого ни будь готового рабочего проекта и разбираться. pin_manager.h инлайн функции // INTERRUPT #define INTERRUPT_GlobalInterruptEnable() (INTCONbits.GIE = 1) #define INTERRUPT_GlobalInterruptDisable() (INTCONbits.GIE = 0) #define INTERRUPT_PeripheralInterruptEnable() (INTCONbits.PEIE = 1) #define INTERRUPT_PeripheralInterruptDisable() (INTCONbits.PEIE = 0) Изменено 21 апреля, 2023 пользователем Driver_GV добавил хедер для пинов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Driver_GV 1 21 апреля, 2023 Опубликовано 21 апреля, 2023 · Жалоба С18 лучше с MPLAB 8.92 У меня XC8 2.20 и выше и MPLAB Х 5.45. Шестая версия достала глюками, снес пока. Жду. Отладчик ходит и по С и по ASM , все корректно. Специально загрузил проект и стартанул под симулятором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 21 апреля, 2023 Опубликовано 21 апреля, 2023 · Жалоба Спасибо за помощь! Да, разбаловались мы с STM32))) Я попробовал - симулятор в X8 работает отлично, в mcc - только в "Program Memory"(в дизасемблере) - но кстати, там видны символы сишные, почему же тогда он по Си не хочет ходить - не понятно и странно, ну да ладно. Я похоже начал понимать что Вы мне объясняете. Дебагер в железе это типа роскошь для этого камня. И код для дебагера генерится как то по-особенному, что без дебагера он не работает. В итоге вместо запуска дебаггера я вдруг прошил, нажав на кнопку загрузки кода. Раньше мне это не приходило в голову... И случилось чудо - порт замигал! То есть понятно - данная версия MPLAB-X (самая свежая) этот камень дебажить не умеет. Подскажите в таком случае где бы скачать ту MPLAB, которая умеет дебажить, желательно в mcc. Я еще почему на mcc зациклился - на FreeRTOS есть порт под PIC18F и mcc, под X8 у официалов нет и в интернете я не нашел, а перепортировать - я боюсь браться и так камень новый для меня. А может быть подскажете заодно - вдруг уже кто-то делал - короче, мне нужно FreeRTOS на этом камне и в идеале желательно работающий дебагер - что где взять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Driver_GV 1 21 апреля, 2023 Опубликовано 21 апреля, 2023 · Жалоба https://www.microchip.com/en-us/tools-resources/archives/mplab-ecosystem тут все версии всего, сохраните в закладки, на сайте обыскаться... RTOS не использую, жалко ресурсов, пишу сам, как мне надо. В том числе и много поточность. Если надо, читать тут https://www.freertos.org/portpic24_dspic.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 21 апреля, 2023 Опубликовано 21 апреля, 2023 · Жалоба О, супер - все версии в одном месте. Спасибо за ссылочку! По FreeRTOS согласен, все таки 8 битник, но по моим прикидкам это должно взлететь. 3.5кБ ОЗУ все таки не так и мало. И скорость проца достаточно высокая. На плате куча интерфейсов, модем, датчики разные, в общем в bare metal это все будет сложновато поднимать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 21 апреля, 2023 Опубликовано 21 апреля, 2023 · Жалоба Установил 8.95. Действительно, симулятор на mcc заработал, это уже классно. А на какой версии будет работать дебагер?:-) Или ни на какой? update вообще то - отладка работает. Хоть и не без глюков. Например ставишь точку останова - запускаешь и оно крутится пока паузу не нажмешь и вот ты стоишь на точке останова. По шагам ходит. Все это в принципе уже радует! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Driver_GV 1 22 апреля, 2023 Опубликовано 22 апреля, 2023 (изменено) · Жалоба Под MPLAB 8.95 идеально отладка у меня работала на всех камнях на ICD2. PICKIT2 использовал только для прошивки из своей утилиты. А как перешел на MPLAB X, с тех пор ICD2 валяется в коробке. Сейчас аппаратной отладкой не пользуюсь вообще, сразу пишу консоль , обычно UART/USB/TCP UDP и все через нее. Если бутлоадер есть то там есть все модули. Изменено 22 апреля, 2023 пользователем Driver_GV Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 22 апреля, 2023 Опубликовано 22 апреля, 2023 · Жалоба Я так понимаю, что в основном отладчиком никто не пользуется, тем более, что он требует особой сборки кода, что, конечно не может не настораживать. Да, не идеально работает на Pickit-3. В таком раскладе, действительно, есть смысл работать на MPLAB X, и отлаживаться строкам, тем более, что найти ICD2 в наше непростое время вряд-ли удастся. Вы написали про бутлодер- имеете в виду свой собственный бутлодер? или у микрочипа есть контроллеры с такими специальными бутлодерами с USB и т д? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Driver_GV 1 22 апреля, 2023 Опубликовано 22 апреля, 2023 · Жалоба 4 часа назад, kan35 сказал: Вы написали про бутлодер- имеете в виду свой собственный бутлодер? или у микрочипа есть контроллеры с такими специальными бутлодерами с USB и т д? У микрочипа есть примеры, но мне ни один не нравится. Написал себе свои на UART - 1,5 кб USB -2кб Ethernet - 4кб. Из них же можно вызывать функции ввода вывода для терминала отладки софта. Использовал для PICµBASIC, есть на сайте у меня http://picping.ru/ и прошивки бутлоадеоров и софт для загрузки прошивок. Написаны на асме. Основная прошивка на сях, со сдвигом 0x800 для UART/USB. прерывания транслируются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
byRAM 24 22 апреля, 2023 Опубликовано 22 апреля, 2023 · Жалоба 6 часов назад, kan35 сказал: Да, не идеально работает на Pickit-3. В таком раскладе, действительно, есть смысл работать на MPLAB X, и отлаживаться строкам, тем более, что найти ICD2 в наше непростое время вряд-ли удастся. ICD2 давным-давно клонировали, если что. И думаю, что на Avito можно найти. Я свой Микрочиповский пока не хочу продавать, иногда гождается, но другие давно уже плюнули на PIC. А Вы тут объявление закиньте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Driver_GV 1 22 апреля, 2023 Опубликовано 22 апреля, 2023 · Жалоба Тут другой вопрос. Человек собрался писать новый большой проект, нужно ли использовать давно не поддерживаемый С18. Если по хорошему то уже делать на XC8 и MPLAB Х. Это значительно удобней для разработки. В этом случае ICD2 никак не поможет. SNAP не так дорого стоит https://efind.ru/offer/mplab+snap. Перегнать код из С18 для XC8 та еще задача. Проще новое написать смотря в старый исходник. Мало того для этого кристалла есть примеры в коде конфигураторе включая лайт стек IP для XC8 и там почти все работает из коробки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 22 апреля, 2023 Опубликовано 22 апреля, 2023 · Жалоба Я все таки настроен на FreeRTOS, а порты доступны только для C18, поэтому на нем. Принял решение оставаться на MPLAB X. Опробовал официальный порт с сайна FreeRTOS, а так же старый пример с гитхаба (https://github.com/sybreon/freertos-pic18). И оба раза столкнулся со странной одинаковой проблемой. Во первых пришлось немного подкрутить настройку таймера 1, чтобы запустился системный таймер. static void prvSetupTimerInterrupt( void ) { const unsigned long ulConstCompareValue = ( ( configCPU_CLOCK_HZ / portTIMER_FOSC_SCALE ) / configTICK_RATE_HZ ); unsigned long ulCompareValue; unsigned char ucByte; /* Interrupts are disabled when this function is called. Setup CCP1 to provide the tick interrupt using a compare match on timer 1. Clear the time count then setup timer. */ TMR1H = ( unsigned char ) 0x00; TMR1L = ( unsigned char ) 0x00; /* Set the compare match value. */ ulCompareValue = ulConstCompareValue; CCPR1L = ( unsigned char ) ( ulCompareValue & ( unsigned long ) 0xff ); ulCompareValue >>= ( unsigned long ) 8; CCPR1H = ( unsigned char ) ( ulCompareValue & ( unsigned long ) 0xff ); CCP1CONbits.CCP1M0 = portBIT_SET; /*< Compare match mode. */ CCP1CONbits.CCP1M1 = portBIT_SET; /*< Compare match mode. */ CCP1CONbits.CCP1M2 = portBIT_CLEAR; /*< Compare match mode. */ CCP1CONbits.CCP1M3 = portBIT_SET; /*< Compare match mode. */ PIE3bits.CCP1IE = portBIT_SET; /*< Interrupt enable. */ /* We are only going to use the global interrupt bit, so set the peripheral bit to true. */ INTCONbits.GIEL = portBIT_SET; /* Provided library function for setting up the timer that will produce the tick. */ //OpenTimer1( T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_1 & T12_CCP1_T34_CCP2345 ); // timer 1 setup // Timerx clock source is the system clock (FOSC) T1CONbits.TMR1CS1 = portBIT_CLEAR; T1CONbits.TMR1CS0 = portBIT_CLEAR; // no prescaler (1:1) T1CONbits.T1CKPS1 = portBIT_CLEAR; T1CONbits.T1CKPS0 = portBIT_CLEAR; // Do not synchronize external clock input T1CONbits.NOT_T1SYNC = portBIT_SET; // 16 bit T1CONbits.RD16 = portBIT_CLEAR; // enable timer T1CONbits.TMR1ON = portBIT_SET; // init done signal LATG = 0b10; } Вроде все нормально, сделал выдачу клока на пин, и получил четкий сигнал 500Гц (1кГц системной частоты). Потом сделал две задачи для мигания каждая своим портом. #pragma config XINST=OFF #pragma config FOSC=PRIPLL #pragma config CLKOEN=OFF #pragma config IESO=ON #pragma config PLLDIV=PLL4X #pragma config POSCMD=HS static void vTask1(void *pvParameters) { while (1) { taskENTER_CRITICAL(); LATE ^= 0b01; taskEXIT_CRITICAL(); //vTaskDelay(1000); } } static void vTask2(void *pvParameters) { while (1) { taskENTER_CRITICAL(); LATE ^= 0b10; taskEXIT_CRITICAL(); //vTaskDelay(1000); } } /* * */ void main(void) { /* Power up Configuration*/ TRISE = 0xF0; TRISG = 0xFC; LATE = 0; LATG = 0; /* Create tasks */ xTaskCreate(vTask1, "T1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); xTaskCreate(vTask2, "T2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); /* Start the scheduler. Will never return here. */ vTaskStartScheduler(); return; } И тут должно было мне прийти счастье, но нет. Я получаю такую картинку: Дело в том, что на порту емкостная нагрузка, потому последовательность такая: 1мс вверху, потом 1мс генерация 300+кГц, потом 1мс внизу и так далее. На обоих задачах одно и то же. Как только раскомментирую vTaskDelay в задачах - перестает выдавать что-либо. Есть видимость, что многозадачность как то и работает, но что происходит не понятно - как будто задачи работают с нестабильной скоростью или как то так... задержки не работают совсем. Что может такое быть!? При чем как уже упомянут оба доступных примера работают одинаково. Моего кода в них практически нет. Что я упускаю? Приложил проект, может быть кому то будет любопытно взглянуть на это безобразие с виду простое. Всем спасибо за подсказки и помощь! gitprj.X.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться