Программирование PIC на С (CCS PIC-C Compiler)

PIC
Давайте напишем для микроконтроллера PIC12F629 классическую «стартовую» программу – мигание светодиодом по нажатию кнопки. В качестве компилятора применим CCS PIC-C Compiler. Я использую версию 4.108, все скриншоты представлены с нее. Для тестирования программы использован ISIS Proteus 7.5.
Схема для данного примера выглядит так:

Схема для проекта

Запускаем программу.
Самый простой и быстрый способ начать написание первой программы – использовать мастер создания проектов. Для этого переходим на вкладку меню Project на ней щелкаем по значку PIC Wizard.

Меню Project

Вначале запустится диалог сохранения проекта, в котором Вам предстоит указать место сохранения и имя создаваемого проекта. Назовем проект led_c. Далее запустится сам мастер создания проекта. При запуске мы попадаем в подменю General.

Меню General

Здесь на вкладке Options изменим некоторые свойства.
В списке Device выберем тип нашего котроллера PIC12F629.
Напротив, в окошке Oscillator Frequency укажем частоту тактового генератора в Гц. В нашем проекте мы будем использовать внутренний тактовый RC генератор, частота которого 4 Мгц.
В блоке Fuses в списке выберем тип тактового генератора или источник тактовых импульсов, Internal RC Osc, no CLKOUT, этим мы и определили использование внутреннего тактового RC генератора. (no CLKOUT означает, что «наружу», из микроконтроллера, тактовый сигнал не будет выводится).
И последнее, что сделаем, уберем галочку напротив Master Clear pin enabled, этим мы ножку сброса освободили от своей «обязанности», задействовав схему внутреннего сброса. А освободившуюся ножку можно будет, в случае необходимости, использовать для наших нужд.
На вкладке Code можно посмотреть код созданный мастером.
Все, пока больше ничего не трогаем, нажимаем ОК, мастер завершит работу, создав наш проект, готовый для написания программы.
Возвращаемся в компилятор и на вкладке меню Project выбираем значок Project и в открывшемся диалоге указываем на созданный нами проект lcd_c. Откроется файл исходного кода нашего проекта, созданный мастером. Посмотрим, что в нем:

#include "D:\Tech\Project\test\1\led_c.h" 

void main() 
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC);
   setup_vref(FALSE); 

   // TODO: USER CODE!! 
}

В самой первой строке указывается файл led_c.h, в котором мастер прописал указанные нами настройки конфигурации микроконтроллера, его рассмотрим ниже.
Далее следует —
void main()
{

}

— так указывается начало программы, код самой программы размещается между двумя фигурными скобками.
Следующие 5 строк описывают настройки по умолчанию, в данном примере они нас не интересуют если смущают, их можно убрать, т.к. в контроллере после сброса они выставятся автоматически в такое состояние.
// TODO: USER CODE!! — здесь нам предлагают вписать код нашей программы.

Рассмотрим файл led_c.h. Он находится в папке, куда мы сохранили проект. Откроем его стандартным блокнотом.

#include <12F629.h>

#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES INTRC_IO              	//Internal RC Osc, no CLKOUT
#FUSES NOCPD                 	//No EE protection
#FUSES NOPROTECT             	//Code not protected from reading
#FUSES NOMCLR                	//Master Clear pin used for I/O
#FUSES NOPUT                 	//No Power Up Timer
#FUSES BROWNOUT              	//Reset when brownout detected
#FUSES RESERVED              	//Used to set the reserved FUSE bits
	Reserved

#use delay(clock=4000000)

Мы видим код, настройки конфигурации контроллера, который мы могли видеть при работе с мастером создания проектов, на вкладке Code, подменю General. Также здесь подключается файл 12F629.h, в котором для компилятора прописаны доступные в этом контроллере функции. Строка #use delay(clock=4000000) — указывает частоту тактовых импульсов, что важно для формирования временных задержек, если таковые потребуются в программе. Удалим строки


#FUSES RESERVED              	//Used to set the reserved FUSE bits
	Reserved

т.к. они могут вызвать сбой при компиляции программы. Закроем блокнот, сохранив файл.
Давайте впишем код нашей прогаммы там, где нам предлагали это сделать. Наша программа должна выполнять мигание светодиодом, пока не нажата кнопка. Кнопку нажали — не мигаем, отпустили — мигаем. Код следующий:


while(1)  
       {   
        while(input(PIN_A0))     
         {   
          output_high(PIN_A1);   
          delay_ms(500);         
          output_low(PIN_A1);  
          delay_ms(500);                
         }   
        output_low(PIN_A1);     
       }   

