Язык си для микроконтроллеров pic

Язык си для микроконтроллеров pic

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

Я могу предложить хорошо зарекомендовавший себя МК PIC16F877. Он включает в себя практически все мыслимые и немыслимые интерфейсы и технологии (за исключением, пожалуй, только USB) и очень неплох по рабочим характеристикам:

  • тактовая частота — 20 МГц
  • 4 полноценных 8-ми битных порта ввода/вывода
  • последовательный и паралельный порт
  • шина I2C
  • несколько таймеров
  • модули сравнения, компараторы
  • модуль широтно-импульсной модуляции (ШИМ)
  • 10-ти разрядный АЦП

МК этот широко распространенный и в розничной продаже встречается часто. Если Вы в г.Москве, то Вам дорога в "Чип и Дип" — там его можно приобрести примерно за 350 руб. Настоятельно рекомендую покупать его в DIP корпусе (широком), благо такой есть. Для начальных опытов и проверок это самый лучший вариант. Если Вы вдруг приобретете его в корпусе PLCC, то будет целая куча проблем с его использованием — шаг плоских выводов в 1.27 мм не самый удобный вариант.

Итак, с МК определились. В файлах к этой статье можно найти полный справочник по этому МК. Что покупать теперь понятно, но пока дайвайте все же напишем программу, что бы было понятно что с ней дальше делать и как ее "зашить" в этот МК.

Запускаем программу MPLAB (которую установили в прошлых статьях). Выбираем пункт меню Project -> Project Wizard. В открывшемся окне нажимаем Далее.

В выпавшем списке доступных МК выбираем PIC16F877. Нажимаем Далее.

Здесь надо выбрать компилятор, который будет обрабатывать код нашей программы. Обязательно надо выбрать пункт HI-TECH PICC Toolsuite в выпадающем списке Active Toolsuite. Это тот самый компилятор языка Си, который мы установили в прошлой стаье. Нажимаем Далее.

Задайте имя проекта, например, TestPIC и укажите директорию проекта. Тут есть две хитрости. Первое, MPLAB не создают сам отдельную папку для проекта и разместит все файлы прямо в той директории которую Вы указали. Второе и пожалуй, самое главное — MPLAB не понимает русских букв в названии пути. Проект то он создаст, но во время работы программы, особенно при сохранении и открытии файлов, возникнут такие "глюки" что долго будете голову ломать в чем дело. Поэтому, в пути к папке проекта не должны попадаться русские названия. Нажимаем Далее.

Здесь можно добавить к проекту какие-либо готовые файлы, но нам пока такая возможность не нужна. Жмем Далее.

Тут я думаю все понятно. Нажимаем Готово.

Заготовку проекта сделали, но он пока пустой. Нажимаем File -> New. Появится новое окно с заголовком Untitled. Далее выбираем File -> Save As. . Укажите имя файла, например, TestPIC.c и перейдите в папку проекта. Обязательно поставьте галочку Add File to Project.

Теперь помещаем ниже следующий код в открытое окно файла проекта TestPIC.c (весь проект целиком можно найти в файлах к этой статье).

Наверное Вам интересно, что будет результатом работы этого кода. Будет происходить следующее: к МК подключаются 8 светодиодов. При включении питания, светодиоды начнут мигать в виде "волны" (это лучше видеть, благо осталось нет так уж и много). Рассмотрим поподробнее сам код.

Вначале идет думаю всем знакомый оператор include, который подключает заголовочный файл со всеми неоходимыми макроопределениями. Далее идет еще одна директива препроцессора __CONFIG, в которую предается 16-ти ричное число, характерезующие набор специальных опций и свойств, характерезующих работу МК. Мы еще в ходе этой статьи вернемся к этому моменту. Переходим сразу к началу функции main() — точки входа в собственно сам исполняемый код программы. Далее следует операция с каким-то T0IE. Конктерно эта строчка означает, что необходимо запретить прерывания от таймера при работе МК. TOIE — это определенный с помощью #define в файле pic.h адрес специального регистра, отвечающего за эту операцию (и вообще, если видете в коде странные до этого в коде не определенные переменные записанные в верхнем регистре, то это наверняка символические имена регистров МК). Строчка GIE=0; — запрещает обработку любых прерываний глобально во всем МК. Прерывания для нашего простого примера мы использовать не будем, т.к. они нам просто не нужны.

TRISB=0; — означает, что порт ввода/вывода B МК PIC16F877 будет работать на выход, т.е. к нему можно теперь подключать нагрузку, на которой можно подвать из МК 0 или +5В (этой нагрузкой будут светодиоды). В следующей строке мы помещаем в порт B число 0 — т.е. на всех выводах этого порта, настроенного на выход, будет нулевое напряжение. Далее идет конструкция из оператора while, причем с таким параметром, что некоторые программисты, привыкшие писать на Си для ПК будут слегка удивлены — так ведь это, мол, бесконечный цикл, программа зависнет. Но нам именно этого и надо. МК не может ни чего не делать, он должен постоянно что-то выпонять. Поэтому, для МК работа программы в бесконечном цикле это жизненная необходимость. Затем идет оператор увелечения на 1 числа находящегося в порту B. Немного поясним. Если написать PORTB=0xFF; — то на всех выводах порта будет 1. Если PORTB=0x0; — на всех 0. (я думаю, это должно быть понятно). Конструкция из оператора цикла for, как видно, не делает какой-либо "умной" работы не делает и нужна только для организации временной задержки. Если этот участок кода убрать, то мы просто не будем замечать как меняется напряжение на светодиодах (будет очень быстро).

