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

Схема для данного примера выглядит так:

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

Вначале запустится диалог сохранения проекта, в котором Вам предстоит указать место сохранения и имя создаваемого проекта. Назовем проект led_c. Далее запустится сам мастер создания проекта. При запуске мы попадаем в подменю 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
output_high(PIN_A1);
output_low(PIN_A1);
меня таой способ менять уровень на ножке слегка не устроил
и я дописал в стандартном заголовочном файле для пика несколько строк
пример для pic18F8520:
теперь можно работать с ногами еще одним способом
типа:
PINE0=0;
PINE0=1;
i=PORTE;
адреса для доступа к ножкам можно взять из датащита на контроллер
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;
адреса для доступа к ножкам можно взять из датащита на контроллер
странно у меня есть
у меня компилятор 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
так что это уже до меня придумано создателями компилятора))))я лиш расширил
у меня компилятор 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>
так что это уже до меня придумано создателями компилятора))))я лиш расширил
В Си главная фишечка в том, что сишный код в общем случае платформенно-независимый и комиляторо-независимый. Не просто так ведь стандарты сделали)
А аффтарам поделок типо этой и, скажем, сраного CVAVR я бы руки пообрывал)))
А аффтарам поделок типо этой и, скажем, сраного CVAVR я бы руки пообрывал)))
к контроллерам это правило походу давно уже не относится
сколько раз напарывался когда брал чужие исходники и пытался изменить под свои нужды
особенно китайские)))))
все делают по разному
везде какието новые непонятки
так что хз хз)))
сколько раз напарывался когда брал чужие исходники и пытался изменить под свои нужды
особенно китайские)))))
все делают по разному
везде какието новые непонятки
так что хз хз)))
Поправлю
«если компиляторы, соответствующие стандарту C, то естесно будут минимальные затраты на портирование»
Стандарт он на то и придуман, что бы писать на ЯЗЫКЕ и не думать о том, каким компилятором ты потом будешь собирать. Увы, авторам проприетарной хрени на это абсолютно наплевать — им даже удобнее, можно привязать юзеров к своему компиллеру, ибо сложно будет проекты переписывать под другой.
«если компиляторы, соответствующие стандарту C, то естесно будут минимальные затраты на портирование»
Стандарт он на то и придуман, что бы писать на ЯЗЫКЕ и не думать о том, каким компилятором ты потом будешь собирать. Увы, авторам проприетарной хрени на это абсолютно наплевать — им даже удобнее, можно привязать юзеров к своему компиллеру, ибо сложно будет проекты переписывать под другой.
Ну, С же не запрещает увешать язык расширениями. Тот же BCC ака билдер — компилятор, весьма хорошо реализующий стандарт. Однако ж увешан расширениями как елочка игрушками. Свистелки и перделки и все такое. Можно compiler-specific фичи не юзать. Даже на ПК код для совместимости с разными компиляторами (скажем, MSVC и GCC) напичкан дефайнами.
это скорее не глючки а особенности
не работают указатели как мне надо
нельзя передавать константу в функцию для обработки
и fprint(); ваще както по своему работает
впринципе даже круто что они замутили так с fprint();
но это не стандартное поведение заставило меня задуматься почему эта функция в другоих компиляторах не делала то чего я хотел
CCS простой-он даже лучше для понимания чем тот же С18
ну а в C18 мнея вынозило что нужно высчитывать задержки))))))
впринципе не так уж и сложно но время отняло
я то думал все также просто delay_ms(10); там например))))))
тут пришлось написать все эти функции))
ну и портировал проект в принципе быстро с минимумом изменений
и все эти директивы препроцессора CCS(которых нет с стандартном Си)
вот типа того
а про глюки на сонсивири посмотри-там постоянно они всплывают
многие не довольны как можно выпускать компилятор в масссы если он на элементарных вещах глючит
впрочим я не сталкивался с тем что там описано-я ведь не маньяк))))
не работают указатели как мне надо
нельзя передавать константу в функцию для обработки
и fprint(); ваще както по своему работает
впринципе даже круто что они замутили так с fprint();
но это не стандартное поведение заставило меня задуматься почему эта функция в другоих компиляторах не делала то чего я хотел
CCS простой-он даже лучше для понимания чем тот же С18
ну а в C18 мнея вынозило что нужно высчитывать задержки))))))
впринципе не так уж и сложно но время отняло
я то думал все также просто delay_ms(10); там например))))))
тут пришлось написать все эти функции))
ну и портировал проект в принципе быстро с минимумом изменений
и все эти директивы препроцессора CCS(которых нет с стандартном Си)
вот типа того
а про глюки на сонсивири посмотри-там постоянно они всплывают
многие не довольны как можно выпускать компилятор в масссы если он на элементарных вещах глючит
впрочим я не сталкивался с тем что там описано-я ведь не маньяк))))
Что значит «на элементарных вещах глючит»? Компилирует код в неведомую (и неправильную) херню, как эта дрянь?
А какие еще есть компиляторы для 10, 12, 16 и 18 серий пиков, кроме CCS и HI-TECH? mikroElectronica себя уже зарекомендовала (см. ссылку).
P.S. На сонсиври рега закрыта >_<
А какие еще есть компиляторы для 10, 12, 16 и 18 серий пиков, кроме CCS и HI-TECH? mikroElectronica себя уже зарекомендовала (см. ссылку).
P.S. На сонсиври рега закрыта >_<
вот интересная тема
www.microchip.su/showthread.php?t=8088
там в середине начинают непонятки приводить странные
www.microchip.su/showthread.php?t=8088
там в середине начинают непонятки приводить странные
MCC есть микрочиповский
www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en534868
Для 10,12,16 к сожалению выбор не велик. Вообще конечно жаль что микрочипы «положили» на компилятор к младшей серии =( HTCC без оптимизации городит какие goto в несколько строк, видимо дабы нажрать эти -40% кода в pro режиме…
Многие я так понял переехали на PIC18 и MCC, я вот тоже хочу попробовать.
ME радует новичков, на деле даже я, с небольшим опытом в программировании, начал замечать там какие-то «детские» недоработки.
www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en534868
Для 10,12,16 к сожалению выбор не велик. Вообще конечно жаль что микрочипы «положили» на компилятор к младшей серии =( HTCC без оптимизации городит какие goto в несколько строк, видимо дабы нажрать эти -40% кода в pro режиме…
Многие я так понял переехали на PIC18 и MCC, я вот тоже хочу попробовать.
ME радует новичков, на деле даже я, с небольшим опытом в программировании, начал замечать там какие-то «детские» недоработки.
ME радует новичков, на деле даже я, с небольшим опытом в программировании, начал замечать там какие-то «детские» недоработки.Ну уж когда вызов AddTask(Timers[i].Task) не работает — это вообще капец.
HTCC без оптимизации городит какие goto в несколько строк, видимо дабы нажрать эти -40% кода в pro режиме…Они на пару с микрочипом вконец оборзели и оторвали (почти) всю оптимизацию в бесплатной версии даже от C32 (он же GCC-MIPS, интересно, как это согласуется с опенсорсностью и требованиями GPL). Впрочем, рутрекер эту проблему решает.
А CCS похоже все же чуть лучше, чем mikroE. По большей части отказывается компилировать, как я понял, а не генерит мусор.
так это в ДШ лезть надо, адреса искать… лееень. Кроме того, таким образом надо будет для каждого типа контроллера заголовочный файл править.
Спасибо, все получлось.
Вопрос, поменял тайминги на 20мс и 80мс, в протеусе перестало мигать. почему?
Еще как отключить wdt в протеусе?
Вопрос, поменял тайминги на 20мс и 80мс, в протеусе перестало мигать. почему?
Еще как отключить wdt в протеусе?
Скорее всего, потому что протеус не совсем в реальном времени моделирует, смотрите на время внизу экрана.
WDT тоже отключается в конфигурационных битах в самом коде (в hi-tech __CONFIG(WDTDIS))
WDT тоже отключается в конфигурационных битах в самом коде (в hi-tech __CONFIG(WDTDIS))
спасибо
наверно так и есть
а в пошаговом режиме симуляции в протеусе можно выставлять время одного шага вручную?
наверно так и есть
а в пошаговом режиме симуляции в протеусе можно выставлять время одного шага вручную?
Думаю нужна темка типа «PIC контроллеры с нуля»,…
где по-подробнее с отладки и схему отладчика что
по-проще и через USB кроме пикитов-2/3 конечно).
А то то блочный обзор архитектуры рассматривается,
то забыли железо и сразу ушли на компайлер.
где по-подробнее с отладки и схему отладчика что
по-проще и через USB кроме пикитов-2/3 конечно).
А то то блочный обзор архитектуры рассматривается,
то забыли железо и сразу ушли на компайлер.
реквестирую схему простого программатора PIC10/12самый простой, проверренный и надежный — RCD programmer. Он работает через Com порт. Программа — WinPIC800. Если через USB — PICkit2. Быстрый, многофункциональный (есть анализатор на 3 канала), официальный. Если смущает стоимость деталей — соберите Light версию, она без микросхем памяти, а память составляет треть от всей суммы.
Думаю нужна темка типа «PIC контроллеры с нуля»,…
где по-подробнее с отладки и схему отладчика что
по-проще и через USB кроме пикитов-2/3 конечно).
А то то блочный обзор архитектуры рассматривается,
то забыли железо и сразу ушли на компайлер.
данная статья позиционируется не как «pic с нуля», она рассчитана на тех, кто знаком с pic, кто работал с ассемблером и хотел бы начать на С.
Может, nextos напишет что либо и для «с нуля», раз наал с архитектуры. За программатор — если через USB — только PICkit2. Лучшего нет.
вот кстати про лайт версию вопросов много,
много кто ругает, но всегда без аргументации.
нашел к примеру такую:
simon.derr.free.fr/site/spip/spip.php?article11