Рассмотрим как работает программа и код подробнее:
while(1)
{

}

— таким образом организуется «вечный» цикл, программа будет «крутиться» внутри него пока что-либо не остановит ее (например — разряд батареи). В скобках указывается условие нахождения в цикле.
while(input(PIN_A0))
{

}

— еще один цикл, только он будет длиться пока не нажата кнопка, т.е. на входе котроллера A0 (по ДШ – GP0) будет лог. 1. Команда input(PIN_A0) считывает состояние указываеммой ножки, автоматически переводя ее в режим ввода.
output_high(PIN_A1);
delay_ms(500);
output_low(PIN_A1);
delay_ms(500);

— эти 4 строчки обеспечивают мигание светодиода. В первой строчке output_high(PIN_A1) команда на указываемую ножку выводит лог. 1(high), зажигаем диод. Далее следует задержкав мс, число мс указанно в скобках. Если нужна задержка в с или мкс то будет delay_s или delay_us соответственно. Оставшиеся 2 строчки кода аналогичны — гасим диод, делаем задержку.
output_low(PIN_A1);
— эта комманда гасит светодиод, устанавливая на ножке А1 лог. 0 (low).
В цлом, прогамму можно «прочитать» так: в «вечном цикле (while(1)) делается следующее: если на входе (ножке) А0 лог. 1 работает цикл мигания (while(input(PIN_A0))), как только нарушено условие нахождения в цикле, т.е. на входе А0 станет лог. 0, мы выходим из цикла и переходим к следующей комманде — гасим светодиод. Вот так программа и будет работать. Для наглядности можно прикинуть блок-схему:



Вот собственно и все, программа готова, теперь ее можно компилировать и «зашивать».
Для компиляции переходим на вкладку меню Compile. Запуститься и тут же исчезнет окошко показывающее процесс компиляции. Внизу окна программы можно увидить отчет о компиляции – найденные ошибки и замечания к программе. Также там указано использование памяти контроллера программой.
В папке нашего проекта помимо прочих появился файл «прошивки» led_c.hex, который можно загонять в Proteus и проверять, что у нас вышло.
В прикрепленном архиве файлы программы и протеуса.
  • +4
  • 30 мая 2011, 00:38
  • Flash
  • 1
Файлы в топике: LED_C_PIC.zip

Комментарии (64)

RSS свернуть / развернуть
output_high(PIN_A1);
output_low(PIN_A1);

меня таой способ менять уровень на ножке слегка не устроил
и я дописал в стандартном заголовочном файле для пика несколько строк
пример для pic18F8520:

#bit PINE0 = 0xF8D.0
#bit PINE1 = 0xF8D.1
#bit PINE2 = 0xF8D.2
#bit PINE3 = 0xF8D.3
#bit PINE4 = 0xF8D.4
#bit PINE5 = 0xF8D.5
#bit PINE6 = 0xF8D.6
#bit PINE7 = 0xF8D.7
#byte	PORTE = 0xF84
#byte	LATE = 0xF8D

теперь можно работать с ногами еще одним способом
типа:
PINE0=0;
PINE0=1;
i=PORTE;

адреса для доступа к ножкам можно взять из датащита на контроллер
0
Хммм, а что это за интересные слова #bit и #byte?
0
Pre-Processor Directives
в хелпе к компилятору почитай
там много интересного
0
Нету в стандарте сишного препроцессора такого. Здравствуй, забивание на стандарты)
0
странно у меня есть
у меня компилятор CCS 4.114 да и в ранних помоиму уже были такие директивы
#BIT
— Syntax:
#BIT id = x.y

Elements:
id is a valid C identifier,
x is a constant or a C variable,
y is a constant 0-7
Purpose:
A new C variable (one bit) is created and is placed in memory at byte x and bit y. This is useful to gain access in C directly to a bit in the processors special function register map. It may also be used to easily access a bit of a standard C variable.

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

вот пример из стандартного файла(из поставки компилятора)
\Program Files\PICC\Devices\18F8520.h
// Comparator Variables: C1OUT, C2OUT
// Constants used in setup_comparator() are:
#define F6_F5_F4_F5  0x70ff04
#define F6_F5_F4_F3_OUT_ON_F2_F1  0x78F903
#define F6_F5_F4_F5_OUT_ON_F2_F1  0x70F905
#define NC_NC_NC_NC  0x00ff07
#define F6_F5_F4_F3  0x78ff02
#define F6_F5_NC_NC_OUT_ON_F2  0x60FB01
#define F6_VR_F4_VR 0x50ff06
#define F5_VR_F3_VR 0x28ff0e

<b>#bit C1OUT = 0xfb4.6
#bit C2OUT = 0xfb4.7</b>

