Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вт мар 29, 2022 09:02:37

:) Я с этим вопросом три недели промучился полтора года назад.
1. Конфигурацию в АСМ проекте лучше делать отдельным С-файлом. Во первых, читабельнее. Во вторых, исчезнут варнинги. В третьих, генерация этого файла легко делается в окне Configuration bits - там есть кнопка.
2. Применение AIVT делает использование Loadables-проекта для загрузчика кривым. Поэтому лучше загрузчик и основной код размещать в едином проекте, выделяя их в отдельные секции.
3. Для генерации AIVT в общем случае нужно правильно рассчитать лимитер адреса бут-сегмента кода в конфиге. Ну и включить бут сегмент и альтернативную таблицу:
Код:
// FSEC
........
#pragma config BSEN = ON
........
#pragma config AIVTDIS = ON

// FBSLIM
#pragma config BSLIM = 0x1FFA
........

В данном примере размер Boot-сегмента будет 5 страниц стирания (длина одной - 0x800) - то есть IVT и Boot-код займут адреса 0x00000...0x01FFE, а AIVT разместится с адреса 0x02000. Основной код будет с адреса 0x02800.
В этой ситуации, как вы понимаете, IVT работает в загрузчике, а AIVT обслуживает основной код.
Лимитер расчитывается как 0x1FFF минус количество страниц бут-сегмента (0x1FFF-0x5=0x1FFA)
Компоновка кода выглядит при этом так:

Код:
.include "p33CH512MP208.inc"
........
    .section bufNear, near
........
    .section bufX, address (0x2000)
........
    .section bufY, address (0x7000)
........
    .section bufY_EDS, address (0x8000)
........
.section *, code, boot

.global __reset
.global __OscillatorFail
.global __AddressError
.global __HardTrapError
.global __StackError
.global __MathError
.global __OscillatorFail
.global __SoftTrapError
.global __T1Interrupt
........
__reset:
   mov         #__SP_init, W15
   mov         #__SPLIM_init, W0
   mov         W0, SPLIM
   nop
   bra         MainBoot
........
........
........
.section *, code

.global __reset
.global __AltAddressError
.global __AltHardTrapError
.global __AltStackError
.global __AltMathError
.global __AltDMACError
.global __AltSoftTrapError
.global __AltT1Interrupt
........
Application:
   bra         Main
........
........
 .end


