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

PIC18 MPLAB проблема с компилятором?

Доброго дня всем!

Вот такая беда приключилась. Нужно написать приложение для 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 - то же самое. Только еще и дебажить не дает - в точки останова совсем не падает.

Крутил все биты конфигураций - и от внутреннего и от внешнего тактировался и все вотчдоги отключил, ничего не помогает. Контроллер поменял сегодня. Все, я в тупике. Прошу помощи!

Изменено пользователем haker_fox
Переместил в среды разработки, как наиболее подходящий раздел.

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


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

Добрый день. 

Проблема с IDE  MPLAB X. Они хотят SNAP или выше.  И камни современные.  Остальное не работает нормально.

Из рабочего проекта 

mcc.c

 

main.c

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

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


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

Спасибо за отклик!

Я так понимаю SNAP это дебаггер такой. То есть с другими он дебажить не будет в принципе, парвильно?

На счет современности камней - в смысле дата производства?

Я вот что не пойму. Даже если дебагер не работает, жаль, конечно, но переживу. Но я не пойму, почему столь простая программка собирается успешно и вроде как шьется, а без дебаггера в принципе не работает, с дебаггером же работает как-то тоже через... Он то ли инструкции под PIC18 как-то неправильно генерирует или что? 

Попробовал утилиту Pickit3Programmer, он перепрошил Pickit3, но с микросхемой отказался работать - говорит не знает такую... и в списке нет этого партномера. Глупо как то. В итоге я даже не могу понять - прошивается ли она и корректно ли...

Вот как это происходит. Он сперва попадает в main (хотя по Си не позволяет ходить, только в окне с дизассемблером, ну да пусть так). Делаю шаг, следующий и так через 3-5 шагов - он тупо в в нулевой адрес сваливается. И оттуда можно опять по шагам бродить.

То есть как будто вотчдог или что то такое его сбрасывает, но ведь все отключено.

Питание ровное - 3.3В.

mplab.png

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


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

Просто бизнес микрочипа,  все старое отключается, покупай новое  - отладчик/программатор.  Чем выше версия 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)

 

Изменено пользователем Driver_GV
добавил хедер для пинов

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


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

С18 лучше с MPLAB 8.92 

У меня XC8 2.20 и выше и MPLAB Х 5.45. Шестая версия достала глюками, снес пока.  Жду. Отладчик ходит и по С и по ASM , все корректно.  

Специально загрузил проект и стартанул под симулятором.

image.thumb.png.95bc91d0cfc1deb929d59fada4fa846a.png

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


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

Спасибо за помощь!

Да, разбаловались мы с STM32))) Я попробовал - симулятор в X8 работает отлично, в mcc - только в "Program Memory"(в дизасемблере) - но кстати, там видны символы сишные, почему же тогда он по Си не хочет ходить - не понятно и странно, ну да ладно.

Я похоже начал понимать что Вы мне объясняете. Дебагер в железе это типа роскошь для этого камня. И код для дебагера генерится как то по-особенному, что без дебагера он не работает.

В итоге вместо запуска дебаггера я вдруг прошил, нажав на кнопку загрузки кода. Раньше мне это не приходило в голову...

mplab2.png.1fa654b88a3bc3fd0445e2c551ec9bf4.png

И случилось чудо - порт замигал! То есть понятно - данная версия MPLAB-X (самая свежая) этот камень дебажить не умеет.

Подскажите в таком случае где бы скачать ту MPLAB, которая умеет дебажить, желательно в mcc.

Я еще почему на mcc зациклился - на FreeRTOS есть порт под PIC18F и mcc, под X8 у официалов нет и в интернете я не нашел, а перепортировать - я боюсь браться и так камень новый для меня. А может быть подскажете заодно - вдруг уже кто-то делал - короче, мне нужно FreeRTOS на этом камне и в идеале желательно работающий дебагер - что где взять?

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


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

https://www.microchip.com/en-us/tools-resources/archives/mplab-ecosystem   тут все версии всего, сохраните в закладки,  на сайте обыскаться...

RTOS  не использую,  жалко ресурсов, пишу сам, как мне надо. В том числе и много поточность.  Если надо,  читать тут https://www.freertos.org/portpic24_dspic.html

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


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

О, супер - все версии в одном месте. Спасибо за ссылочку!