так что это уже до меня придумано создателями компилятора))))я лиш расширил
0
В Си главная фишечка в том, что сишный код в общем случае платформенно-независимый и комиляторо-независимый. Не просто так ведь стандарты сделали)

А аффтарам поделок типо этой и, скажем, сраного CVAVR я бы руки пообрывал)))
+1
к контроллерам это правило походу давно уже не относится
сколько раз напарывался когда брал чужие исходники и пытался изменить под свои нужды
особенно китайские)))))
все делают по разному
везде какието новые непонятки
так что хз хз)))
0
пы.сы.
ты в личку смотриш?)))
я написал там
0
Относится еще как. Я все свои проекты без особых затрахов таскаю между STM32, AVR и PLC1343 не перекомпиливая основую часть кода. Правлю только HAL часть.
0
а потомучто Си какой юзаешь?
GCC поди?
тогда да согласен
0
Си не бывает «какой». Бывает только Си или не Си)
0
я имел ввиду компилятор
если один и тот же компилятор то естесно будут минимальные затраты на портирование
0
Поправлю
«если компиляторы, соответствующие стандарту C, то естесно будут минимальные затраты на портирование»

Стандарт он на то и придуман, что бы писать на ЯЗЫКЕ и не думать о том, каким компилятором ты потом будешь собирать. Увы, авторам проприетарной хрени на это абсолютно наплевать — им даже удобнее, можно привязать юзеров к своему компиллеру, ибо сложно будет проекты переписывать под другой.
0
WinAVR GCC и Keil MDK ARM
0
Ну, С же не запрещает увешать язык расширениями. Тот же BCC ака билдер — компилятор, весьма хорошо реализующий стандарт. Однако ж увешан расширениями как елочка игрушками. Свистелки и перделки и все такое. Можно compiler-specific фичи не юзать. Даже на ПК код для совместимости с разными компиляторами (скажем, MSVC и GCC) напичкан дефайнами.
0
Ну в общем да, когда стандарт увешивают свистелками это ещё ладно, а вот когда начинают навешивать переделки, появляется желание оторвать руки… Например, у IAR какие-то конкретные нелады с понятием volatile…
0
да всетаки ты прав
я изза глюков CCS уже запарился
то то то другое
очень странный компилятор-скажем так он Си подобный но не чистый Си
изза этого я даже на С18 микрочипа перешел
теперь я понимаю о чем ты говорил
действительно есть Си а есть не Си)))))))))))
0
Поподробнее о глюках. В чем проявляются?
0
это скорее не глючки а особенности
не работают указатели как мне надо
нельзя передавать константу в функцию для обработки
и fprint(); ваще както по своему работает
впринципе даже круто что они замутили так с fprint();
но это не стандартное поведение заставило меня задуматься почему эта функция в другоих компиляторах не делала то чего я хотел
CCS простой-он даже лучше для понимания чем тот же С18
ну а в C18 мнея вынозило что нужно высчитывать задержки))))))
впринципе не так уж и сложно но время отняло
я то думал все также просто delay_ms(10); там например))))))
тут пришлось написать все эти функции))
ну и портировал проект в принципе быстро с минимумом изменений
и все эти директивы препроцессора CCS(которых нет с стандартном Си)
вот типа того
а про глюки на сонсивири посмотри-там постоянно они всплывают
многие не довольны как можно выпускать компилятор в масссы если он на элементарных вещах глючит
впрочим я не сталкивался с тем что там описано-я ведь не маньяк))))
0
про константы я хуйню какуюто спорол)))))
не так выразился сори)
я имел ввиду указатели на них
0
Что значит «на элементарных вещах глючит»? Компилирует код в неведомую (и неправильную) херню, как эта дрянь?

А какие еще есть компиляторы для 10, 12, 16 и 18 серий пиков, кроме CCS и HI-TECH? mikroElectronica себя уже зарекомендовала (см. ссылку).

