Visual Studio как IDE для Free PDK

Что бы писать код для мк Padauk необходим удобный IDE, поддерживаемый компилятором SDCC. Предпочтение было  отдано редактору VS Code. Для удобства был добавлен скрипт, позволяющий обходится без командной строки. Прежде всего необходимо скачать и установить компилятор SDCC . Здесь можно почитать, как это сделать, если не сделали ранее.

Отсюда скачиваем дистрибутив VS Code для Windous. Устанавливаем.

Теперь необходимо скачать макрос, который позволит избежать работы с командной строкой. Скачиваем репозиторий  с ГитХаба. Распаковываем его и закидываем в любое место. Сообществом Free PDK было разработана программа для прошивки микроконтроллеров PADAUK. Называется приложение Easypdkprog . По ссылке можно почитать как его скачать и установить. Располагать распакованные файлы Easypdkprog необходимо в паке с макросом.

Сообщество Free PDK разместило большое количество примерочных кодов на Гитхабе. Можно использовать их для обучения. Находятся они здесь.

Скачать папку «include» отдельно не получится, поэтому скачиваем весь проект с Гитхаба (Code / Download ZIP). Распаковываем в любом месте, открываем папку include. Распределяем файлы и папки:

  • папки easy-pdk и pdk копируем в папку include компилятора SDCC. Обычно она находится по пути C:\Program Files\SDCC\include;
  • четыре оставшихся файла .h копируем в проект рядом с файлом __.c нашего проекта.

Разберем простейший код от сообщества BlinkLED.

Открываем папку padauk-sdcc-vsode-starter-master, жмем правой кнопкой мыши по свободному месту, выбираем «Открыть с помощью Code».

Соглашаемся с предупреждением, жмем «Yes». Создаем чистый файл с помощью иконки

Даем ему имя  ххх.С . Например Mayak-7.C Вставляем код из ГитХаба. Копипастим код BlinkLED/main.c, отсюда.

По задумке авторов сборка должна выполняться с помощью программы Make, алгоритм сборки описан в каждом из примеров в файле Makefile. С помощью этого файла в код дополнительно добавляются некоторые define-ы, значения которых установлены в самом «Makefile». Мы это программой пользоваться не будем (она сама и скрипт написаны под linux), поэтому укажем эти дефайны вручную прямо в начале кода.

#define PFS154

#define F_CPU 1000000

#define TARGET_VDD_MV  4000

#define TARGET_VDD  4.0

Теперь можем задействовать макрос, который мы скачали и установили выше. Команда для компиляции нашего кода «Cntr+Shift+B». В выпадающем окне выбираем разрядность нашего микроконтроллера. В нашем случае для PFS154 это 14. Сразу начинается компиляция. Если ошибок нет, выводится такой текст . Главное — это «Done».

Есть еще пара команд, которые нам понадобятся:

Для проверки подключенного программатора и/или микроконтроллера  горячие клавиши «Cntr+P»,  в выпадающем окне вписываем «task+пробел» выбираем «Probe MC». Получаем результат

Для прошивки микроконтроллера горячие клавиши  » Cntr+P»,  в выпадающем окне вписываем «task+пробел» выбираем «Write to MC».  В выпадающем окне выбираем наш микроконтроллер. Получаем результат

Позднее сделал игрушку маяк-поворотник для велосипедов и самокатов. Две кнопки и восемь светодиодов. Контроллер использовал перезаписываемый PFS154 на 16-ти ногах. Ниже можно посмотреть код программы

#define PFS154
#define F_CPU 1000000
#define TARGET_VDD_MV  3000
#define TARGET_VDD  3.0

#include <pdk/device.h>
#include "auto_sysclock.h"
#include "delay.h"
             
#define BTN_L()   !(PA & (1 << 7))
#define BTN_R()   !(PA & (1 << 0))

// Main program
void main() {
   PAC=0;//|= (1 << 7);       // Enable Button as digital input
  PAPH=0b11111111;         //|= (1 << 7);         // Enable pull-up resistor on Button
  PBC=0b11111111; 
  int i = 0;
        PB=0; 
      _delay_ms(300);
  if (BTN_R()) {
    i=7;
   while (i>=0) {
    PB=PB | (1 << i);
    _delay_ms(25);
       i=i-1;
  }  
  }
   else if (BTN_L()) {
    i=0;
    while (i<=7) {
    PB=PB | (1 << i);
    _delay_ms(25);
       i=i+1;
    } 
 
    }
   else {
      PB=255;
      _delay_ms(200);
    }
}

// Startup code - Setup/calibrate system clock
unsigned char _sdcc_external_startup(void) {
  AUTO_INIT_SYSCLOCK();
  AUTO_CALIBRATE_SYSCLOCK(TARGET_VDD_MV);
  return 0;   // Return 0 to inform SDCC to continue with normal initialization.
}