Модуль PIC18F67J60 для Pinboard II


 
Коллекция модулей для Pinboard II пополнилась еще одним необычным девайсом. На этот раз это PIC, но не общего назначения, а специализированный, со встроенным 10Base-T Ethernet контроллера с интегрированным MAC и PHY.
 

  • Семейство: PIC18
  • Разрядность: 8 бит
  • Частота: до 40MHz
  • Флеша: 128KB
  • ОЗУ: 3.84KB
  • Периферия: ADC, Comparator, PWM, Timer
  • Интерфейсы: Ethernet, EUSART, I2C, SPI
  • Тактовый генератор: внешний и внутренний.
  • Питающее напряжение: 2…3.6V
  • Корпус: TQFP 64

 

Причем физический уровень реализован внутри МК, т.е. развязывающий трансформатор вешается прям на контроллер. Фактически, на одном только разъеме, кварце и микроконтроллере да мизерной обвязке можно сделать самодостаточный вебсервер. Под него Microchip написал неплохую библиотечку реализующую TCP-IP стек.
 

Описание модуля
Схема без каких либо извращений.

Крупнее или в PDF
 

На верхнем торце платы находится Ethernet разьем, с развязывающим трансформатором и сигнальными светодиодами. Под ним кварц и микроконтроллер.
 


 

Слева и справа проходят контактные гребенки. Внешний ряд ведет на плату, а внутренние ряд к выводом контроллера. Концепция модуля не изменилась. Также как и в остальных модулях мы постарались вывести максимальное количество выводов на плату, а также сохранить независимость контроллера, оставив все подключения на откуп пользователю. Посредством джамперов и перемычек.
 


Крупнее
 

Вот таким вот образом, например, мы подключаем вывод UART к линиями UART идущим на плату
 


 

В процессе разработки постарались по максимуму сгруппировать все так, чтобы все интерфейсы подключались джамперами к шинам демоплаты, с минимумом использования проводных перемычек. В нижней части модуля есть кнопка RESET и гребенка для подключения к отладчику PICKIT.
 


 

Сверху указан только первый вывод, а вот снизу подписан каждый.
 


 

Быстрый старт
 

  • Установка софта
  • Создание проекта
  • Подключение модуля
  • Заливка через бутлоадер
  • Работа демосервера

 

Давайте разберемся с подключением и запуском. Для начала создадим простейший Hello LED проект, помигаем диодиком и разберемся как его заливать в контроллер через бутлоадер. Для облегчения освоения.
 

Установка софта
Для начала дергаем со страницы микрочипа среду MPLAB IDE и компилятор ХС8
 

Ставим это все. Сначала MPLab, затем компилятор ХС08. Причем, важный момент. Компилятор и оболочку надо ставить ПО КОРОТКОМУ ПУТИ без пробелов и, естественно, русских символов. То, что он предлагает воткнуться в Program Files это его дурь. Он оттуда работать не будет, свалившись с ошибкой «Can’t run programm in D:\Program», что в общем явно дало мне понимание сути проблемы :) Так что ставим его, например ,как D:\Microchip\*** и все будет хорошо.
 

Компилятор спросит ключ регистрации. Оставляем поле пустым, при этом он предложит два варианта:
 

  • Бесплатная ограниченная по размеру.
  • Полноценная, но ограниченная по времени.

 

Дальше надо настроить тулчейн. Точнее проверить, что он выбран основным. Запускаем MPLAB и лезем в Tools — Options — Embedded
 


 


 

Там выбираем ХС8 и жмем Default ну или он, скорей всего, уже будет Default.
 

Создание проекта
Создадим наш тестовый проект. File > New Project > Microchip Embedded, Standalone Project
 


 

Выбираем семейство Advanced 8-bit MCUs (PIC18) и контроллер, PIC18F67J60
 


 

Третий пункт, который Select Header, пропускаем оставляя none.
 