P.S. На сонсиври рега закрыта >_<
0
вот интересная тема
www.microchip.su/showthread.php?t=8088
там в середине начинают непонятки приводить странные
0
MCC есть микрочиповский
www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en534868
Для 10,12,16 к сожалению выбор не велик. Вообще конечно жаль что микрочипы «положили» на компилятор к младшей серии =( HTCC без оптимизации городит какие goto в несколько строк, видимо дабы нажрать эти -40% кода в pro режиме…
Многие я так понял переехали на PIC18 и MCC, я вот тоже хочу попробовать.
ME радует новичков, на деле даже я, с небольшим опытом в программировании, начал замечать там какие-то «детские» недоработки.
0
ME радует новичков, на деле даже я, с небольшим опытом в программировании, начал замечать там какие-то «детские» недоработки.
Ну уж когда вызов AddTask(Timers[i].Task) не работает — это вообще капец.
HTCC без оптимизации городит какие goto в несколько строк, видимо дабы нажрать эти -40% кода в pro режиме…
Они на пару с микрочипом вконец оборзели и оторвали (почти) всю оптимизацию в бесплатной версии даже от C32 (он же GCC-MIPS, интересно, как это согласуется с опенсорсностью и требованиями GPL). Впрочем, рутрекер эту проблему решает.
А CCS похоже все же чуть лучше, чем mikroE. По большей части отказывается компилировать, как я понял, а не генерит мусор.
0
так это в ДШ лезть надо, адреса искать… лееень. Кроме того, таким образом надо будет для каждого типа контроллера заголовочный файл править.
0
вообще рекомендую взять наиболее используемые и исправить так как надо
я вот от силы 4-5 пиков юзаю
никакой сложности дописать полностью их хеадеры
зато к любому биту регистра можно обратиться легко и не принужденно
0
кстати мне мой знакомый рассказывал что даже ошибки(опечатки) находил в них
так что лезть туда всеравно придется-хотя бы ради интереса или спокойствия)))
0
да, microchip в дш частенько опечатки делает. но этот грешок свойственен почти всем производителям.
0
реквестирую схему простого программатора PIC10/12
+1
led_c.hex, который можно загонять в Proteus и проверять

Луше заливать в Proteus "*.cof" файл, тогда появится возможность трассировки программы и наблюдения за регистрами, да и памятью тоже. Отладик в Proteus сделан довольно приятно.
0
  • avatar
  • kvm
  • 30 мая 2011, 10:51
У меня Протеус сам подружился с MPLab'ом. Отлаживаюсь прямо в IDE :)
0
Спасибо, все получлось.
Вопрос, поменял тайминги на 20мс и 80мс, в протеусе перестало мигать. почему?
Еще как отключить wdt в протеусе?
0
Скорее всего, потому что протеус не совсем в реальном времени моделирует, смотрите на время внизу экрана.

WDT тоже отключается в конфигурационных битах в самом коде (в hi-tech __CONFIG(WDTDIS))
0
спасибо
наверно так и есть
а в пошаговом режиме симуляции в протеусе можно выставлять время одного шага вручную?
0
можно выставлять время одного шага вручную?
Что Вы имеете ввиду? Время выполнения одной команды? Оно имеет прямую зависимость от тактовой частоты микроконтроллера (правой кнопкой на PIC — Edit properties — Processor Clock Frequency).
0
менять временной шаг на 0.5с или 10мс, только независимо от тактовой частоты МК
0
Если только попробовать изменить вручную значение переменной. Но проще будет предусмотреть это в программе по нажатию кнопки.
0
Светодиод постоянно светится?
20 мс это 50 Гц! Мигание не будет заметно!
0
неа, 10 Гц ощий цикл(20мс горит, 80мс не горит, итого 100мс), специально так сделал
хотел посмотреть, как визуально будет будет мигать светик, только в будущей другой схемесхеме
0
Думаю нужна темка типа «PIC контроллеры с нуля»,…
где по-подробнее с отладки и схему отладчика что
по-проще и через USB кроме пикитов-2/3 конечно).
А то то блочный обзор архитектуры рассматривается,
то забыли железо и сразу ушли на компайлер.
0
А пиккит интересная штука между прочим. Открытый программатор/отладчик. Правда, довольно дорогой и я еще не все детали закупил.
0
очень нужная темка, начинаю осваиваивать пики, очень помогло бы
пиккит 2 очень даже нужно тоже подключить, в скором планирую собрать себе
0
реквестирую схему простого программатора PIC10/12
самый простой, проверренный и надежный — RCD programmer. Он работает через Com порт. Программа — WinPIC800. Если через USB — PICkit2. Быстрый, многофункциональный (есть анализатор на 3 канала), официальный. Если смущает стоимость деталей — соберите Light версию, она без микросхем памяти, а память составляет треть от всей суммы.
0
Думаю нужна темка типа «PIC контроллеры с нуля»,…
где по-подробнее с отладки и схему отладчика что
по-проще и через USB кроме пикитов-2/3 конечно).
А то то блочный обзор архитектуры рассматривается,
то забыли железо и сразу ушли на компайлер.