ЗЫ. В догон.
Код старта, стопа и загрузки Slave-ядра размещайте сразу после
Application:
bra Main
то есть до остального кода основной программы. Иначе возникают странности с длиной имиджа слейв-кода и слейв ядро потом не стартует.
У меня в проекте используется три перезагружаемых имиджа слейва и после сборки кода карта памяти выглядит так:
Код:
section                    address   length (PC units)   length (bytes) (dec)
-------                    -------   ----------   ----------
AM-EAS-CH-v0-1.s.scn1        0x800              0x108a          0x18cf  (6351)
.aivt._AltAddressError      0x2006                 0x2             0x3  (3)
.aivt._AltHardTrapError     0x2008                 0x2             0x3  (3)
.aivt._AltStackError        0x200a                 0x2             0x3  (3)
.aivt._AltMathError         0x200c                 0x2             0x3  (3)
.aivt._AltSoftTrapError     0x2010                 0x2             0x3  (3)
.aivt._AltT1Interrupt       0x2016                 0x2             0x3  (3)
.aivt._AltDMA1Interrupt     0x2024                 0x2             0x3  (3)
.aivt._AltU1RXInterrupt     0x202a                 0x2             0x3  (3)
.aivt._AltINT1Interrupt     0x2032                 0x2             0x3  (3)
.aivt._AltDMA2Interrupt     0x2038                 0x2             0x3  (3)
.aivt._AltINT2Interrupt     0x203c                 0x2             0x3  (3)
.aivt._AltDMA3Interrupt     0x203e                 0x2             0x3  (3)
.aivt._AltCCP2Interrupt     0x2042                 0x2             0x3  (3)
.aivt._AltU2RXInterrupt     0x204a                 0x2             0x3  (3)
.aivt._AltU2TXInterrupt     0x204c                 0x2             0x3  (3)
.aivt._AltCCP3Interrupt     0x205a                 0x2             0x3  (3)
.aivt._AltPTG0Interrupt     0x20b8                 0x2             0x3  (3)
.aivt._AltPTG1Interrupt     0x20ba                 0x2             0x3  (3)
.aivt._AltPTG2Interrupt     0x20bc                 0x2             0x3  (3)
.aivt._AltPTG3Interrupt     0x20be                 0x2             0x3  (3)
.aivt._AltMSIS1Interrupt    0x2116                 0x2             0x3  (3)
.aivt._AltMSIAInterrupt     0x2118                 0x2             0x3  (3)
.aivt._AltMSIBInterrupt     0x211a                 0x2             0x3  (3)
.aivt._AltMSICInterrupt     0x211c                 0x2             0x3  (3)
.aivt._AltMSIDInterrupt     0x211e                 0x2             0x3  (3)
.aivt._AltCCP8Interrupt     0x2144                 0x2             0x3  (3)
.text                       0x2800                 0x2             0x3  (3)
AM-EAS-CH-v0-1.s.scn2       0x2802              0x283e          0x3c5d  (15453)
SLAV_image                  0x5040              0x104a          0x186f  (6255)
SLAV_TUNE_image             0x608a               0x772           0xb2b  (2859)
SLAV_SYNC_image             0x67fc               0x6b2           0xa0b  (2571)

Первым идет бут, потом альтернативная таблица, потом основной код и далее три имиджа.

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вт мар 29, 2022 12:50:38

КРАМ, спасибо огромное, чтобы я без Вас делал, хотел уже ломать подкидную доску и уходить из большого спорта.

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Ср дек 13, 2023 01:22:10

Уважаемый КРАМ,

подскажите, пожалуйста, возможно ли запустить отладку PIC24F с помощью Pickit3 при отсутствии исходника (есть только hex-файл)?

Заранее благодарю за ответ

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Ср дек 13, 2023 08:23:47

Исходник требуется.
Хотя бы ASM.
Получить его можно из хекса с помощью дизассемблера.
Нужно понимать, что дебаг во всех ПИКах происходит через управление битом отладки в конфиге и иногда с перемещением кода и данных, когда в конкретном чипе задействуются ресурсы памяти самого чипа.

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Ср дек 13, 2023 15:09:28

Исходник требуется.
Хотя бы ASM.
Получить его можно из хекса с помощью дизассемблера.

любым или каким-то конкретным дизассемблером? в каком виде должен быть этот исходник (он обязательно должен ассемблироваться или нужен только для отображения)?
Нужно понимать, что дебаг во всех ПИКах происходит через управление битом отладки в конфиге и иногда с перемещением кода и данных, когда в конкретном чипе задействуются ресурсы памяти самого чипа.

правильно ли я понял, что так, как у АРМ-ов можно отладчиком подключиться к микроконтроллеру и шагать/останавливать с ПИК24 не получится? существует ли для ПИК24 gdb или какое-то подобие?

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Ср дек 13, 2023 17:28:47

любым или каким-то конкретным дизассемблером?

Что значит "любым"? Дизассемблер должен быть под 16-разрядную платформу Микрочипа (PIC24/dsPIC33).
в каком виде должен быть этот исходник

В виде исходника на ассемблере ASM16 (который является частью пакета XC16).
как у АРМ-ов можно отладчиком подключиться к микроконтроллеру и шагать/останавливать с ПИК24 не получится? существует ли для ПИК24 gdb или какое-то подобие?