В кратце код разобрали, двигаемся дальше. Вернемся к директиве __CONFIG. Откройте Configure -> Configuration Bits. . Вот тут как раз надо установить для проекта значения этих самых опций. Установите их так как на фото ниже.

Что они означают? Давайте по порядку.

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

Пора откомпилировать код. Запустите Project -> Build All. При этом начнется компиляция проекта и появится вот такое окно с чудной записью в конце BUILD SUCCEEDED.

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

Я могу предложить хорошо зарекомендовавший себя МК PIC16F877. Он включает в себя практически все мыслимые и немыслимые интерфейсы и технологии (за исключением, пожалуй, только USB) и очень неплох по рабочим характеристикам:

  • тактовая частота — 20 МГц
  • 4 полноценных 8-ми битных порта ввода/вывода
  • последовательный и паралельный порт
  • шина I2C
  • несколько таймеров
  • модули сравнения, компараторы
  • модуль широтно-импульсной модуляции (ШИМ)
  • 10-ти разрядный АЦП

МК этот широко распространенный и в розничной продаже встречается часто. Если Вы в г.Москве, то Вам дорога в "Чип и Дип" — там его можно приобрести примерно за 350 руб. Настоятельно рекомендую покупать его в DIP корпусе (широком), благо такой есть. Для начальных опытов и проверок это самый лучший вариант. Если Вы вдруг приобретете его в корпусе PLCC, то будет целая куча проблем с его использованием — шаг плоских выводов в 1.27 мм не самый удобный вариант.

Итак, с МК определились. В файлах к этой статье можно найти полный справочник по этому МК. Что покупать теперь понятно, но пока дайвайте все же напишем программу, что бы было понятно что с ней дальше делать и как ее "зашить" в этот МК.

Запускаем программу MPLAB (которую установили в прошлых статьях). Выбираем пункт меню Project -> Project Wizard. В открывшемся окне нажимаем Далее.

В выпавшем списке доступных МК выбираем PIC16F877. Нажимаем Далее.

Здесь надо выбрать компилятор, который будет обрабатывать код нашей программы. Обязательно надо выбрать пункт HI-TECH PICC Toolsuite в выпадающем списке Active Toolsuite. Это тот самый компилятор языка Си, который мы установили в прошлой стаье. Нажимаем Далее.

Задайте имя проекта, например, TestPIC и укажите директорию проекта. Тут есть две хитрости. Первое, MPLAB не создают сам отдельную папку для проекта и разместит все файлы прямо в той директории которую Вы указали. Второе и пожалуй, самое главное — MPLAB не понимает русских букв в названии пути. Проект то он создаст, но во время работы программы, особенно при сохранении и открытии файлов, возникнут такие "глюки" что долго будете голову ломать в чем дело. Поэтому, в пути к папке проекта не должны попадаться русские названия. Нажимаем Далее.

Здесь можно добавить к проекту какие-либо готовые файлы, но нам пока такая возможность не нужна. Жмем Далее.

Тут я думаю все понятно. Нажимаем Готово.

Заготовку проекта сделали, но он пока пустой. Нажимаем File -> New. Появится новое окно с заголовком Untitled. Далее выбираем File -> Save As. . Укажите имя файла, например, TestPIC.c и перейдите в папку проекта. Обязательно поставьте галочку Add File to Project.

Теперь помещаем ниже следующий код в открытое окно файла проекта TestPIC.c (весь проект целиком можно найти в файлах к этой статье).

Наверное Вам интересно, что будет результатом работы этого кода. Будет происходить следующее: к МК подключаются 8 светодиодов. При включении питания, светодиоды начнут мигать в виде "волны" (это лучше видеть, благо осталось нет так уж и много). Рассмотрим поподробнее сам код.

Вначале идет думаю всем знакомый оператор include, который подключает заголовочный файл со всеми неоходимыми макроопределениями. Далее идет еще одна директива препроцессора __CONFIG, в которую предается 16-ти ричное число, характерезующие набор специальных опций и свойств, характерезующих работу МК. Мы еще в ходе этой статьи вернемся к этому моменту. Переходим сразу к началу функции main() — точки входа в собственно сам исполняемый код программы. Далее следует операция с каким-то T0IE. Конктерно эта строчка означает, что необходимо запретить прерывания от таймера при работе МК. TOIE — это определенный с помощью #define в файле pic.h адрес специального регистра, отвечающего за эту операцию (и вообще, если видете в коде странные до этого в коде не определенные переменные записанные в верхнем регистре, то это наверняка символические имена регистров МК). Строчка GIE=0; — запрещает обработку любых прерываний глобально во всем МК. Прерывания для нашего простого примера мы использовать не будем, т.к. они нам просто не нужны.