В разделе Select Tool выбираем PicKit2. Это конечно в данном случае не имеет значения, т.к. отладчик мы сейчас использовать не будем. Но если он у вас куплен, то эта строчка пригодится в дальнейшем. Почему бы и нет.
 


 

На очередном этапе выбираем компилятор. Нам нужен ХС8
 


 

Ну и на завершающем, седьмом, этапе выберем пути и кодировку проекта. Укажите папку куда будете кидать все проекты под PIC.
 


 

Теперь, заходим в свойства проекта, тыкая правой кнопкой мыши на дерево на дерево проекта > properties.
 


 

XC8 compiler > include directories тут мы можем указать необходимую директорию с подключаемыми h-файлами, если такая потребуется. А она обычно требуется в любом более менее сложно проекте. Кроме того нужно указать директорию, где компилятор держит хидеры контроллеров. Прописываете свою туда.
 


 

Добавим теперь исходник главной функции.
 


 

Система спросит куда его положить и вообще в каком виде мы его хотим:
 


 

Появится файл main.c с каким то шаблоном кода, который очень похож не дестопный вариант :))) Стираем эту лабуду и вписываем свой исходник:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include  <pic18f67j60.h>
 
/* КОНФИГУРАЦИЯ  */
//#pragma config WDTEN = OFF          // Отключаем сторожевой таймер
#pragma config WDT   = OFF            // Отключаем сторожевой таймер *if ver. компилятора > 1.11*
#pragma config STVR  = OFF            // Сброс при переполнении/опустошении стека не происходит
#pragma config XINST = OFF            // Расширенная система команд запрещена
#pragma config CP0   = OFF            // Защита памяти программ отключена
#pragma config FOSC  = HS
#pragma config FOSC2 = ON             // Clock selected by FOSC1:FOSC0 as system clock is enabled when OSCCON<1:0> = 00
 
/* ПРОТОТИПЫ ФУНКЦИЙ */
 
void Init_Periph (void);
 
/* ОБРАБОТЧИК ПРЕРЫВАНИЙ */
void interrupt low_priority low_isr (void)
{
    /* ... */
}
 
void interrupt high_isr (void)
{
    static volatile unsigned int Tmr_Var = 0;
 
    if (PIR1bits.TMR1IF && PIE1bits.TMR1IE) {
 
        ++Tmr_Var;
        PIR1bits.TMR1IF = 0;
 
        if (Tmr_Var == 11) {
            LATEbits.LATE0 ^= 1;
            LATEbits.LATE1 ^= 1;
            LATEbits.LATE2 ^= 1;
            LATEbits.LATE3 ^= 1;
            Tmr_Var = 0;
        }
    }
}
 
void main (void)
{
    Init_Periph();
 
    while (1)
    {
        continue;
    }
}

Теперь создадим еще один исходник.
 


 

То же самое окно, что и при создании main.c указываем там название файла periph.c и вписываем туда такой код:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include  <pic18f67j60.h>
 
void Init_Periph (void)
{
//************************************  КОНФИГУРАЦИЯ ГЕНЕРАТОРА  *****************************************
 
    OSCCONbits.SCS0 = 0;
    OSCCONbits.SCS1 = 0;                // External osc. FOSC = 25Mhz
 
//**************************************  УПРАВЛЯЮЩИЕ ВЫХОДЫ  ********************************************
 
    TRISEbits.RE0       = 0;
    TRISEbits.RE1       = 0;
    TRISEbits.RE2       = 0;
    TRISEbits.RE3       = 0;            /* Устанавливаем пины на выход        */
 
    LATEbits.LATE0      = 1;
    LATEbits.LATE1      = 0;
    LATEbits.LATE2      = 1;
    LATEbits.LATE3      = 0;            /* Выставляем начальные значения      */
 
//**************************************  НАСТРОЙКА ТАЙМЕРА  *********************************************
 
    PIE1bits.TMR1IE   = 1;              // Enable TMR1 interrupt
    IPR1bits.TMR1IP   = 1;              // Enable TMR1 high priority int
    T1CONbits.TMR1CS  = 0;              /* Internal clock - (FOSC/4)          */
    T1CONbits.T1CKPS0 = 1;              /* Prescaler 1:8                      */
    T1CONbits.T1CKPS1 = 1;              /* 781_250 ticks per second           */
    TMR1H = TMR1L     = 0;
    PIR1bits.TMR1IF   = 0;
 
//************************************** ПРЕРЫВАНИЯ ******************************************************
 
    INTCONbits.PEIE     = 1;            /* Периферийные прерывания разрешены  */
    INTCONbits.GIE      = 1;            /* Глобальные прерывания разрешены    */
    RCONbits.IPEN       = 1;            // IRQ priority allowed
    T1CONbits.TMR1ON    = 1;            // Запуск таймера
}

 