Отладчик через ICSP-интерфейс не совместим с JTAG. Но часть 16-разрядных МК Микрочипа имеют и JTAG. Однако я никогда его не использовал.
ICSP-отладчик позволяет шагать по коду, останавливаться на брейкпойнтах или по требованию и т.д. Наблюдать значения регистров и переменных во время исполнения в этом отладчике невозможно. Только после останова. Выход из этого отладчика потребует для штатной работы кода перепрошить МК. В отличии от JTAG, где после выхода код запускается в обычном режиме.
Возможно есть какой то режим работы дебага, при котором исходник не требуется, но штатный вход в отладку в MPLABX транслирует исходник, перепрошивает МК и только после этого входит в дебаг.

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Сб дек 16, 2023 03:26:13

В виде исходника на ассемблере ASM16 (который является частью пакета XC16).

помимо XC16, частью которого является ассемблер ASM16 встречаю упоминание MPLAB C30 и ASM30 -- последние актуальны или нет?
Отладчик через ICSP-интерфейс не совместим с JTAG. Но часть 16-разрядных МК Микрочипа имеют и JTAG. Однако я никогда его не использовал.
ICSP-отладчик позволяет шагать по коду, останавливаться на брейкпойнтах или по требованию и т.д. Наблюдать значения регистров и переменных во время исполнения в этом отладчике невозможно. Только после останова. Выход из этого отладчика потребует для штатной работы кода перепрошить МК. В отличии от JTAG, где после выхода код запускается в обычном режиме.

правильно ли я понимаю, что для отладки по JTAG не годится Pickit3 и потребуется ICD3 ?

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Сб дек 16, 2023 07:11:03

Нет, не правильно. Для отладки по JTAG нужен минимум PICkit4.
Ну и необходимо, чтобы сам чип имел такую возможность не исключенную в эррате, довольно много 16-битных МК Микрочипа имеют такое исключение.
По поводу С30/ASM30/MPLAB 8. Я не помню, чтобы в восьмерке поддерживались инструменты JTAG.

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вс дек 17, 2023 16:37:08

9. Локальный стек (фрейм) позволяет при входе в вызов (call или прерывание) открывать указатели на локальные переменные. Эти указатели размещены сразу за вершиной стека. Указатель локального стека размещен в W14. При входе в вызов локальный стек объявляется командой lnk #N . При выходе из вызова локальный стек закрывается командой ulnk . Это Си ориентированный механизм определения локальных переменных.

можете ли для лучшего понимания привести реальный пример такого использования с вашими комментариями (с учетом предыдущего п.8 )?

Заранее благодарю

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вс дек 17, 2023 18:35:50

Код:
__reset:
   mov      #__SP_init, W15
   mov      #__SPLIM_init, W0
   mov      W0, SPLIM
   nop
   call      MainInit
   blah-blah-blah....


MainInit:
   lnk      #4
   mov      #15936, W0
   mov      W0, [W14]   ; первая локальная переменная равна 15936
   clr      [W14+2]         ; вторая локальная переменная равна 0
   blah-blah-blah....


   ulnk
   return

