Программирование микроконтроллеров PIC16/PIC18 на языке C. Статья вторая. Базовые сведения о платформе. Первая программа

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

    Едем дальше.

    Как я говорил ранее, пока что объяснять буду на базе МК PIC16F628A.
    Обязательно качаем документацию на него. Рекомендую для поиска — alldatasheet.com
    DataSheet — главный документ при разработке на базе МК.
    Рекомендую распечатывать основные таблицы и разделы для удобства пользования.

    Открываем ДШ.

    Наиболее важные сведения о кристалле:
    — максимальная рабочая частота — 20МГц;
    — 2048х14 бит флеш-ПЗУ;
    — 224 байта статической ОЗУ;
    — 128 байт энергонезависимой ПЗУ;
    — 16 доступных выводов;
    — модуль приемо-передатчика;
    — 3 таймера.

    Данный кристалл — представитель так называемого среднего (Mid-range) семейства МК PIC.

    Вкратце расскажу о том, что обязательно нужно понимать.



    Память данных устройства разделена на 4 банка.
    Банки содержат регистры специального назначения(SFR) и регистры общего назначения(GPR).
    SFR — используются для управления устройством и его модулями.
    Регистры обшего назначения представлены в виде статической ОЗУ, где мы можем хранить свои переменные.
    Специальные регистры занимают по 32 начальные позиции в каждом банке.
    В ДШ на страницах 18-21 показаны все регистры специального назначения. Распечатайте их — пригодится и не раз.

    Это довольно таки объемная тема, и пропускать ее никак нельзя.
    А с другой стороны нудноватая и неинтересная.
    Пробуйте переосилить себя и прочитать об организации памяти и регистрах специального назначения в ДШ и у Шпака(упоминал в первой статье).

    Порты ввода/вывода.

    У данного устройства два порта: PORTA и PORTB.
    Каждый вывод порта может использоваться непосредственно как простой вывод либо как вывод прочих модулей МК.
    В самом начале ДШ вы должны были заметить что каждый вывод помимо основного названия, к примеру RB1, содержит еще и другое наименование RX и DT.
    Вот здесь RX и есть второстепенная функция вывода — как вход приемо-передатчика.
    Но пока мы не будем трогать периферийные модули устройства.

    Каждый вывод порта может функционировать как вход или как выход.
    Например, если нам нужно зажечь светодиод то вывод, к которому он подключен мы конфигурируем как выход, и выставляем на нем соответствующий уровень.
    А вот если нам нужно подключить кнопку к порту и считывать факт нажатия, то здесь уже необходимо конфигурировать этот вывод как вход.
    Конфигурация вход/выход осуществляется с помощью регистров TRIS.
    Если в соответствующий бит регистра TRIS записать 1 то этот вывод станет входом, если 0 — выходом(видимо в связи с схожестью 1 и Input, а 0 и Output)
    К примеру:
    TRISA = 0; // Все выводы порта А - выходы
    TRISB = 0xff; // Все выводы порта B - входы
    TRISA5 = 1; // 5 вывод порта А - вход. Кстати не у всех компиляторов можно обращаться к каждому выводу непосредственно

    Имена регистров можно посмотреть в папке «Папка HT-PICC\include» для соответствующего контроллера.

    Для установления определенного уровня на выводе используем регистр PORT.
    К примеру:
    PORTA = 0; // Все выводы порта А с низким уровнем
    PORTB = 0xff; // Все выводы порта B с высоким уровнем
    RB5 = 1; // На пятом выводе порта B высокий уровень

    Так. Достигаем момента когда неоходимо сделать отступление собственно по языку C.
    Наверное напишу здесь небольшой пример. Скомпилируем. Запустим в Proteus, а о базовом языке C напишу в следующей статье.

    Напишем небольшую программку. Помигаем светодиодом.
    Пользуемся ранее созданным проектом, либо создаем новый, по схеме из первой статьи.

    Для начала подключим файл заголовков.

    #include <pic.h>

    Мы не выбираем конкретную модель, а указываем pic.h. Если открыть его то увидим скрипт выбора конкретного файла исходя из выбранного устройства при создании проекта.

    Далее нам нужно инициализировать наши порты.
    Создаем основную функцию программы:
    void main(void)
    {
    while(1);
    }

    Пишем в ее начале:
    TRISA = 0; // Порт А - все выводы выходы
    PORTA = 0; // с логическим нулем
    TRISB = 0; // Порт B - все выводы выходы
    PORTB = 0; // С логическим нулем

    Пойдем в «Папка HT-PICC\samples\delay».
    Скопируем оттуда delay.c и delay.h и вставим их в папку проекта.

    Добавим строку в начале:
    #include «delay.c»
    Мы будем использовать функцию DelayMs(x) для создания паузы между переключениями светодиода.

    Допустим светодиод подключен к RB0.
    Для его переключения будет использоваться логическое исключающее «ИЛИ»:
    RB0 ^= 1;

    В итоге код принимает вид:

    #include <pic.h>
    #include "delay.c"

    void main(void)
    {
    TRISA = 0;
    PORTA = 0;
    TRISB = 0;
    PORTB = 0;

    while(1)
    {
    DelayMs(250); // Сделаем паузу в полсекунды
    DelayMs(250);
    RB0 ^= 1; // инвертируем вывод
    }
    }

    image

    Прошивка готова.
    Теперь настроим конфигурационные биты.
    Жмем Configure -> Configuration bits.
    Снимаем галку «Configuration Bits set in code», так как в коде мы ничего не выставляли.

    Видим несколько пунктов.
    Выставляем как на скрине.
    Oscillator — HS — в качестве тактового генератора будет использоваться высокочастотный кварцевый резонатор.
    WatchDog Timer — Off, если включить, то микроконтроллер будет периодически сбрасываться во избежание каких-либо зависаний. Нам такая возможность пока не нужна.
    Power Up Timer — Enabled, МК будет находится в состоянии сброса, пока напряжение питания не достигнет необходимого порогового уровня.
    Brown Out Detect — On, сброс МК, если произошло падение питающего напряжения ниже определенного уровня.
    Low Voltage Program — Disabled, запрещаем использовать низковольтное внутрисхемное программирование МК. Здесь уже зависит от Вашего программатора.
    Data EE Read Protect — Off, разрешаем чтение данных и EEPROM памяти МК.
    Code Protect — Off, отключаем защиту кода в МК. Если выставить On — то невозможно будет считать программу из МК. Нам пока такая возможность не нужна.

    image

    Еще раз жмем F10.
    Закрываем.

    Прогоним программу в Proteus.
    Запускаем Proteus ISIS.
    Находясь в разделе Component mode жмем Pick from libraries и, пользуясь поиском, добавляем на форму компоненты:
    — PIC16F628A;
    — LED-RED;
    — RES;

    Два раза кликаем на каждом из них и выставляем параметры.
    Для МК — выбираем файл прошивки *.hex из папки нашего проекта, и выставляем частоту 4МГц.
    Для LED-RED выбираем Model type — Digital.
    Для резистора выбираем сопротивление в 300 Ом.
    Добавляем на форму Ground в разделе Terminals mode и соединияем как на скрине.
    image
    Жмем Play — светодиод должен мигать.

    В следующей статье плотно пройдусь по языку C.
    Вслед за ней будет статья по периферии контроллера и примеры кода для нее.
    И за ней планирую рассказать о USB и PIC 18.
    Вот такой план пока:-)
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 16
      0
      Совет: ваш код вкладывайте еще в тэг blockquote тогда будет красивее смотретья, ну и еще подсветку синтаксиса неплохо бы сделать.
        0
        Спасибо автору за усердие — очень познавательно!
          0
          жаль, что об Proteus ISIS я узнал только из этой статьи, а не от профессора в университете.
            0
            у крякнутого протеуса порой бывают довольно неприятные глюки, но в целом система довольно мощная. а если писать на асме, а не на си, то возможности отладки становятся еще больше. для AVR по крайней мере, насчет пиков не знаю, не работал
            0
            отличная статья. ждём продолжения
              0
              Всё таки правильнее документацию брать из первоисточника, в данном случае — с сайта производителя. Ведь кроме основного документа на контроллер, там можно найти всевозможные руководства, примеры программ, библиотеки, в общем, всё-всё-всё, что есть у производителя для данного устройства. В общем вы получите более полную картину об устройстве и работе с ним.
                0
                Позволю себе отойти немного в сторону, то есть оффтоп.
                Автору спасибо за поднятие темы контроллеров из забвения. Ну не то что бы из забвения, но пыль стряхнули.
                Те площадки которые есть сейчас, очень слабые с точки зрения работы с сообществом — в основном, это форумы «вопрос-ответ», где трутся большие жирные тролли, а зачастую и просто хамы. Там можно получить ответ на конкретный вопрос, но почитать статьи и пообсуждать их, как на Хабре, не получается. Другой вариант — площадки больше для любителей, чем для профессионалов — в основном вводные курсы.
                Наверное где-то есть толковые блоггеры по данной тематике — не поделитесь ссылочками?
                Думаю, когда-нибудь и я смогу внести посильную лепту в строительство достойного профессионального сообщества электронщиков на Хабре. Пока мало опыта, что бы им делиться и моё место — в комментах.
                  0
                  Насчет блогов по пик не знаю. Встречал в свое время очень хорошие блоги по АВР.
                  Но тем не менее связку:
                  Ю.А. Шпак «Программирование на языке Си для AVR и PIC микроконтроллеров»
                  +Керниган, Ричи. Язык C
                  +http://electronix.ru/forum/
                  +знание английского языка
                  считаю более продуктивной.
                    0
                    Блоги были упомянуты в надежде, что там профессионалы будут делиться своим опытом, а не как основной метод обучения. Для обучения действительно больше подходят основополагающие книги, как упомянутая книга Кернигана и Ритчи или «Язык программирования C++» Страуструпа. Хотя C++ может казаться излишеством для контроллеров, но, начиная с определённого уровня сложности абстрактного представления проекта, мне кажется уместным использование некоторых возможностей C++. Английский действительно необходим, иначе вы оказываетесь в ограниченной области книжек и интернет-ресурсов на родном языке. Всё таки английский — язык для межнационального общения, в том числе и профессионального.
                    Вот например тема для обсуждения в профессиональном сообществе: каков сейчас баланс в использовании ассемблера, Си, С++ и других языков для различных проектор различных типов и масштабов. Где в русскоязычном и англоязычном интернете можно поговорить на эту тему? Мне не достаточно общения с коллегой, который является прекрасным знатоком ассемблера, но дальше по лестнице абстракции, в силу возраста и объёма проектов, уже не поднимается.
                    Электроникс я считаю форумом «вопрос-ответ» на тот случай, если крепко застрял на какой-то конкретной проблеме, так как есть грамотные люди. Но не менее насущные абстрактные вопросы там сложно обсуждать, так там нет культуры сообщества, которая не позволила ты утонуть в болоте из троллей и хамов.
                      0
                      У вас ссылочки не сохранились на хорошие блоги, сообщества, ленты новостей для электронщиков?
                      +1
                      www.easyelectronics.ru — отличный сайт, если что, автор его, DIHALT, есть на хабре
                        +1
                        Отличный блог, спасибо dihalt'у за труды, но в основном рассчитан на начинающих. Кроме того, манера повествования несколько напрягает.
                      0
                      хм… скриншоты лучше делать без ненавязчивой рекламы таскбара Win7 (Alt+PrtScr).

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

                      Для меня в свое время именно это ощущение, что ты, еще не особо зная устройство этого кристалла, можешь, основываясь лишь на интуиции, набрать несколько строчек на своем привычном Си, зашить программу в кристалл и вот твоя программа моргает НАСТОЯЩЕЙ лампочкой; ощущение что ты наконец сделал что-то материальное и видишь результат своей работы, явилось определяющим для перехода к железному кодингу =)
                        0
                        Насчет скриншотов учту.

                        Обдумывая этот цикл статей, я решил что не буду углубляться в процесс разводки, травления, лужения, монтажа. Все-таки я делаю упор на программировании.
                        Кто-то не может позволить себе плату/программатор, кто-то не хочет покупать, кто-то не умеет паять, кто-то не хочет паять. Да и это очень обширная тема, возможно даже обширнее чем само программирование, и здесь уже как каждому удобнее так и поступит. Благо схем в сети и плат в магазинах более чем достаточно.
                          0
                          да, я так и понял вашу позицию. просто когда сам понимаешь что при помощи достаточно простых действий можно сделать множество полезных изделий — повышается мотивация к изучению. А так я думаю стороннему человеку не совсем понятно, что такого крутого в мигании лампочкой в симуляторе.

                          нет, не поймите неправильно, идея и цикл статей замечательные, только не всех это может завлечь так, как создание девайсины под свои реальные нужды! К тому же в паре абзацев можно уместить что нужно купить: такую-то дев-плату, и такой-то программатор. Если нужно сегодня и сейчас, то за 3 тысячи я думаю (просто не знаю как там для PIC. для авр стартовый комплект подешевле обойдется) вполне можно это купить в любой розничной сети радиоэлектронники, плюс программатор пригодится потом и на всех других проектах. Если время не так важно, то можно заказать на e-bay или у самих разработчиков дев плат, напри мер olimex будет ещё дешевле.

                          Буквально пару абзацев, дальше заинтересованный человек сам все нагуглит, зато на новый год он сможет сделать свою собственную гирлянду для елки, с музыкой и закачкой музыки с SD карты или по сети ;-)
                        0
                        Завтра выложу небольшую статью по аппаратной части процесса.

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

                        Самое читаемое