По FreeRTOS согласен, все таки 8 битник, но по моим прикидкам это должно взлететь. 3.5кБ ОЗУ все таки не так и мало. И скорость проца достаточно высокая. На плате куча интерфейсов, модем, датчики разные, в общем в bare metal это все будет сложновато поднимать.

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


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

Установил 8.95. Действительно, симулятор на mcc заработал, это уже классно. А на какой версии будет работать дебагер?:-) Или ни на какой?

update

вообще то - отладка работает. Хоть и не без глюков. Например ставишь точку останова - запускаешь и оно крутится пока паузу не нажмешь и вот ты стоишь на точке останова. По шагам ходит. Все это в принципе уже радует!

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


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

Под MPLAB 8.95 идеально отладка у меня работала на всех камнях на ICD2. PICKIT2 использовал только для прошивки из своей утилиты. А как перешел на MPLAB X,  с тех пор ICD2 валяется в коробке.  

Сейчас аппаратной отладкой не пользуюсь вообще, сразу пишу консоль , обычно UART/USB/TCP UDP и все через нее.  Если  бутлоадер есть то там есть все  модули. 

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

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


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

Я так понимаю, что в основном отладчиком никто не пользуется, тем более, что он требует особой сборки кода, что, конечно не может не настораживать.

Да, не идеально работает на Pickit-3. В таком раскладе, действительно, есть смысл работать на MPLAB X, и отлаживаться строкам, тем более, что найти ICD2 в наше непростое время вряд-ли удастся.

Вы написали про бутлодер- имеете в виду свой собственный бутлодер? или у микрочипа есть контроллеры с такими специальными бутлодерами с USB и т д?

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


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

4 часа назад, kan35 сказал:

Вы написали про бутлодер- имеете в виду свой собственный бутлодер? или у микрочипа есть контроллеры с такими специальными бутлодерами с USB и т д?

У микрочипа есть примеры,  но мне ни один не нравится. Написал себе свои на UART - 1,5 кб USB -2кб  Ethernet -  4кб. Из  них  же можно вызывать  функции ввода вывода для терминала отладки софта.  

Использовал для PICµBASIC,  есть на сайте у меня http://picping.ru/ и прошивки  бутлоадеоров и софт для загрузки прошивок. Написаны на асме.  Основная прошивка на сях, со сдвигом 0x800 для UART/USB. прерывания транслируются. 

 

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


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

6 часов назад, kan35 сказал:

Да, не идеально работает на Pickit-3. В таком раскладе, действительно, есть смысл работать на MPLAB X, и отлаживаться строкам, тем более, что найти ICD2 в наше непростое время вряд-ли удастся.

ICD2 давным-давно клонировали, если что. И думаю, что на Avito можно найти. Я свой Микрочиповский пока не хочу продавать, иногда гождается, но другие давно уже плюнули на PIC.

А Вы тут объявление закиньте.

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


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

Тут другой вопрос.  Человек собрался писать новый большой проект, нужно ли использовать  давно не поддерживаемый С18.  Если по хорошему то уже делать на XC8 и MPLAB Х. Это значительно удобней для разработки.  В этом случае ICD2 никак не поможет. 

SNAP  не так дорого стоит https://efind.ru/offer/mplab+snap. Перегнать код из С18 для XC8  та еще задача. Проще новое написать смотря в старый исходник.  Мало того  для этого кристалла есть примеры в коде конфигураторе включая лайт стек IP для XC8  и там почти все работает из коробки.     

 

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


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

Я все таки настроен на 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кГц системной частоты).

photo_2023-04-22_22-12-24.thumb.jpg.4b0078b64fb7d38ac908ee1b461f66a7.jpg

Потом сделал две задачи для мигания каждая своим портом.

#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;
}

И тут должно было мне прийти счастье, но нет.

Я получаю такую картинку:

photo_2023-04-22_22-12-32.thumb.jpg.a0d7c46a2cfb4c4403fea208b9a01e80.jpg

Дело в том, что на порту емкостная нагрузка, потому последовательность такая:

1мс вверху, потом 1мс генерация 300+кГц, потом 1мс внизу и так далее. На обоих задачах одно и то же.

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

 

Что может такое быть!? При чем как уже упомянут оба доступных примера работают одинаково. Моего кода в них практически нет. Что я упускаю? Приложил проект, может быть кому то будет любопытно взглянуть на это безобразие с виду простое.

Всем спасибо за подсказки и помощь!

gitprj.X.zip

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


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

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

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

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

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

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

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

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

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

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