Предположим, что указатель стека изначально инициализирован значением 0x1000 (это определяется линкером), то есть W15=0x1000 (#__SP_init это #0x1000).
Тогда при вызове MainInit указатель стека получит значение W15=0x1004, а в ОЗУ по адресу 0x1000:0x1002 будет адрес возврата из MainInit.
После выполнения инструкции lnk #4 указатель стека станет равен W15=0x1008, а указатель локального стека W14=0x1004.
Таким образом, открылся фрейм на две локальных 16-битных переменных в стеке к которым можно получить доступ через указатель [W14] и [W14+2], то есть по адресам 0x1004 и 0x1006.
Перед выходом из MainInit фрейм закрывается инструкцией ulnk и W15 получает значение 0x1004 как было перед инструкцией lnk #4, а после возврата в основное тело программы W15=0x1000.
Последний раз редактировалось КРАМ Вс дек 17, 2023 18:47:48, всего редактировалось 1 раз.

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вс дек 17, 2023 18:43:56

пытаюсь разобраться с подпрограммой программной задержки и пока не совсем понял как правильно вычислить в мксек длительность одного цикла (применительно к исполнению инструкций, приведенных в даташите) в зависимости от частоты кварца основного генератора (например, 6МГц) -- подскажите, пожалуйста, применительно к PIC24FJ

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вс дек 17, 2023 18:53:45

как правильно вычислить в мксек длительность одного цикла

Длительность одного машинного цикла в любом МК 16-битной платформы Микрочипа равна двум периодам частоты осциллятора. То есть если у вас частота равна 6МГц, то длительность одноцикловой инструкции (например nop или mov W0, W1) составит 0,333(3) мкс.
Но если включен PLL, то частота осциллятора не равна частоте кварца.
Максимальная частота осциллятора для PIC24FJ составляет 32МГц, что соответствует производительности 16MIPS или циклу 62,5 нс.

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вс дек 17, 2023 19:13:05

Длительность одного машинного цикла в любом МК 16-битной платформы Микрочипа равна двум периодам частоты осциллятора.
Но если включен PLL, то частота осциллятора не равна частоте кварца.
Максимальная частота осциллятора для PIC24FJ составляет 32МГц

насколько я понял из даташита для ПИК24 умножитель только 4, т.е. при максимальной частоте 32МГц получается кварц должен быть на 8МГц хотя по даташиту допускается 10МГц (в моем случае получается при 6МГц-ом кварце частота будет 24МГц и ее нужно разделить на 2 для получения одного цикла исполнения инструкций)

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вс дек 17, 2023 19:23:35

насколько я понял из даташита для ПИК24

Для начала назовите конкретную модель МК.

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вс дек 17, 2023 19:25:25

Для начала назовите конкретную модель МК.

24FJ256GA110

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вс дек 17, 2023 19:28:32

Частота кварца при выборе типа осциллятора HS составляет 10...32МГц.
Читайте даташит.
То есть вы можете и без PLL получить максимальную частоту тактирования. Естественно, что и с PLL вы не можете ее превысить.

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Вс дек 17, 2023 22:50:10

...инсталлировать ПОСЛЕ установки среды текущую версию компилятора XC16 (1.36). При инсталляции заявляем о желании free версии...

подскажите, пожалуйста, по каким критериям Вы выбрали ХС16 при наличии нескольких альтернативных компиляторов Си? можно ли где-то найти описание всех библиотечных функций компилятора?

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Пн дек 18, 2023 04:39:58

А я и не использую Си компилятор на этой платформе. ХС16 мне нужен лишь для того, чтобы использовать ASM16.
На Си я пишу только для ARM и есть один серийный проект для PIC18Q43 на ХС8.
Поскольку 16-битные Микрочипы имеют очень приятную архитектуру и систему команд, а я не программист, а радиоинженер, то нахожу бессмысленным и неэффективным использовать в проектах с этими МК Си-компилятор. Ну а библиотеки я не использую вообще. Даже на ARM.

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Пн дек 18, 2023 21:43:11

подскажите, пожалуйста, структуру выходного файла: после ассемблирования получается hex-файл. Конвертирую его в bin и вместо ожидаемых 24-битных слов наблюдаю 32-битные с одним 00-м байтом -- так и должно быть? например, пытаюсь понять порядок следования байтов и битов для анализа Конфигурационных слов (CW1, CW2, CW3):
0 1 2 3 4 5 6 7 8 9 A B C D E F
000557А0: 00 00 FF 00 FF FF FF 00 7E F2 FF 00 F9 3E FF 00

Re: Тем, кто боится перейти с 8 на 16 разрядов (PIC24/dsPIC3

Пн дек 18, 2023 21:58:26

В хексе тоже самое. Стандартный хекс имеет 32-битную упаковку. Поэтому каждый четвертый байт будет нулевым.
Вы вообще в курсе относительно формата хекса?
Вы знаете какие строки являются адресным смещением, а какие собственно код?
Ответить