признаюсь — на большее, моей дури, наверное не хватит )
много кто ругает, но всегда без аргументации.
нашел к примеру такую:
simon.derr.free.fr/site/spip/spip.php?article11

признаюсь — на большее, моей дури, наверное не хватит )
еще об 3-м и 2-м пик-китах forum.easyelectronics.ru/viewtopic.php?f=5&t=3271.
а вот упрощенная версия кит2 www.labkit.ru/html/programmators_shm?id=86
а вот упрощенная версия кит2 www.labkit.ru/html/programmators_shm?id=86
собрать не проблема, наверное сделаю урезанный PICKit, хочу на USB. Надо будет еще простенький программатор сделать, чтобы контроллер PICKit прошить, но это тоже не проблема. ПРоблема блин в отсутствии дома LPT и COM, буду на работе прошивать :-)
Если собираетесь работать со страршими пиками (в т.ч. с отладкой), то берите pk3. А так pk2 тоже хорош.
Стоят они имхо дешево в том же тритоне, особенно учитывая функционал. Я помню когда только начинал работать с МК, в магазах видел примитивные lpt-программаторы за 1к.
Вообще pk2 долгое время рулил даже в сравнении с pk3, по скорости программирования, по наличию удобного софра для прошивки. Но к сожалению он не поддерживает отладку новых устройств, в т.ч. и младших pic16f1xxx (маркетинг, сцуко..), так что если брать, то уже pk3.
Стоят они имхо дешево в том же тритоне, особенно учитывая функционал. Я помню когда только начинал работать с МК, в магазах видел примитивные lpt-программаторы за 1к.
Вообще pk2 долгое время рулил даже в сравнении с pk3, по скорости программирования, по наличию удобного софра для прошивки. Но к сожалению он не поддерживает отладку новых устройств, в т.ч. и младших pic16f1xxx (маркетинг, сцуко..), так что если брать, то уже pk3.
собрать не проблема, наверное сделаю урезанный PICKit, хочу на USB. Надо будет еще простенький программатор сделать, чтобы контроллер PICKit прошить, но это тоже не проблема. ПРоблема блин в отсутствии дома LPT и COM, буду на работе прошивать :-)
Кстати, у нас такие ебанутые цены на компоненты, что и не факт что самому собрать дешевле выйдет… К примеру тинька 2313 в DIP корпусировке стоит… внимание.....150 рублей блять.
Кстати, у нас такие ебанутые цены на компоненты, что и не факт что самому собрать дешевле выйдет… К примеру тинька 2313 в DIP корпусировке стоит… внимание.....150 рублей блять.
pickit3
cgi.ebay.com/Clone-Microchip-Development-Programmer-Mini-PICKIT-3-/230628130598?pt=LH_DefaultDomain_0&hash=item35b281ff26
цена 1000р
сам такой купил и не парюсь
все работает свистит и пердит
надо прошить пик32? без проблем
и вообще все пики даже самые новые без проблемм
cgi.ebay.com/Clone-Microchip-Development-Programmer-Mini-PICKIT-3-/230628130598?pt=LH_DefaultDomain_0&hash=item35b281ff26
цена 1000р
сам такой купил и не парюсь
все работает свистит и пердит
надо прошить пик32? без проблем
и вообще все пики даже самые новые без проблемм
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
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
Приобрел себе самый дешевый программатор, который нашел www.aliexpress.com/item/PIC-K150-ICSP-Programmer-USB-Automatic-Programming-Develop-Microcontroller-USB-ICSP-cable/1041865968.html и признаюсь говно лютое. Коннектится раза с пятого, шьет через раз. Но, в принципе, пойдет.
Комментарии (64)
RSS свернуть / развернуть