данная статья позиционируется не как «pic с нуля», она рассчитана на тех, кто знаком с pic, кто работал с ассемблером и хотел бы начать на С.
Может, nextos напишет что либо и для «с нуля», раз наал с архитектуры. За программатор — если через USB — только PICkit2. Лучшего нет.
0
А кит3?
0
вот кстати про лайт версию вопросов много,
много кто ругает, но всегда без аргументации.
нашел к примеру такую:
simon.derr.free.fr/site/spip/spip.php?article11



признаюсь — на большее, моей дури, наверное не хватит )
0
Об отличиях 3-го и 2-го — habrahabr.ru/blogs/personal/86527/
0
еще об 3-м и 2-м пик-китах forum.easyelectronics.ru/viewtopic.php?f=5&t=3271.
а вот упрощенная версия кит2 www.labkit.ru/html/programmators_shm?id=86
0
тоже думаю какой программатор для PIC сделать. Сам с ними не работаю, но есть много вкусных конструкций, которые хотелось бы повторить, а останавливает отсутствие программатора. Или прощще купить и не париться?
0
Если процесс сборки и изготовления не приносит удовольствия, а стоит цель — иметь программатор — тогда купить. По деньгам — собрать раза в 2-3 дешевле.
0
собрать не проблема, наверное сделаю урезанный PICKit, хочу на USB. Надо будет еще простенький программатор сделать, чтобы контроллер PICKit прошить, но это тоже не проблема. ПРоблема блин в отсутствии дома LPT и COM, буду на работе прошивать :-)
0
Если собираетесь работать со страршими пиками (в т.ч. с отладкой), то берите pk3. А так pk2 тоже хорош.
Стоят они имхо дешево в том же тритоне, особенно учитывая функционал. Я помню когда только начинал работать с МК, в магазах видел примитивные lpt-программаторы за 1к.
Вообще pk2 долгое время рулил даже в сравнении с pk3, по скорости программирования, по наличию удобного софра для прошивки. Но к сожалению он не поддерживает отладку новых устройств, в т.ч. и младших pic16f1xxx (маркетинг, сцуко..), так что если брать, то уже pk3.
0
собрать не проблема, наверное сделаю урезанный PICKit, хочу на USB. Надо будет еще простенький программатор сделать, чтобы контроллер PICKit прошить, но это тоже не проблема. ПРоблема блин в отсутствии дома LPT и COM, буду на работе прошивать :-)
Кстати, у нас такие ебанутые цены на компоненты, что и не факт что самому собрать дешевле выйдет… К примеру тинька 2313 в DIP корпусировке стоит… внимание.....150 рублей блять.
0
наверно на местном рынке у барыг на детали такие цены?
0
Почему не ищешь дистрибуторов? у меня тоже до поры, до времени была такая проблема… Нашел compel.ru, теперь можно почти все приобрети ….цены на 1 детальку не всегда адекватные но от 10 мне нравятся… Хотя щас у нас на рынке стоит тини 2313 40 руб, атмега8 55……
0
Bomond, кстати pic18f2550 не дешёвая где-то около 7 $
0
нет. у нас в городе есть только один магаз, в котором в принципе можно купить все, но они суки пользуются тем что они одни, вот и задирают цены. Конечно заказать дешевле, но бывает так, что вот надо прямо сейчас, и ждать некогда, приходится переплачивать в два-три раза.
0
да я покупаю обычно в chip-nn. Кажется все-таки купить программатор выйдет мне дешевле. Подскажите, вроде в PICKit есть что-то вроде логического анализатора… это так?
0
да, на 3 канала.
0
pickit3
cgi.ebay.com/Clone-Microchip-Development-Programmer-Mini-PICKIT-3-/230628130598?pt=LH_DefaultDomain_0&hash=item35b281ff26
цена 1000р
сам такой купил и не парюсь
все работает свистит и пердит
надо прошить пик32? без проблем
и вообще все пики даже самые новые без проблемм
0
PICkit 2 Development Programmer/Debugger Free Shipping (DB-DP004)
www.sureelectronics.net/goods.php?id=21
$24.99

PICkit 3 Development Programmer/Debugger(DB-DP005)
www.sureelectronics.net/goods.php?id=1128
$28.00
0
  • avatar
  • kvm
  • 31 мая 2011, 10:31
ну я тогоже продавца привел выше только он на ебее торгует еще))))
0
Правильно! Я просто привел ссылки на сайт самого магазина, на котором цены немного ниже. Не более того!
0
Приобрел себе самый дешевый программатор, который нашел www.aliexpress.com/item/PIC-K150-ICSP-Programmer-USB-Automatic-Programming-Develop-Microcontroller-USB-ICSP-cable/1041865968.html и признаюсь говно лютое. Коннектится раза с пятого, шьет через раз. Но, в принципе, пойдет.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.