Это настройка разной перферии, таймеров и портов.
 

Скомпилируем проект, Run > Build Project.
 


 

При отсутствии ошибок получим на выходе требуемую прошивку в папке *Имя проекта*\dist\default\production
 


 

Теперь надо загнать этот hex файл в контроллер. Изначально контроллер модуля прошит загрузчиком. Вот через него и загоним нашу программу.
 

Подключение модуля
 
Подключим джамперы так, чтобы соединить канал А FTDI к UART контроллера.
 


 

Заливка через бутлоадер
 
Теперь запустим оболочку AN1310ui.exe с помощью которой будем ломиться в бутлоадер:
 


 

Настроим COM порт на наш канал. У меня канал А это COM2 скорость оставляем по дефолту.
 


 

Тут все несколько неочевидно. Не знаю какой задницей думали создатели интерфейса, но это больше похоже на кривой медаплеер, сляпаный студентом в качестве лабораторной работы, а не на прогу обслуживания загрузчика. Надо войти в Boot режим.
 

Для этого. Жмем кнопку паузы. Она вдавливается.
 


 

Теперь жмем RESET на модуле. В этот момент прога шлет бутлоадеру приказ встать в ожидание.
И жмем STOP в программе. Откроется окно HEX буфером и внизу окна появятся данные бутлоадера. Версия и контроллер:
 


 

Дальше все просто, жмем открыть файл, выбираем наш хекс, что родился после компиляции. Его содержимое появится в буфере.
 



 
И жмем кнопку заливки.
 

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

К слову, там есть еще консольная версия AN1310cl.exe которой удобней пользоваться в реальных условиях, написал батник и все.
 

Работа демосервера
 
Давайте теперь зальем в модуль тестовый демосервер и достучимся к нему по сети. В сети должен быть роутер и поднят DHCP сервер. Т.к. настроено все на него. Через бутлоадер заливаем прошивку и запускаем ее. В результате начнет мигать LED3 на плате. Если конечно вы подключили джамперы на модуле. Теперь воткнем в модуль патчкорд и запустим браузер. А в адресной строке напишем http://mchpboard/ вот так вот, как есть. В результате откроется веб интерфейс сервера:
 


 

Где можно полазать по ссылочкам, потыкать в точечки в правом верхнем углу. Они отвечают за включение и выключение диодиков. Ну и, естественно, потом переделать все это под себя.
 

▌Где взять?
В моем магазинчике
 

Файлы к статье

 