TRISB=0; — означает, что порт ввода/вывода B МК PIC16F877 будет работать на выход, т.е. к нему можно теперь подключать нагрузку, на которой можно подвать из МК 0 или +5В (этой нагрузкой будут светодиоды). В следующей строке мы помещаем в порт B число 0 — т.е. на всех выводах этого порта, настроенного на выход, будет нулевое напряжение. Далее идет конструкция из оператора while, причем с таким параметром, что некоторые программисты, привыкшие писать на Си для ПК будут слегка удивлены — так ведь это, мол, бесконечный цикл, программа зависнет. Но нам именно этого и надо. МК не может ни чего не делать, он должен постоянно что-то выпонять. Поэтому, для МК работа программы в бесконечном цикле это жизненная необходимость. Затем идет оператор увелечения на 1 числа находящегося в порту B. Немного поясним. Если написать PORTB=0xFF; — то на всех выводах порта будет 1. Если PORTB=0x0; — на всех 0. (я думаю, это должно быть понятно). Конструкция из оператора цикла for, как видно, не делает какой-либо "умной" работы не делает и нужна только для организации временной задержки. Если этот участок кода убрать, то мы просто не будем замечать как меняется напряжение на светодиодах (будет очень быстро).

В кратце код разобрали, двигаемся дальше. Вернемся к директиве __CONFIG. Откройте Configure -> Configuration Bits. . Вот тут как раз надо установить для проекта значения этих самых опций. Установите их так как на фото ниже.

Что они означают? Давайте по порядку.

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

Пора откомпилировать код. Запустите Project -> Build All. При этом начнется компиляция проекта и появится вот такое окно с чудной записью в конце BUILD SUCCEEDED.

Я ни раз задавал сам себе вопрос, с какого бы языка начинать изучение. Твёрдо отвечаю – Си, т.к. в ассме много рутины и условностей, что лишает творчества. Постоянно надо проверять и перепроверять себя, а не забыл ли ты то или иное действие. В ассме есть свои неоспоримые преимущества, но о них потом, т.к. это почувствовать можно только на практике. C языком определились. Реально Си учить не надо. Я вам так скажу – мой Си это условно десять пазлов и море логики, которые я комбинирую. Можно ничего не знать, важно понимать механизм, т.е. что на что влияет и к чему приводит. Это как игра в тетрис в котором нужно лишь крутить фигуры и плотнее их ставить. Если вы играли в тетрис (не уверен что вы знаете эту игру), то вы легко поймете что такое Си.

Далее о макете (макетной плате). И на эту тему мне задавали вопрос. И пришел к выводу, что человеку, который не первый день в электронике делать какую-то плату или платку с кнопками и светодиодами не интересно. Школьнику мигалка, пищалка и кнопка будут интересны. Но не взрослому человеку. Тем более всё это можно сделать в Протеусе. Протеус изучается за 30 мин. Тогда вы меня спрашиваете, а что же сделать? Сделать практическое устройство по которому у вас будет цель – цель доделать это устройство до конца. Это самый главный психологический стимул.

Из каких компонентов должно быть устройство? Несколько кнопок (хоть десяток), семисегментные индикаторы 2-5 разрядов, микроконтроллер PIC16F628A (или без А) (на этом микроконтроллере можно много фантазировать), ну и оставить 1-2-3 свободные линии, чтобы что-то внешнее подключить или управлять. У меня всё начинается с идеи и вопроса что собрать и подключить к МК, и сразу думаю, а как это будет подключаться к МК и может ли работать такое подключение. Ну и собственно процесс рисования печатной платы идет в параллели. Необходимо знать и учитывать при рисовании, что не все ножки одинаково работают. И именно это важное начальное условие расписывается в самоучителе с самого начала.

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

Что в итоге вы получите?
1) Понимание как, что и с чем соединять.
2) Как управляются эти соединения на элементарном уровне.
3) Начнете привыкать к интерфейсу среды разработки.
4) Начнете изучать структуру текста программы.
5) Начнете понимать механизм работы программы.

Важное условие – вдумчиво читать подряд. Вдумчиво и подряд. Возможно перечитывать.
Мир вам.

Ссылка на основную публикацию
Шампанское шато тамань брют отзывы
Производитель: ООО «Кубань-Вино» Сбор винограда: 2016 Происхождение: Краснодарский край, Россия Сорт винограда: Шардоне, Рислинг и иные белые На отзыве у...
Что означает ошибка 110
Ошибка 110 в Android происходит главным образом при обновлении или установке приложений из Google Play. Случается это из-за несовместимости ОС:...
Что означает ошибка 963
Ошибки в Google Play дело достаточно частое, это не удивительно, ведь Плей маркет – это один из крупнейших магазинов приложений....
Шапка для твиттера 1500х500
Please complete the security check to access www.canva.com Why do I have to complete a CAPTCHA? Completing the CAPTCHA proves...