60 thoughts on “Модуль PIC18F67J60 для Pinboard II”

  1. Компилятор XC8 никак не хочет компилировать TCP стэк пятой версии. Недели две назад долго мучался с ним, но результата нет. Нужен стэк 6 версии, но он не поддерживает PIC18. И с программатором pickkit2 MPLab X работать отказывается. Гугл гуглил — не помогло. С дрожащими руками начал компилировать ваш проект, но опять 100500 error… Расскажите, пожалуйста, как вам удалось скомпилировать проект?

          1. Спасибо за ответ. Да, на С18 стэк отлично компилируется. Давно его применяю для вебинтерфейса в своих продуктах. Недавно решил попробовать mplab x и xc8 и увидел, что мой проект на С18 размером 22 килобайта ХС8 компилирует в 12 килобайт. Поразившись этому чуду подкинул ему стэк и получил облом. После долгих часов переписывания кода стэка уперся в неразрешимые (для меня) проблемы. На англоязычных форумах та же беда. Ни у кого не получается. А микрочип убрал поддержку PIC18 в шестой версии стэка. Попробуйте, может у вас что-то выйдет.

            P.S.MPLAB X просто шикарен по сравнению с MPLAB IDE 8.

  2. Пару раз сталкивался с тем, что скомпилированная и прошитая бутлоадером программа не запускалась. Помогла галочка в mplabX: Project properties -> XC8 linker -> вкладка Runtime -> Format hex file for download. Что конкретно делает не разбирался, но «Controls conditioning of the Intel HEX file for use with bootloaders.» Так что теперь всегда ставлю.

    1. Спотыкается компилятор на вот этой строке:
      SYNQueue[wQueueInsertPos].wTimestamp = TickGetDiv256(); = can’t generate code for this expression
      Смотрю на неё давно и долго, что делать пока не понятно..

  3. @mozzy
    Хм, с оптимизацией надо будет сравнить на обоих компиляторах.
    Посмотрел, в исходниках последней версии библиотеки никакого упоминания о xc8 — видимо пока придется довольствоваться c18.

    Да, MPLABX хорош, тормозил бы еще поменьше (=

    @Satellite
    Пока версии обновляются, дальше что будет — непонятно.
    Почитать о новом mplabx http://www.microchip.com/pagehandler/en-us/family/mplabx/
    в разделе документация (user guide в первую очередь) (= и видео можно посмотреть.

    1. За оптимизацию ручаюсь 100%. На моём 8 ядерном core-i7 не тормозит. Подсветка синтаксиса почти идеальна. Например, сразу видно в тексте программы, какой #define сейчас будет компилироваться, а какой нет.
      При установке XC8 не разрешайте ему вносить изменения в C18 — останетесь без стэка.
      MPLABX полностью поддерживает проекты , созданные в старом MPLAB IDE.
      Большой плюс XC8 = теперь можно создавать массивы любого размера без шаманства с линковщиком. Просто объявляете массив адекватного размера и всё.
      Категорически советую устанавливать MPLABX на виртуальную машину = когда кончится 60 дней триала оптимизации, просто переустановите винду на виртуалке и снова 60 дней счастья впереди.
      Новая (шестая) версия стека, как я уже писал, не будет поддерживаться не только в C18, но и PIC18 остался за бортом. Печаль.

      1. У меня даже не то что тормозит, местами подвисает, по-крайней мере, на ноуте (i5/4gb памяти), при применении настроек проекта, например. В целом же в новых версиях «тормозов» поменьше стало, субъективно.
        А где именно не разрешать?
        Про массивы не знал, хорошо что доработали.

        Странно, что не будет, учитывая наличие pic18 *j* со встроенным ethernet.

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

  5. Классная вещь! Жаль, что редко встречаются контроллеры со встроенным Ethernet PHY, как этот. Среди ARM’ов знаю вообще всего один (одну серию) — TI Cortex M3 LM3S9B9x. Пример проекта на нём в сходном с вашим форм-факторе — http://iron.snop.ru/

      1. В стэке есть свой DHCP сервер.
        В файле TCPIPConfig.h раскомментируйте строку: #define STACK_USE_DHCP_SERVER.
        Тем же задайте нужный IP: #define MY_DEFAULT_IP_ADDR_BYTE (4 байта).
        После подключения модуля к компьютеру в адресной строке браузера наберите заданный IP.

          1. прошивку использовал из проекта который в конце статьи, вот только откомпилировать его не получается, пробовал разные компиляторы.ошибки: make[2]: *** No rule to make target `E:/Work/_Projects/Orders Active/0.DiHalt/PB_PlugIn/_Demo/SRC/Stacktst.X/_src/example/BerkeleyTCPClientDemo.c’, needed by `build/default/production/_src/example/BerkeleyTCPClientDemo.o’. Stop.
            make[1]: *** [.build-conf] Error 2
            make: *** [.build-impl] Error 2
            попробовал проект собрать с нуля подключив все файлы, компилируется долго и в конце выдает : make[2]: *** [dist/default/production/TCP.X.production.hex] Error 1
            make[1]: *** [.build-conf] Error 2
            make: *** [.build-impl] Error 2

      1. точка Х (.Х) в именах файлов говорит о применении ХС8. проверьте компилятор в свойствах проекта. также добавлю, что примеры из MLA тоже могут без напильника не компилироваться.

          1. бардака у меня нет, я эту строчку искал через Ctrl+F , скачайте архив из стать и и сами посмотрите если так уверены, эти строки находятся в файле TCPIP ETH97.h и они незакомментированы.

            1. https://www.dropbox.com/s/x1rb5h6qujodzy3/Stacktst.X.production.hex

              Прошейте бутлоадером первоначальный файл и попробуйте. У меня с роутером все работало на этой прошивке отлично. Собственно она и была прошита изначально. IP адрес он подтянул самостоятельно, точнее ему роутер что то там назначил. Схема сети у меня похожа на вашу. Стоит роутер, а от него все втыкается в свитч.

          2. В том-то и дело, что проект работает на компе у А-10. У нас он не компилируется. Я года 1,5 назад допилил для себя оригинальный проект от Микрочипа, которым до сих пор пользуюсь.

    1. Вот на DSL2500 должен работать DHCP сервер который присвоит модулю некий IP адрес после чего все заведется. По крайней мере если он мигает лампочкой, то я его проверял лично и у меня страничка открывалась :)

      1. Если диодики моргают, но сервера не видно, то возможно:
        1. в этой локальной сети нет активного DHCP сервера и ваша плата не получила IP адрес.
        2. вы ищите сервер по неправильному адресу

        Я посмотрел конфиг вашего сервера — плату можно найти по net bios name,
        набрав в адресной строке браузера MCHPBOARD.

        В файле TCPIP ETH97.h :
        закомментируйте строку: #define STACK_USE_AUTO_IP

        исправьте строки:
        #define MY_DEFAULT_IP_ADDR_BYTE1 (169ul)
        #define MY_DEFAULT_IP_ADDR_BYTE2 (254ul)
        #define MY_DEFAULT_IP_ADDR_BYTE3 (1ul)
        #define MY_DEFAULT_IP_ADDR_BYTE4 (1ul)

        на (например):
        #define MY_DEFAULT_IP_ADDR_BYTE1 (192ul)
        #define MY_DEFAULT_IP_ADDR_BYTE2 (168ul)
        #define MY_DEFAULT_IP_ADDR_BYTE3 (0ul)
        #define MY_DEFAULT_IP_ADDR_BYTE4 (10ul)

        и после перекомпиляции проекта ищите плату по адресу 192.168.0.10

          1. я вам ОЧЕНЬ сильно рекомендую начинать эксперименты с прямого соединения платы и компьютера патч-кордом. потом и до роутера доберётесь. я так начинал чтобы вкурить, как оно работает. сейчас через интернет коммутирую без проблем.

  6. Доброго времени суток. Уже 2 недели мучаю эту плату, сначала не удалось запустить эзернет-стек, щас выяснил, что даже при выполнении примеров, поставляемых с компилятором C18, чип останавливается через несколько миллисекунд и не перезапускается. Сторожевой таймер выключен. Программатор — PICkit2, прошивка заливается вроде нормально, по крайней мере ошибок не выдает и проверку записанного проходит.
    Что может быть?

      1. Вроде разобрался. Как оказалось, в примере в папке компилятора плата не вешалась, а слишком быстро выходила из задержки :
        void delay (void)
        {
        int i;
        for (i = 0; i < 10000; i++)
        ;
        }
        пришлось заменить int на long, иначе через несколько циклов вываливалось из функции.
        Также долго упирался стек, структура TLB никак не лезла, пришлось править скрипт линкера.

Добавить комментарий