Оптический сенсор, назначение оптический концевик, для автоматики, бесконтактный выключатель с функцией автоматического отключения…
Метка:С чего начать?
Тип данных – бит
- Тип данных – бит
- Битовые операции (установка, сброс и инвертирование бита)
- Тестирование бита в байте
Компилятор XC8 поддерживает разрядные целочисленные типы, которые могут содержать значения 0 или 1. Чтобы обеспечить максимальное удобство программиста при решении задач, связанных с манипуляциями отдельными битами, был введен дополнительный тип данных – бит (bit). Переменные этого типа описываются как обычно:
static bit init_flag;
Переменные типа бит не могут иметь модификатор auto и не могут передаваться в функцию в качестве аргумента, но функция может возвращать значение типа бит. По большому счету переменные этого типа ведут себя как обычные переменные типа unsigned char, но при этом могут принимать значение 0 или 1. Поэтому их удобно использовать для определения различных логических переменных и флагов. Такой подход значительно экономит оперативную память. Компилятор не позволяет создавать указатели типа бит или статически инициализировать переменные этого типа.
Все операции с переменными типа бит выполняются с помощью бит-ориентированных инструкций ассемблера, насколько это вообще возможно, при этом создается очень эффективный и компактный код. Если попытаться присвоить переменной типа бит целое значение, то будет сохранен только младший бит.
Все переменные этого типа упаковываются таким образом, что 8 переменных типа бит в памяти займут один байт.
Битовые операции (установка, сброс и инвертирование бита)
Примеры:
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 |
// устанавливается бит (биты) в позиции «1» foo |= 0b00010000; foo |= 0b00010100; // сбрасывается бит (биты) в позиции «0» foo &= 0b10111111; foo &= 0b10111011; // инвертируем биты порта LATB2 = !LATB2; // инвертирование бита описанного в структуре Bit.MIG = !Bit.MIG; // инвертирование бита в позиции «1» foo ^= 0b00010000; // варианты записей // инвертирование бита 0 leds ^= 1; // инвертирование бита 1 leds ^= (1<<1); // инвертирование бита 2 leds ^= (1<<2); // инвертирование бита 3 leds ^= (1<<3); |
Для более наглядного использования работы с битами принятого в ассемблере, можно в начале программы описать макросы для установки, для очистки и инвертирования бита в переменной:
1 2 3 4 5 6 7 8 9 |
#define bitset(var,bitno) ((var) |= 1<<(bitno)); // установить #define bitclr(var,bitno) ((var) &= ~(1<<(bitno))); // сбросить #define bitbtg(var,bitno) ((var) ^= 1<<(bitno)); // инвертировать 1UL – константа 1 указывается unsigned long – положительное длинное #define bitset(var,bitno) ((var) |= 1UL<<(bitno)); // установить #define bitclr(var,bitno) ((var) &= ~(1UL <<(bitno))); // сбросить #define bitbtg(var,bitno) ((var) ^= 1UL <<(bitno)); // инвертировать |
Пример:
1 2 3 4 5 6 |
unsigned int foo; bitset(foo,14); // установить бит 14 bitclr(foo,14); // сбросить бит 14 bitbtg (foo,14); // инвертировать бит 14 foo |= 0b0101; // установить 0 и 2 биты |
Для тестирования бита в байте можно применить,
например,
1 2 3 4 5 |
//тестируем бит 7 на ноль if(!(PORTB & 0b10000000)) //тестируем бит 7 на единицу if(PORTB & 0b10000000) |
Это может быть интересно
Ссылки на интересные источники
Сбор 3D моделей от André L’Hérault конденсаторы, резисторы, индуктивности dropbox IPC-SM-782 Surface Mount Design and Land Pattern Standard Видео уроки по Altium designer Alexey Sabunin https://www.youtube.com/channel/UCG7N5CqXpyK8nQjr1EmMgng Сергей Булавинов https://www.youtube.com/channel/UCISAMXRnN_Qw9UTjUwZI1Jw Robert Feranec https://www.youtube.com/user/matarofe Самый быстрый, …Сумеречное реле
Реле управления освещением, датчик день-ночь – одним словом фотореле для управления освещением или формирования сигнала для системы умный дом о понижении или повышении освещенности относительно заданного уровня. Реле выполнено по классической схеме, конденсаторный блок питания, от сети переменного тока 220 вольт. …УКВ – радиоприем, часть 1
Музыкальная тема к статье, слушаем: Первый мой радиоприемник, выглядел так. Использовал исключительно в школе на уроках, держась за одно ухо и преданно смотря на училку и сладко улыбаясь. Проблема была …Проект с использованием MCC часть 12-1
В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно почитать здесь …Тестирование модуля генератора
Тестирование модуля генератора Настройка, запуск и проверка рабочей частоты на примере PIC18F26K40. PIC18F26K40 Чтобы понять из-за чего зависит производительность микроконтроллера просто надо понять как работает его задающий тактовый генератор. …Audio-bluetooth modules BK8000L (noname)
Еще один вариант, так сказать недоразумения Audio-bluetooth modules BK8000L (noname). Его отличительной маркировкой служат два отверстия в плате и надпись R2. Отличают его от модулей на чипе BK8000L, что у …Цифровой тахометр для автомобиля CH-С3300
Тахометр Ch-С3300 предназначен для индикации и контроля оборотов, времени работы и максимальных оборотов развиваемых двигателем во время поездки. Датчиком может использоваться как обычный контактный прерыватель или выход датчика холла автомобиля …Проект с использованием MCC часть 08
И так создадим проект в котором при помощи двух кнопок мы сможем управлять яркостью светодиодов. При использовании МСС у нас лафа полная, добрые дяди с Microchipa подготовили функции, которыи позволяет …Проект с использованием MCC часть 03
Первым делом перенастроим регистры конфигурации, следующим образом: Отключим выход генератора (CLKOUT function is disabled. I/O function on the CLKOUT pin) Включим сторожевой таймер (WDT enabled) После этой настройки мы должны …MCC PIC24 – модуль OUTPUT COMPARE – режиме ШИМ
Во многих системах управления, для формирования управляющих сигналов требуется модуль ШИМ, он позволяет не только формировать импульсы заданной длительности, но и с применением обычного RC фильтра строить простые ЦАП. MCC …
Работа с многобайтными переменными, Формат данных
Работа с многобайтными переменными.
Например, нам необходимо получить данные из таймера (16 разрядный режим) TMR0 и записать в 16 разрядной переменной «i».
Сделать это можно так:
1 2 |
i = TMR0L; // загружаем значение младшего байта (при этом с таймера загружается регистр TMR0H) i += TMR0H << 8; // сдвигается на 8 бит и загружается старший байт |
Преобразование типов. Обратите внимание, если вам необходимо будет производить загрузку в переменную i-длиной 24 бита, то при загрузке будет ошибка. Для правильной загрузки создайте временную переменную в 16 бит, а потом её перегрузите в 24 битную.
1 2 3 |
temp=TMR1L; temp+=TMR1H<<8; i =temp; |
Формат данных
Целые типы данных
XC8 MPLAB компилятор поддерживает целые типы данных с 1, 2, 3 и 4 байта размеров, а также один тип бита. В таблице приведены типы данных и их соответствующий размер и арифметический тип. Тип по умолчанию для каждого типа указывается.
Тип | Размер (в битах) | Арифметический тип | Диапазон |
bit | 1 | Целое без знака | 8 (от 1 до 8 бит занимает в памяти 1 байт) |
signed char | 8 | Целое со знаком | -127 +127 |
unsigned char | 8 | Целое без знака | 0-255 |
signed short | 16 | Целое со знаком | -32 767 + 32 767 |
unsigned short | 16 | Целое без знака | 0-65 535 |
signed int | 16 | Целое со знаком | -32 767 + 32 767 |
unsigned int | 16 | Целое без знака | 0-65 535 |
signed short long | 24 | Целое со знаком | -8 388 607 + 8388607 |
unsigned short long | 24 | Целое без знака | 16 777 215 |
signed long | 32 | Целое со знаком | -2 147 483 647 +2 147 483 647 |
unsigned long | 32 | Целое без знака | 0-4 294 967 295 |
signed long long | 32 | Целое со знаком | -2 147 483 647 +2 147 483 647 |
unsigned long long | 32 | Целое без знака | 0-4 294 967 295 |
1 2 3 4 5 6 7 8 |
int data = 0x54; bit bitvar; bitvar = data; //------------------------------------ int func(void) { static bit flame_on; // ... } |
Числа с плавающей запятой
Type | Size (bits) | Arithmetic Type |
float | 24 or 32 | Real |
double | 24 or 32 | Real |
long double | same as double | Real |
Format | Number | Biased exponent | 1.mantissa | Decimal |
32-bit | 7DA6B69Bh | 11111011b | 1.0100110101101101 0011011b |
2.77000e+37 |
(251) | (1.302447676659) | |||
24-bit | 42123Ah | 10000100b | 1.001001000111010b | 36.557 |
(132) | (1.142395019531) |
Диапазон значений чисел с плавающей точкой
Symbol | Meaning | 24-bit Value | 32-bit Value |
XXX_RADIX | Radix of exponent representation | 2 | 2 |
XXX_ROUNDS | Rounding mode for addition | 0 | 0 |
XXX_MIN_EXP | Min. n such that FLT_RADIXn-1 is a normalized float value |
-125 | -125 |
XXX_MIN_10_EXP | Min. n such that 10n is anormalized float value | -37 | -37 |
XXX_MAX_EXP | Max. n such that FLT_RADIXn-1 is a normalized float value |
128 | 128 |
XXX_MAX_10_EXP | Max. n such that 10n is a normalized float value |
38 | 38 |
XXX_MANT_DIG | Number of FLT_RADIX mantissadigits | 16 | 24 |
XXX_EPSILON | The smallest number which added to 1.0 does not yield 1.0 |
3.05176e-05 | 1.19209e-07 |
1 2 3 4 |
volatile float myFloat; myFloat = 95002.0; if(myFloat == 95001.0) // value will be rounded PORTA++; // this line will be executed! |
Формат ввода чисел (литералов)
Литерал | Формат | Пример цветом признак формата |
Двоичный | 0b<число> или 0B<число> | 0b10011001 |
Восьмеричный | 0<число> | 0345 |
Десятичный | <число> | 129 |
Шестнадцатеричный | 0x<число> или 0X<число> | 0x2F |
EEPROM и Flash память программ
(актуально для компилятора XC8 и HI-TECH)
Если при программировании контроллера необходимо предварительно записать данные в EEPROM, то можно воспользоваться следующим макросом
1 |
__EEPROM_DATA (0,1,2,3,4,5,6,7);// инициализация EEPROM |
Макрос позволяет инициализировать блок в 8 байт. Если необходимо инициализация большего количества данных можно использовать несколько макросов. Пример,
1 2 3 |
__EEPROM_DATA (0,1,2,3,4,5,6,7);// инициализация EEPROM __EEPROM_DATA (33,48,2,3,4,5,6,7);// инициализация EEPROM __EEPROM_DATA (0,1,2,3,77,5,6,33);// инициализация EEPROM |
Каждый следующий макрос инициализирует следующее 8 байт.
Макросы записи чтения из EEPROM
1 |
EEPROM_WRITE(address,value); и variable=EEPROM_READ(address); |
но необходимо обратить внимание макрос для чтения не проверяет, закончилось ли запись EEPROM. Если после записи сразу сделать чтение из этой ячейки результат будет не предсказуем.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <htc.h> void eetest(void) { unsigned char value = 1; unsigned char address = 0; // инициализация записи EEPROM_WRITE(address,value); //макрос не ожидает окончание записи в память // организация ожидания окончания записи для EEPROM_READ while(WR) continue; // чтение EEPROM из адреса value = EEPROM_READ(address); } |
Функции записи чтения из EEPROM
variable=eeprom_read(address) и eeprom_write(address,value)
аналогичный пример записи чтения
1 2 3 4 5 6 7 8 9 10 11 |
#include <htc.h> void eetest(void) { unsigned char value = 1; unsigned char address = 0; // запись eeprom_write(address, value);// функция ожидает окончание записи в память // чтение value = eeprom_read(address); ... |
Функции записи массива или последовательная запись данных
Если вы организуете циклическую запись в EEPROM надо учитывать тот факт, что изменять адрес в регистре EEADR можно только после окончания записи. Если это сделать не дождавшись, то запись в регистр адреса EEADR не воспримется устройством (не изменится).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
teleaddr=0; EEPROM_WRITE(teleaddr,0xdf); while (WR) continue; //необходимо для изменения адреса teleaddr++; //ß EEPROM_WRITE(teleaddr,0xdf); while (WR) continue; teleaddr++; EEPROM_WRITE(teleaddr,0x02); while (WR) continue; teleaddr++; EEPROM_WRITE(teleaddr,0x07); while (WR) continue; teleaddr++; |
Если убрать из последовательности ожидание окончания записи while(WR) continue; то все попытки записи будут предприняты только по адресу EEADR=0. Это актуально как для макроса EEPROM_WRITE, так и для функции eeprom_write.
В принципе, что макрос, что функция это одно и тоже, функция это вызов того же макроса.
НЕЛЬЗЯ использовать регистр EEADR непосредственно с функциями.
Возможно при помощи макросов
Записать блок кода/данных в области во флэш-памяти:
1 2 |
flash_write (указатель начала блока данных, длина блока, указатель начала области флэш-памяти); flash_write(source_pointer, length, dest_pointer); |
чтение байта данных из флэш-памяти, и сохранение в переменной:
1 2 |
variable=flash_read (адрес); variable=flash_read(address); |
Оператор – sizeof() – Приоритет операторов
Оператор – sizeof()
Этот оператор имеет один параметр, который может быть либо тип, либо сама переменная и возвращает размер в байтах этого типа или объекта:
1 |
a = sizeof (char); |
В этом примере переменной (а) будет присвоено значение 1 потому, что char однобайтовый тип.
Значение, возвращаемое функцией sizeof, является константой, поэтому всегда определяется до выполнения программы.
Например, массив
1 2 3 |
static unsigned char txferTxBuff[256]; temp = sizeof (txferTxBuff); // возвращает переменной temp размер массива 256. |
а конструкция
1 |
temp1 = sizeof (*txferTxBuff); // возвращает размер элемента массива в байтах |
Если chat то он всегда будет 8 бит или 1 байт, если int то тут будет зависит от используемого микроконтроллера. Например компилятор XC8 вернет значение 2 байта, а компилятор XC32 вернет значение 4 (байта). Это значит, что один элемент в разных системах занимает разное количество байт. Массив static unsigned int txferTxBuff[256] описанный в программе для PIC32 будет занимать в памяти 1024 байта.
конструкция
1 |
temp = sizeof (txferTxBuff) / sizeof (*txferTxBuff); |
вычисляет именно размер массива.
Приоритет операторов
При написании сложных выражений с несколькими операндами, мы можем иметь некоторые сомнения, относительно какой операнд вычисляется сначала, а какой позднее. К примеру, в этом выражении:
1 |
a = 5 + 7 % 2 |
Мы может сомневаться, если оно действительно означает:
1 2 3 |
a = 5 + (7 % 2) // with a result of 6, или a = (5 + 7) % 2 // with a result of 0 |
Правильный ответ является первым из двух выражений с результатом 6. Существует установленный порядок с приоритетом каждого оператора, а не только арифметики из них (те, чьи предпочтение исходят от математики), но и для всех операторов, которые могут возникнуть в C++. От наиболее низкого приоритета, порядок будет следующим:
Уровень |
Оператор |
Описание |
Группировка |
1 |
:: |
scope | Слева направо |
2 |
() [] . -> ++ — dynamic_cast static_cast reinterpret_cast const_cast typeid |
Postfix | Слева направо |
3 |
++ — ~ ! sizeof new delete |
Унарный (префикс) | Справа налево |
* & |
косвенного обращения и ссылки (указатели) | ||
+ – |
унарный оператор знак | ||
4 |
(type) |
приведение типов | Справа налево |
5 |
.* ->* |
указатель на член | Слева направо |
6 |
* / % |
Мультипликативная | Слева направо |
7 |
+ – |
добавка | Слева направо |
8 |
<< >> |
сдвиг | Слева направо |
9 |
< > <= >= |
реляционные | Слева направо |
10 |
== != |
равенство | Слева направо |
11 |
& |
побитового И | Слева направо |
12 |
^ |
Побитовое исключающее или | Слева направо |
13 |
| |
побитовое OR | Слева направо |
14 |
&& |
Логическое И | Слева направо |
15 |
|| |
Логическое или | Слева направо |
16 |
?: |
Условное | Справа налево |
17 |
= *= /= %= += -= >>= <<= &= ^= |= |
назначение | Справа налево |
18 |
, |
запятая | Слева направо |
Группировка определяет порядок приоритета, в котором операторы вычисляются в дело, что есть несколько операторов одного уровня в выражении.
Это может быть интересно
Altium Designer – создание рисунков на печатной плате
Для создание рисунков на печатной платы в Altium Designer можно использовать возможность использовать в Altium Designer сторонних скриптов. Мне возможность эта очень понравилась и я решил её расшарить для электронщиков. …HVLD модуль на примере PIC24FJ128GA204
HVLD модуль представляет собой простое устройство, для контроля напряжения питания микроконтроллера или внешнего напряжения (через делитель). Его задача при “выходе” напряжения за заданные пределы сформировать сообщение микроконтроллеру, что необходимо выполнить …Бегущие огни на WS2812B
В настоящее время большой популярностью стали пользоваться светодиоды со встроенным драйвером WS2812B. Текущий проект предназначен показать возможность использования и управления этими светодиодами. Это и проект и исследование по работе с …MPLAB X IDE – управление проектами
Среда MPLAB X IDE позволяет оперативно работать с несколькими проектами, например, если у вас в работе несколько проектов: Для того чтобы переключиться достаточно выбрать другой проект: Для выбора проекта существует …DS18B20 – удаленный контроль температуры
Плата в корпусе Датчики температуры DS18B20 Схема подключения Вывод данных на ПК Установка дополнительных резисторов Назначение выводов This jQuery slider was created with the free EasyRotator for WordPress plugin from …Акриловый корпус для платы ch-4000
Плата ch-4000 подходит для монтажа в корпуса на дин рейку, но для домашней автоматики необходимо что-то другое, поэтому был разработан корпус из акрила который позволит создавать настольные и настенные устройства. Корпус состоит из …Обновление ESP8266 c ESPFlashDownloadTool_v3.6.3
Технология обновления следующая: Загружаем программу со страницы espressif.com. Разархивируем. Где находятся файлы, для прошивки? Заходим в каталоги Подключаем по схеме в статье WiFi ESP8266 (замыкаем BT2, перемычка). Запускаем программу, откроется два …ch-4060 – регулятор температуры и влажности на датчике DHT11/DHT22/AM2302
На плате ch-4000 очень легко собрать устройство регулятора температуры и влажности. Датчик DHT11 самый недорогой вариант для создания такого устройства, правда точность его не велика, но для бытовых устройств он даже …JDY-62A Audio bluetooth module
Простой модуль для простого аудио блютуса. Встроенные подсказки на английском языке. Модуль включён, режим муте – после подачи питания. Контроль разряда батареи предупреждение что батарея разряжена и необходима подзарядка. При …LED модуль P10 (1R) V706A
Это еще одно чудо от китайского брата. Это монохромные матрицы, называются они P10 (1R) V706A, ну типа R-красные, но не верьте паяют светики и зеленые и синие, в общем любые какие …
Настройка регистра ID и Заголовки h
Настройка регистра ID идентификатора контроллера
1 2 |
__IDLOC(15F01); // запись ID идентификатора __IDLOC(15F0144F); // запись идентификатора (занимает 8 байт озу) по индикатору |
Заголовки идут в начале программы и говорят предпроцессору, какими функциями предполагается пользоваться в программе. Наличие заголовка не означает. Что объем программы автоматически будет увеличен на количество тех функций, которые описывает заголовок, в программу будет добавлен только та функция, которая будет использоваться. Даже если вы забудете указать заголовок, а используете функцию, которая не содержится в указанных заголовках, то предпроцессор предпримет попытку поиска функции в папке по умолчанию с заголовками и если найдет, то вставит эту функцию в программу из найденного файла .h. А вас предупредить, что получается такая контузия.
Это не значит, что не надо вставлять файлы заголовков их надо обязательно указывать, чтоб предпроцессор выбирал для вас именно те функции, которые вы собираетесь использовать!!! А иначе может использоваться функция с таким же именем из какого-то вами созданного файла и работающая совсем иначе.
Примеры файлов подключения функций:
1 2 |
#include <delays.h> // функции задержек #include <stdlib.h> // функции преобразования |
Универсальный файл заголовка
В компиляторах майкрочип, теперь не надо указывать тип процессора, тип процессора берется автоматически из проекта, достаточно указать универсальный файл заголовка, т.е. вместо #include <htc.h> или #include <p32xxxx.h> указываем:
1 |
#include <xc.h> |
Операторы уменьшения и увеличения
Оператор увеличения (++) и оператор уменьшения (–) увеличить или уменьшить на единицу значение, хранящееся в переменной. Они эквивалентны += 1 и -=1, соответственно. Таким образом:
1 2 3 |
c++; c+=1; c=c+1; |
все эквивалентны в своей функциональности: три из них увеличить на единицу значение c.
Особенностью этого оператора является, что она может использоваться в качестве префикса и суффикса. Это означает, что оно может быть написано либо до идентификатора переменной (++) или после него (++). Хотя в простых выражениях как а++ или ++а оба имеют одно и тоже значение, в другие выражения, в которых результат операции увеличение или уменьшение оценивается как значение внешнем выражении и они могут оказывать важное различие в их смысле.
В случае, если оператор увеличения используется как префикса (++а) значение увеличивается до того, как вычисляется результат выражения и поэтому увеличение значения рассматривается внешнее выражение; в случае, если оно используется в качестве суффикса (а++) значение, хранящееся в переменной увеличивается после операции. Обратите внимание на разницу:
Пример 1 | Пример 2 |
B = 3; A = ++B; //A содержит 4, B содержит 4 |
B = 3; A = B++; //A содержит 3, B содержит 4 |
В примере 1, B увеличивается до того, как его значение копируется A. В примере 2, A копируется значение b и затем b увеличивается.
Это может быть интересно
LED модуль P10 (1R) V706A
Это еще одно чудо от китайского брата. Это монохромные матрицы, называются они P10 (1R) V706A, ну типа R-красные, но не верьте паяют светики и зеленые и синие, в общем любые какие …Модуль CAN в микроконтроллерах PIC18
Введение CAN последовательный интерфейс связи, который эффективно поддерживает распределенное управление в реальном масштабе времени с высокой помехозащищенностью. Протокол связи полностью определен Robert Bosch GmbH, в спецификации требований CAN 2.0B …ESP8266 процедура получение данных даты и времени от серверов точного времени.
Эта функция доступна уже в версии 1.6.1. Для многих приложений, необходимо часы реального времени, если в вашем проекте есть модуль WiFI ESP8266, то легко можно сделать следующим образом. Процедура описывает …MPLAB® Harmony – или как это просто! Часть 3.
Часть третья – копнём немного глубже. Вы наверное заметили, что во второй главе, вроде сначала все шло как по маслу, а потом, что бы заморгали светики, я вставил в код …MPLAB® Harmony – или как это просто! Часть 2.
Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из трудоемкого варианта …MPLAB® Harmony – или как это просто! Часть 4.
Часть четвертая – это может показаться немного сложно. Структура проекта. Для облегчения конфигурирования проекты MPLAB Harmony обычно структурированы таким образом, чтобы изолировать код, необходимый для настройки «системы», от кода библиотеки …MPLAB® Harmony – или как это просто! Часть 1.
Часть первая – Установка Гармонии. Музыкальная тема к статье, слушаем: В начале запуска нового проекта и выбора микроконтроллера стоит задача правильно его сконфигурировать, прежде чем перейти к реализации самой задачи. …ESP32-первое знакомство
Музыкальная тема к статье, слушаем: Настало время познакомиться c ESP32 и для меня, для этого я приобрел в ГАММЕ отладочную плату с модулем ESP-WROOM-32 (ESP32-DevKitC). Первая задача, как он подключается, …Проект с использованием MCC часть 07
Модуль PWM – широтно импульсная модуляция (ШИМ). ПИК контроллеры часто на борту имеют модули ШИМ. На их основе строятся многие узлы управления электро приводами. В нашем варианте мы будем его …ch-4000 – универсальная печатная плата
На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, дистанционное управление …
Составные операторы присваивания
Составные операторы присваивания (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=)
Когда мы хотим изменить значение переменной, выполняя операции над значением, хранящимся в этой переменной, мы можем использовать составные операторы присваивания:
Выражение | Эквивалентное выражение |
value += increase; | value = value + increase; |
a -= 5; | a = a - 5; |
a /= b; | a = a / b; |
price *= units + 1; | price = price * (units + 1); |
и то же самое для всех других операторов. К примеру:
1 2 3 4 5 6 7 8 9 10 11 |
// compound assignment operators #include <iostream> using namespace std; int main () { int a, b=3; a = b; a+=2; // equivalent to a=a+2 cout << a; return 0; } |
Это может быть интересно
JDY-62A Audio bluetooth module
Простой модуль для простого аудио блютуса. Встроенные подсказки на английском языке. Модуль включён, режим муте – после подачи питания. Контроль разряда батареи предупреждение что батарея разряжена и необходима подзарядка. При …Самый простой диммер для светодиодного освещения
Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы приведем несколько …USB K-L-line адаптер
USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели разработанной печатной …ch-светомузыка от теории до реализации
Сразу оговоримся технология или теория ch-светомузыки, это постоянно развивающийся процесс и то что будет сказано сегодня завтра может быть опровергнуто и считаться ошибочным. Назовем само решение проблемы автоматического преобразования или …CCP – модуль в режиме Compare на примере PIC18
CCP – модуль можно использовать в трех режимах: Capture – позволяет захватывать входной сигнал и определять его параметры (длительность или частоту). Дополнительно управлять внутренними модулями. Compare – позволяет формировать импульсы …MPLAB® Harmony – или как это просто! Часть 2.
Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из трудоемкого варианта …MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)
RTCC предоставляет пользователю часы реального времени и функция календаря (RTCC), точность “хода” может быть откалибрована. Основные особенности модуля RTCC: • Работает в режиме глубокого сна. • Возможность выбора источника синхронизации. • …MCC – K42 – настройка модуля DMA
MCC – в версии v.3.95.0 и начиная ядра 4.85.0 конфигуратор предоставляет графический интерфейс для настройки модуля DMA. Для начала: Посмотреть какая версия МСС можно в закладке версии, если у вас …Сумеречное реле
Реле управления освещением, датчик день-ночь – одним словом фотореле для управления освещением или формирования сигнала для системы умный дом о понижении или повышении освещенности относительно заданного уровня. Реле выполнено по классической схеме, конденсаторный блок питания, от сети переменного тока 220 вольт. …Проект с использованием MCC часть 10
Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – это значит, …
Арифметические операторы
Арифметические операторы (+,-,*,/,%)
Пять арифметических операций, поддерживаемых в языке C являются:
+ | Добавление |
– | Вычитание |
* | Умножение |
/ | Деление |
% | Деление по модулю |
1 2 3 |
// a = 11 % 3; // |
Переменная (а) будет содержать значение 2, поскольку остаток от деления 11 на 3 = 2.
Это может быть интересно
Проект с использованием MCC часть 07
Модуль PWM – широтно импульсная модуляция (ШИМ). ПИК контроллеры часто на борту имеют модули ШИМ. На их основе строятся многие узлы управления электро приводами. В нашем варианте мы будем его …VU Meter Tower ART
Стерео индикатор уровня аудио сигнала. Компактность и удобство проектирования устройств на светодиодах WS2812B, а также легкость реализации алгоритма родило идею созданию своей конструкции. В этом проекте я предоставлю все материалы …Проект с использованием MCC часть 01
Для изучения MCC я выбрал простой контроллер PIC16F1509. Выбор его был обусловлен богатой новой периферией которую можно изучить. Для начала была собрана схема на макетной плате Внешний вид собранной схемы …Дисплей KD035C-3A подключение и управление
Дисплей KD035C-3A производиться компанией SHENZHEN STARTEK ELECTRONIC TECHNOLOGY CO.,LTD Характеристики Параметр Спецификация Единицы измерения Размер дисплея 70.08(H)*52.56(V) (3.5inch) mm Тип дисплея TFT active matrix Цветовая гамма 65K/262K colors Разрешение 320(RGB)*240 dots …NeoPixel LED and PIC24
Популярность однопроводной шины для управления светодиода типа WS2812 не ослабевает, а новые типы светодиодов в корпусах 3,5*3,5мм, 2,0*2,0мм становяться все больше привлекательными. Построение дисплеев для анимации требуют все большей производительности …LCD индикаторы на драйвере ML1001
ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. Описание драйвера …Проект с использованием MCC часть 15
EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, добавим выход …MCC – K42 – настройка модуля DMA
MCC – в версии v.3.95.0 и начиная ядра 4.85.0 конфигуратор предоставляет графический интерфейс для настройки модуля DMA. Для начала: Посмотреть какая версия МСС можно в закладке версии, если у вас …USB K-L-line адаптер
USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели разработанной печатной …Простой сенсорный регулятор света
Простой сенсорный регулятор. Проект – 2007 года. Регулятор выполнена на микроконтроллере PIC12F683 и имеет минимальное количество элементов. Выполняет стандартные функции, включение выключение света, изменение яркости, запоминание последнего установленного уровня и быстрое …
Сдвиг переменной, Битовые операторы…
- Сдвиг переменной
- Битовые операторы (&,|,^,~,<<,>>)
- Логические операторы (||, &&, !, ==, !=, >, <, >=, <=)
- Условный оператор (?)
- Оператор Запятая (,)
Сдвиг переменной на n бит
В микроконтроллерах часто приходиться работать с данными на «низком» уровне. Поэтому коснемся темы сдвига битов переменной.
unsigned char foo; // должна быть описана как целая без знака, иначе логический сдвиг вправо превратиться в арифметический.
foo = (foo >> 1); // сдвиг на 1 вправо
foo = (foo << 2); // сдвиг на 2 влево
Сдвиг с вращением битов переменной
unsigned char foo; // должна быть описана как целая без знака
foo = (foo >> 1) | (foo << 7); // вращение вправо на 1 бит
foo = (foo << 1) | (foo >> 7); // вращение влево
unsigned int foo; // должна быть описана как целая без знака
foo = (foo >> 1) | (foo << 15); // вращение вправо на 1 бит
foo = (foo << 1) | (foo >> 15); // вращение влево
Эти операции будут всегда присутствовать в наших программах.
Оператор |
ASM эквивалент |
Описание |
||||
& |
AND |
Побитовый оператор И
|
||||
| |
OR |
Побитовое включающее или
|
||||
^ |
XOR |
Побитовое исключающее или
|
||||
~ |
НЕ |
Унарный дополнение (бит инверсии)
|
||||
<< |
SHL |
Сдвиг влево |
||||
>> |
SHR |
Сдвинуть вправо |
test & 0b10000000 истинно, если в 7 разряде test «1».
Примеры
// проверка разрядов, где стоят 1 на наличия 1
// е.е. когда в 7 и 6 разрядах единицы (остальные не имеют значения)
// тогда выражение истинно
1 2 |
if ((test & 0b10000000)&&(test & 0b01000000))test=1; else test=0; |
// проверка разрядов, где стоят 0 на наличия 0
// е.е. когда в 7 и 6 разрядах нули (остальные не имеют значения)
// тогда выражение истинно
1 2 |
if (!(test & 0b10000000)&& !(test & 0b01000000))test=1; else test=0; |
Необходимо ясно представлять различие между битовыми и логическими операторами. Битовые выполняют операции над данными по битам и возвращают результат данные. Логические операторы оперируют общим значение с данными ИСТИНА или ЛОЖЬ и возвращают значение ИСТИНА или ЛОЖЬ (1 или 0).
|| | логическая операция ИЛИ |
&& | логическая операция И |
! | логическая операция НЕ |
== | Равно |
!= | Не равно |
> | Больше, чем |
< | Меньше чем |
>= | Больше или равно |
<= | Меньше или равно |
(7 == 5) // эквивалентно ЛОЖЬ. |
ЛОЖЬ когда полученное выражение равно нулю. ИСТИНА – когда полученное выражение больше нуля.
Конечно вместо того, чтобы с помощью только числовые константы, мы можем использовать любое допустимое выражение, включая переменные. Предположим, что = 2, b = 3 и c = 6.
(a == 5) // эквивалентно ЛОЖЬ, так «a» не равняется 5. (a*b >= c) // эквивалентно ИСТИНА, так как выражение (2*3 >= 6) ИСТИНА. (b+4 > a*c) // эквивалентно ЛОЖЬ, так как выражение (3+4 > 2*6) ЛОЖЬ. ((b=2) == a) // эквивалентно ИСТИНА. |
Будь осторожен! Оператор = (один знак равенства) не является таким же, как оператор == (два равных знаки), первый из них является оператором присваивания (присваивает значение, стоящее справа переменной слева) и другая (==) является оператор равенства, который сравнивает ли оба выражения в обе стороны от него равны друг другу.
Таким образом, в последнем выражении ((b=2) == а), мы сначала присвоено значение 2 к b и затем мы сравнил его звучание с а , который также хранит значение 2, поэтому результат операции является значение true.
? – условный оператор (знак вопроса)
состояние? result1: result2
Если условие имеет значение true, выражение будет возвращать result1, если это не она будет возвращать result2.
Пример:
1 2 3 4 |
7==5 ? 4 : 3 // результат 3, так как 7 не равно 5. 7==5+2 ? 4 : 3 // результат 4, так как 7 равно 5+2. 5>3 ? a : b // результат a, так как 5 больше 3. a>b ? a : b // результат зависит от того какая переменная больше, a или b. |
Оператор Запятая (,)
Оператор Запятая (,) используется для разделения двух или более выражений, которые включены, где ожидается только одно выражение.
Когда набор выражений должна оцениваться с точки зрения значение, рассматривается только крайнего правого выражения.
Например, следующий код:
1 |
a = (b=3, b+2); |
Будет вначале присвоить значение 3 – b переменной, а затем вычислено b + 2. Таким образом, в конце, переменная a будет содержать значение 5, переменная b будет содержать значение 3.
Это может быть интересно
Сумеречное реле
Реле управления освещением, датчик день-ночь – одним словом фотореле для управления освещением или формирования сигнала для системы умный дом о понижении или повышении освещенности относительно заданного уровня. Реле выполнено по классической схеме, конденсаторный блок питания, от сети переменного тока 220 вольт. …Проект с использованием MCC часть 08
И так создадим проект в котором при помощи двух кнопок мы сможем управлять яркостью светодиодов. При использовании МСС у нас лафа полная, добрые дяди с Microchipa подготовили функции, которыи позволяет …Мультимедийная сеть – AVC-LAN TOYOTA
AVC LAN – протокол обмена данными мультимедийных систем автомобиля. Кодирование данных. При кодировании различаться три типа данных : преамбула – её назначение, это сообщение устройствам на шине, что начинается передача данных. бит 0 …Инфракрасный датчик движения, PIR-sensor
Домашняя автоматика предполагает наличие датчиков движения, которые способны контролировать движения человека. Самым простым и доступным устройством позволяющие контролировать изменения ИК-излучения, это ПИР-сенсоры. На текущий момент доступны не дорогие модели D203B, D204B, D205B. Все они позволяют …Audio-bluetooth modules BK8000L (noname)
Еще один вариант, так сказать недоразумения Audio-bluetooth modules BK8000L (noname). Его отличительной маркировкой служат два отверстия в плате и надпись R2. Отличают его от модулей на чипе BK8000L, что у …Проект с использованием MCC часть 10
Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – это значит, …DIXELL XWEB500D-EVO + RUT900 или как пробить NAT-сервер
Когда необходимо под какой нибудь контроллер имеющий вэб сервер в инет, то нужен статический IP, что оказалось проблемой при работе с операторами сотовых сетей, конкретно с оператором сети “Киевстар”. Их …Обновление ESP8266 c ESPFlashDownloadTool_v3.6.3
Технология обновления следующая: Загружаем программу со страницы espressif.com. Разархивируем. Где находятся файлы, для прошивки? Заходим в каталоги Подключаем по схеме в статье WiFi ESP8266 (замыкаем BT2, перемычка). Запускаем программу, откроется два …MAX7219/21 и 8х8 LED дисплеи
MAX7219, MAX7221 предназначены для вывода информации на 8 разрядов семисегментного индикатора, но на нем легко организовать вывод на светодиодные индикаторы 8х8. продолжение следует…. Это может быть интересно Метки:MAX7219, MAX7221Проект с использованием MCC часть 04
Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое главное , …
Настройка регистров конфигурации контроллера
Основное что необходимо сделать в начале программы, это настроить регистры конфигурации контроллера. От корректной настройки этих регистров часто зависит стабильная работа контроллера.
Описание:
1 |
__CONFIG(n,x); // где n – номер регистра, x – данные конфигурации |
Пример:
1 2 3 |
__CONFIG(1, HSPLL); // запустить генератор с умножителем __CONFIG(2, BORDIS & BORV45 & PWRTEN & WDTDIS & WDTPS1); __CONFIG(3, CCP2RB3); |
Как и где посмотреть какие есть регистры в контроллере – смотрим в описании на контроллер.
Как эти регистры описываются для С?
Лезем в каталог C:\Program Files\HI-TECH Software\PICC-18\PRO\9.66\include\legacy (установки компилятора) и открываем файл, например, ppic18f452.h. В нем ищем раздел // Configuration bit values
В этом разделе смотрим, как описываются биты настройки конфигурации.
Пример настройки контроллера pic18f452
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
__CONFIG(1, HS; OSCSDIS); // | +------ переключатель выбора генератора отключен // +------------ запустить генератор в режиме HS __CONFIG(2, BOREN; BORV45; PWRTEN; WDTEN; WDTPS128); // | | | | +--предделитель таймера настроен на 128 // | | | +--сторожевой таймер включен // | | +--активировать таймер задержки включения // | +--порог активации сброса 4,5 вольта // +--функция сброса по понижению питания активна __CONFIG(3, CCP2RB3); //выход модуля CCP2 настроен на вывод RB3 __CONFIG(4, DEBUGDIS; LVPDIS; STVRDIS); // | | +--сброс по переполнению стека отключен // | +--низковольтное программирование отключено // +--режим внутреннего отладчика отключен __CONFIG(5, CPALL); // установлена защита на всю память __CONFIG(6, WPALL); // защита по записи установлена на всю память __CONFIG(7, TRU); // табличное чтение памяти программ разрешено |
Пример настройки для PIC18F46K22
1 2 3 4 5 6 7 8 |
__CONFIG(1, // FOSC_HSMP & // // FOSC_INTIO7 & FOSC_INTIO67 & // внутрений генератор: выводы генератора используются как выводы i/o PLLCFG_ON & // умножитель включен PRICLKEN_OFF & // первичный генератор не может быть отключен программно FCMEN_OFF & // Отказоустойчивый Монитор Генератора отключен IESO_OFF); // режим переключения генераторов отключен |
1 2 3 4 5 6 |
__CONFIG(2, PWRTEN_ON & // таймер задержки влючения по подаче питания включен BOREN_ON & // сброс по понижению питания влючен BORV_220 & // уровень сброса 2,2 вольта WDTEN_ON & // сторожевой таймер WDTPS_32768); // предделитель сторожевого таймера |
1 2 3 4 5 6 7 8 |
__CONFIG(3, CCP2MX_PORTC1 & // CCP2 подключен к PORTC1 PBADEN_OFF & // порт PORTB скофигурирован при подаче питания как цифровой CCP3MX_PORTB5 & // CCP3 подключен к PORTB5 HFOFST_OFF & // запуск задерживается до появления устойчивого состояния генератора T3CMX_PORTC0 & // T3 подключен к PORTC0 P2BMX_PORTD2 & // P2B подключен к PORTD2 MCLRE_EXTMCLR); // MCLRE включен |
1 2 3 4 5 |
__CONFIG(4, STVREN_OFF & // сброс по переполнению стека отключен LVP_OFF & // поддержка низковольного программирования отключена XINST_OFF & // поддержка расширенных команд отключена DEBUG_OFF); // встроенный дебагер отключен |
1 2 3 4 5 6 7 |
__CONFIG(5, CP0_ON & // Block 0 (000640-003FFFh) защищен CP1_ON & // Block 1 (004000-007FFFh) защищен CP2_ON & // Block 2 (006400-00BFFFh) защищен CP3_ON & // Block 3 (00C000-00FFFFh) защищен CPB_ON & // Boot block (000000-0007FFh) защищен CPD_ON); // Data EEPROM защищен |
1 2 3 4 5 6 7 8 |
__CONFIG(6, WRT0_OFF & // Block 0 (000640-003FFFh) запись разрешена WRT1_OFF & // Block 1 (004000-007FFFh) запись разрешена WRT2_OFF & // Block 2 (006400-00BFFFh) запись разрешена WRT3_OFF & // Block 3 (00C000-00FFFFh) запись разрешена WRTC_OFF & // Регистр конфигурации - запись разрешена WRTB_OFF & // Блок загрузки (000000-0007FFh)- запись разрешена WRTD_OFF); // Запись в EEPROM - запись разрешена |
1 2 3 4 5 6 7 |
__CONFIG(7, EBTR0_OFF & // Block 0 (000640-003FFFh) табличное чтение - разрешено EBTR1_OFF & // Block 1 (004000-007FFFh) табличное чтение - разрешено EBTR2_OFF & // Block 2 (006400-00BFFFh) табличное чтение - разрешено EBTR3_OFF & // Block 3 (00C000-00FFFFh) табличное чтение - разрешено EBTRB_OFF); // Boot Block (000000-0007FFh) табличное чтение - разрешено //--------------------------------------------------------------- |
Пример настройки регистров PIC16F877A
1 2 3 4 5 6 7 8 9 10 11 |
__CONFIG( FOSC_HS & // HS oscillator WDTE_ON & // WDT enabled PWRTE_ON & // PWRT enabled BOREN_ON & // BOR enabled LVP_OFF & // Low-Voltage CPD_OFF & // Data EEPROM code-protected WRT_OFF & // Write protection off DEBUG_OFF & // In-Circuit Debugger disabled CP_OFF); // All program memory code-protected //----------------------------------------------- |
Пример для XC8 контроллер PIC16F1829
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//================================================================================ // конфигурирование контроллера PIC16F1829 //--------------------------------------------------------------------------- // конфигурирование контроллера (регистры конфигурации) __CONFIG( FOSC_INTOSC & // внутрений генератор, выводы генератора и спользуются как порты ввода вывода WDTE_NSLEEP & // Сторожевой таймер включен в рабочем режиме, выключен в режиме сна PWRTE_OFF & // Таймер задержки включения питания-включен MCLRE_OFF & // вывод MCLR/VPP фунцция RA3 CP_ON & // Защита чтения памяти програм - включена CPD_ON & // Защита чтения памяти данных (EPPROM) - включена BOREN_ON & // Сброс по понижению питания отключен CLKOUTEN_OFF & // Фунцйия CLKOUT выхода тактовой частоты на вывод генератора - отключена IESO_OFF & // Функция переключателя Internal/External генратор - отключена FCMEN_OFF); // Монитор генератора бесперебойной работы - отключен __CONFIG( WRT_ALL & // Память программ - защищена от записи PLLEN_ON & // Внутренний умножитель 4x PLL - включен STVREN_OFF & // сброс по переполнению стека отключен BORV_LO & // Уровень сброса по понижению питания установлен на 2.7V LVP_OFF); // Низковольтное программирование отключено //================================================================================ |
Варианты альтернативной настройки регистров конфигурации для контроллера PIC18F25K20
Microchip MPLAB XC8 C Compiler V1.12
вариант 1
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 50 51 |
// конфигурирование контроллера __CONFIG(1, FOSC_INTIO67 & FCMEN_OFF & IESO_OFF); // | | +---Отключен режим переключения Генератора // | +--Отказоустойчивый Монитор Генератора отключен // +--Выбор Генератора, Внутренний генератор, функция порта на RA6 и RA7 // __CONFIG(2L, PWRT_ON & BOREN_ON & BORV_27); // | | +---Уровень напряжения срабатывания сброс при понижении питания 2.7 В // | +---Сброс по понижению питания // +---Задежка запуска процессора при подаче питания (включена) // __CONFIG(2H, WDTEN_ON & WDTPS_1024); // | +---1:1024 задежка страбатывания сторожевого таймера. // +---сторожевой таймер включен // __CONFIG(3, CCP2MX_PORTBE & PBADEN_OFF & LPT1OSC_OFF & HFOFST_OFF & MCLRE_ON); // | | | | +---MCLR включен // | | | +---HF-INTOSC Быстрый Запуск - отключен // | | +---Режим малой мощности Генератора Timer1 Отключен, T1 работает в стандартном режиме мощности. // | +---Режим работы порта PORTB после сброса, выводы PORTB<4:0> конфигурированы на цифровой ввод // +---Выход CCP2 подключен к выводу RB3. __CONFIG(4, STVREN_OFF & LVP_OFF & XINST_OFF & DEBUG_OFF); // | | | +---Режим фонового отладчика отключен. // | | +---Расширенный набор команд отключен // | +---Низковольтное программирование выключенно. // +---Сброс при переполнении стека отключен. // __CONFIG(5, CP0_ON & CP1_ON & CP2_ON & CP3_ON & CPB_ON & CPD_ON); // | | | | | +---защита EEPROM данных активирована // | | | | +---защита блока загрузки активирована // | | | +---защита кода блока 3 активирована // | | +---защита кода блока 2 активирована // | +---защита кода блока 1 активирована // +---защита кода блока 0 активирована // __CONFIG(6, WRT0_OFF & WRT1_OFF & WRT2_OFF & WRT3_OFF & WRTB_OFF & WRTC_OFF & WRTD_OFF); // | | | | | | +---Защита записи в EEPROM память // | | | | | +---Защита записи в регистр конфирураций // | | | | +---Защита записи в блок загрузки // | | | +---защита записи в блок 3 // | | +---защита записи в блок 2 // | +---защита записи в блок 1 // +---защита записи в блок 0 __CONFIG(7, EBTR0_OFF & EBTR1_OFF & EBTR2_OFF & EBTR3_OFF & EBTRB_OFF); // | | | | | // | | | | +---Защита от табличного чтения блок загрузки // | | | +---Защита от табличного чтения блока памяти 3 // | | +---Защита от табличного чтения блока памяти 2 // | +---Защита от табличного чтения блока памяти 1 // +---Защита от табличного чтения блока памяти 0 //------------------------------------------------------------------------------------------------------- |
вариант 2
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 |
//--------------------------------------------------------------------------- // конфигурирование контроллера #pragma config FOSC = INTIO67 // Internal oscillator block, port function on RA6 and RA7/Выбор Генератора, Внутренний генератор, функция порта на RA6 и RA7 #pragma config FCMEN = OFF // Fail-Safe Clock Monitor disabled/Отказоустойчивый Монитор Генератора отключен #pragma config IESO = OFF // Oscillator Switchover mode disabled/Отключен режим переключения Генератора #pragma config PWRT = ON // PWRT enabled/Задежка запуска процессора при подаче питания (включена) #pragma config BOREN = ON // Brown-out Reset enabled and controlled by software (SBOREN is enabled)/Сброс по понижению питания #pragma config BORV = 27 // VBOR set to 2.7 V nominalУровень напряжения срабатывания сброс при понижении питания 2.7 В #pragma config WDTEN = ON // WDT is always enabled. SWDTEN bit has no effect/сторожевой таймер включен #pragma config WDTPS = 8192 // 1:8192/ задежка страбатывания сторожевого таймера. #pragma config CCP2MX = PORTBE // CCP2 input/output is multiplexed with RB3/Выход CCP2 подключен к выводу RB3. #pragma config PBADEN = OFF // PORTB<4:0> pins are configured as digital I/O on Reset #pragma config LPT1OSC = OFF // Timer1 configured for higher power operation #pragma config HFOFST = OFF // The system clock is held off until the HFINTOSC is stable. #pragma config MCLRE = ON // MCLR pin enabled; RE3 input pin disabled #pragma config STVREN = OFF // Stack full/underflow will not cause Reset #pragma config LVP = OFF // Single-Supply ICSP disabled #pragma config XINST = OFF // Instruction set extension and Indexed Addressing mode disabled (Legacy mode) #pragma config DEBUG = OFF // Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins #pragma config CP0 = ON // Block 0 (000800-003FFFh) code-protected #pragma config CP1 = ON // Block 1 (004000-007FFFh) code-protected #pragma config CP2 = ON // Block 2 (008000-00BFFFh) code-protected #pragma config CP3 = ON // Block 3 (00C000-00FFFFh) code-protected #pragma config CPB = ON // Boot block (000000-0007FFh) code-protected #pragma config CPD = ON // Data EEPROM code-protected #pragma config WRT0 = OFF // Block 0 (000800-003FFFh) not write-protected #pragma config WRT1 = OFF // Block 1 (004000-007FFFh) not write-protected #pragma config WRT2 = OFF // Block 2 (008000-00BFFFh) not write-protected #pragma config WRT3 = OFF // Block 3 (00C000h-00FFFFh) not write-protected #pragma config WRTC = OFF // Configuration registers (300000-3000FFh) not write-protected #pragma config WRTB = OFF // Boot Block (000000-0007FFh) not write-protected #pragma config WRTD = OFF // Data EEPROM not write-protected #pragma config EBTR0 = OFF // Block 0 (000800-003FFFh) not protected from table reads executed in other blocks #pragma config EBTR1 = OFF // Block 1 (004000-007FFFh) not protected from table reads executed in other blocks #pragma config EBTR2 = OFF // Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks #pragma config EBTR3 = OFF // Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks #pragma config EBTRB = OFF // Boot Block (000000-0007FFh) not protected from table reads executed in other blocks //--------------------------------------------------------------------------- |
примеры общего вида конфигураций
1 2 |
#include <xc.h> __CONFIG(WDTDIS & HS & UNPROTECT); |
для PIC10/12/16
1 2 3 |
#include <xc.h> __CONFIG(WDTDIS & XT & UNPROTECT); // Program config. word 1 __CONFIG(FCMEN); |
для PIC18
1 |
__CONFIG(2, BW8 & PWRTDIS & WDTPS1 & WDTEN); |
Это может быть интересно
Емкостной сенсор
Изучаем изготовление емкостных сенсоров на PIC-микроконтроллере. Конструкция емкостных сенсоров имеет вид: Емкостные сенсоры строятся по схеме высокочастотного генератора, сам принцип основан на измерение частоты этого генератора. Частота зависит от емкости …УКВ – радиоприем, часть 2
Пришло свободное время решил вторую часть проекта реализовать (правда есть мысль и третью с использование цветного OLED и функцией ch-светомузыки, но это только задумка… Для понимания функций интегрального приемника RDA5807FP читайте …Trimax – кодирование и декодирование ИК-команд
Первое, что надо понять назначение кнопок клавиш пульта, а также, что за кодирование реализовано в ИК- пульте. Для назначения клавиш обратимся к описанию, а для взлома кодирования воспользуемся старым и …Стабилизатор тока для светодиодов SN3350
SN3350 ближайший аналог ZXLD1350 Как собрать готовый вариант, читайте во второй части – http://catcatcat.d-lan.dp.ua/stabilizator-toka-na-sn3350-chast-2/ 40V драйвер светодиодов с внутренним ключом SN3350 – импульсный понижающий преобразователь, разработанный для того, чтобы эффективно управлять одним или группой параллельно-последовательно …ESP32-первое знакомство
Музыкальная тема к статье, слушаем: Настало время познакомиться c ESP32 и для меня, для этого я приобрел в ГАММЕ отладочную плату с модулем ESP-WROOM-32 (ESP32-DevKitC). Первая задача, как он подключается, …NS108-5050-16bit от Newstar
Кто уже использует в своих проектах адресуемые светодиоды хорошо знакомы с такими как WS2812 и им подобные. Эти светодиоды для управления используют однопроводную шину. Из-за этого пропускная способность такой шины …Гаджеты для домашней автоматики – Датчик приближения
Управление светодиодным освещением – Датчик приближения. Данный гаджет предназначен для управления внутренним освещением мебели. Датчик позволяет определить закрытие или открытие дверцы или ящика и при этом включать или выключать освещение. …Защита датчиков температуры DS18B20 от статического электричества
Статья перепечатана с сайта http://svetomuzyka.narod.ru При удалении датчика на большие расстояния возникает опасность наведения импульсов высокого напряжения на кабель, который соединяет датчик с контролером. Если не принимать меры защиты, то наведенное …Стробоскоп для автомобиля
Одним из популярных решений светового тюнинга автомобиля, мотоцикла или скутера стал эффект – “полицейский стробоскоп“. На база платы ch-c0050 реализовано несколько проектов. В этой статье приводятся две версии программы. Рекомендации …Универсальный терморегулятор ch-c3000
Терморегулятор ch-c3000 предназначен для управления системами регулирования температуры в пределах от – (минус) 55 до + 125 С. Регулятор может использоваться как в системах отопления, так и в системах охлаждения …
Преобразование проекта из MPLAB ® 8 в проект MPLAB ® X IDE
Шаг 1. Процесс преобразования, начинается с копирования папки проекта в MPLAB 8, в новую папку. Это необходимо сделать для того чтобы у вас была копия, потому что если вы преобразуете сам оригинал проекта, то возврат в 8 версию обратно корректно невозможен (это касается особенно комментариев написанных на кириллице).
Шаг 2. Начинаем с нажатия на , в открывшемся окне
выбираем преобразование, нажимает Next.
Шаг 3. Необходимо войти в каталог и выбрать имя файла нашего проекта.
нажимаем кнопку Browse (браузер)
выбираем файл проекта нажимаем кнопку Open.
нажимаем кнопку Next.
Шаг 4. Проверка выбранного контроллера.
проверяем модель контроллера, нажимаем кнопку Next
Шаг 5.
нажимаем кнопку Next
Шаг 6. Выбор отладчика.
выбираем отладчик, нажимаем кнопку Next
Шаг 7. Выбор среды программирования.
выбираем язык, нажимаем кнопку Next
Шаг 8. Изменение кодировки проекта.
в этом окне необходимо изменить кодировку проекта на windows-1251, это необходимо, чтобы ваши комментарии, написанные в кириллице, были читаемые. Нажимаем кнопку Next
Нажимаем кнопку Finish.
Шаг 9. Открытие файла проекта.
в окне проекты (Projects) сделайте двойной щелчок на файле проекта и он откроется
преобразование окончено, можно работать :).
Это может быть интересно
Проект с использованием MCC часть 05
Эту часть назовем так как избавься от delay, там где а это реально не надо. Для это нам потребуется научиться использовать прерывания и работать с таймерами. Что такое таймер? Это …Проект с использованием MCC часть 11
Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость работы проекта, …Проект с использованием MCC часть 14
С выводом данных на дисплей мы справились (но могу сразу сказать библиотеку графики к этой статьи пришлось доработать, поэтому в этом проекте она обновлена). У нас на текущем этапе имеется …Акриловый корпус для платы ch-4000
Плата ch-4000 подходит для монтажа в корпуса на дин рейку, но для домашней автоматики необходимо что-то другое, поэтому был разработан корпус из акрила который позволит создавать настольные и настенные устройства. Корпус состоит из …Счетчики посетителей
Вас сосчитали!? или счетчики посетителей. Для чего нужны счетчики посетителей? Какие они бывают? ТОРГОВЛЯ. Подсчитайте, сколько ваш магазин посещает человек за день. Кок много человек приходит утром, какое количество вечером. …Система AT команд версии V2.0 для ESP8266 и ESP32
Появление нового модуля на базе ESP32 заставило систематизировать систему AT команд, а так же систему обновления и для модулей на базе ESP8266. Начиная с версии v2.0 в ESP8266 внедряется прошивка …MPLAB® Code Configurator and Encoder
Еще раз про энкодер… Для некоторых приложений очень удобно и экономически выгодно, для настройки и управления использовать энкодер. Такие энкодеры имеют строенную тактовую кнопку которую можно применить для выбора режимов работы …Проблемы классической светомузыки
Светомузыка – что это такое? Определение: Светомузыка (жаргонное: цветомузыка) — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название – синестезии. …Гаджеты для домашней автоматики – Емкостной сенсор
Управление светодиодным освещением – Сенсор емкостной. Данный гаджет предназначен для управления освещением где необходимо включением освещение сенсорным прикосновением. Датчик позволяет управлять светодиодной нагрузкой в виде модулей или светодиодных лент освещения. Питание …MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)
Введение MTouch ® Модуль Емкостной Библиотеки для MPLAB ® X Code Configurator (MCC) позволяет быстро и легко генерировать решение кода на Cи для емкостной сенсорной кнопки, датчика приближения и слайдера. В записи нет …
Создание проекта
Все начинается с момента создания проекта. Так как его создать?
Загрузим MPLAB X IDE.
Шаг 1. Выберите File ▶ New Project из меню или щелкните значок нового проекта на панели инструментов. Т.е так
или так
а можно и так (кликаем правой кнопкой мыши и отрываем контекстное меню)
или давим Ctrl+Shift+N.
Шаг 2. Выбор проекта
Выберите из списка Categories – Microchip Embedded, а затем из списка Projects – Standalone Projects. Нажмите кнопку Next >, когда закончите.
Шаг 3. Выбор контроллера.
используя выпадающие окна Семейство (Family) и Устройство (Device) выберите свой целевой PIC микроконтроллер. Нажмите Next > кнопку, когда закончите.
Шаг 4. Выбор заголовка.
Шаг 5. Выбор инструмента отладки.
Обратите внимание, что если используете устройства отладки одновременно c MPLAB 8, то вам необходимо будет переключить (с помощью MPLAB driver switcher) драйверы устройств.
Если при выборе отладчика вы увидите надпись “несовместимый драйвер”, отмените создание проекта, выйдите из MPLAB X, переключите драйвер и начните все заново.
Выберите инструмент для отладки устройства. Если у вас нет аппаратного инструменты отладки, то симулятор является хорошим выбором.
Нажмите Next > кнопку, когда закончите.
Шаг 6. Выбор языка программирования.
Выберите необходимый инструмент для сборки (C компилятор или ассемблер для вашего проекта). Нажмите Next > кнопку, когда закончите.
Шаг 7. Имя проекта и место хранения.
Выберите имя для вашего проекта и выберите место и название каталога где будет храниться ваш проект. Папка проекта будут заполнены автоматически.
Обратите внимание на кодировку файла проекта. Нажмите кнопку Finish кнопку, для окончания.
Создание рабочего файла проекта main, правой кнопкой мыши выбираем на папке Source Files контекстное меню
задаем имя файла
В тоге мы получим заготовку:
Для продолжения надо выбрать из заготовок (Заготовки для программ на Си)
Это может быть интересно
USB K-L-line адаптер
USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели разработанной печатной …DIXELL XWEB500D-EVO + RUT900 или как пробить NAT-сервер
Когда необходимо под какой нибудь контроллер имеющий вэб сервер в инет, то нужен статический IP, что оказалось проблемой при работе с операторами сотовых сетей, конкретно с оператором сети “Киевстар”. Их …Проект с использованием MCC часть 16
Продолжим изучение EUSART. На этом этапе отработает передачи данных с ПК и получения эха. Для этого в основной цикл программы добавим код [crayon-607646e68c200627907026/] Суть его проста постоянно в главном цикле …Гаджеты для домашней автоматики – Датчик движения
Управление светодиодным освещением – Датчик движения. Данный гаджет предназначен для управления освещением рабочих столов (кухонных столов), освещение прихожих, освещение зеркал в прихожих, автоматическое включение света в коридорах. Датчик позволяет определить наличие …Мониторинг температуры
Настоящий проект создан как обучающий с применением библиотек ds18b20 и LCDHD44780 и компилятора Microchip MPLAB XC8 C Compiler V1.12. Если необходимо иметь информацию по состоянию температуры в помещении или в здании, с количеством до 6 точек (16), то вы сможете …AD9833 – Programmable Waveform Generator – part two
Прошло время и появилась тема, что-бы закончить проект AD9833 – Programmable Waveform Generator. Приехали печатные платы. В этот раз я печатные платы заказывал в https://jlcpcb.com/ делал это в первый раз …PIC32MZ – прерывания (заметки)
Виды формирования запоминая контекста при входе в прерывания. Компилятор представляет три варианта AUTO – когда запоминания места возврата из подпрограммы возложено на программу, т.е все создается программно. Этот метод является …LM317 и светодиоды
LM317 и светодиоды статья с переработанная с сайта http://invent-systems.narod.ru/LM317.htm Долговечность светодиодов определяется качеством изготовления кристалла, а для белых светодиодов еще и качеством люминофора. В процессе эксплуатации скорость деградации кристалла зависит от …PIC18 – модуль DMA
Введение Модуль прямого доступа к памяти (DMA) предназначен для обслуживания передачи данных непосредственно между различными областями памяти без вмешательства процессора. Исключив при этом необходимость в интенсивной обработки прерываний процессором, …CAN – Controller Area Network
Controller Area Network (CAN) первоначально был создан немецким поставщиком автомобильных систем Робертом Бош в середины 1980-х для автомобильной промышленности как метод для обеспечения возможности надежной последовательной связи. Целью было сделать автомобили более надежными, безопасными и …
С чего начать?
С чего начать? или Как научиться создавать проекты на PIC-микроконтроллерах.
- Установка MPLAB@X и компилятора Си (загрузить последние версии)
- Создание проекта
- Преобразование проекта из MPLAB ® 8 в проект MPLAB ® X IDE
- Компоновка окон
- Создание первой рабочей программы
- Первый проект для самых маленьких (практические примеры)
- Настройка регистров конфигурации контроллера.
- Настройка регистра ID идентификатора контроллера
- Заголовки h
- Сдвиг переменной
- Битовые операторы (&,|,^,~,<<,>>)
- Логические операторы (||, &&, !, ==, !=, >, <, >=, <=)
- Условный оператор (?)
- Оператор Запятая (,)
- Операторы присваивания (=)
- Арифметические операторы (+,-,*,/,%)
- Составные операторы присваивания (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=)
- Операторы уменьшения и увеличения
- delay формирование задержки
- Оператор – sizeof()
- Приоритет операторов
- Подготовка данных для EEPROM (стандартные макросы)
- Запись и чтение из EEPROM памяти (стандартные макросы и функции)
- Запись и чтение из Flashпамяти программ
- Работа с много байтными переменными
- Формат данных
- Тип данных – бит
- Битовые операции (установка, сброс и инвертирование бита)
- Тестирование бита в байте
- 8 – битные целые переменные
- 16 – битные целые переменные
- 32 – битные целые переменные
- Числа с плавающей запятой
- Статистические переменные
- Структуры и строки
- Битовые поля
- Строковые поля в ОЗУ и ПЗУ
- Запись констант
- Квалификаторы типа const и volatile
- Специальные квалификаторы типов
- Указатели
- Поддержка прерываний
- Функции
- Передача аргументов в функцию
- Возвращение результата из функции
- Вызов функции
- Управление запуском программы
- Директивы компилятора
- Стандартные функции ввода-вывода
- Комментарии в Си
- Использование ассемблера #asm, #endasm and asm()
- Совмещение кода C и Assembler
- Использование переменных совместно в С и ассемблере
- Применение структур для создания флагов управления
- Преобразование форматов и использование функции rand()
- Структура простой программы
- Алгоритм использования импульсов от кнопки для подсчета импульсов
- Программа с двумя кнопками управления
- Оператор IF else
- Оператор множественного выбора switch case break default
- Функция KLAVA.
- Сторожевой таймер
- Вставка дополнительного файла в программу
- Подключение дисплея платы PICDEM2 Plus
- Функции для работы с LCD HD44780
- Тестовая программа вывода на дисплей символов и строк
- Программа часов реального времени
- Оператор do –while
- Измерение температуры
- Программа для работы до 16 датчиков DS18B20 на шине
- Оператор break
- Графические индикаторы на драйвере UC1601S
- I2C
- Опция FILL
- Конфугурация для PIC16
- Очистка памяти данных для PIC16
- Динамическия индикация на семисегментных светодиодных дисплеях
- Преобразование 16 бит двоичного чила в десятичное bin_dec()
- Макросы задержки _DELAY , __DELAY_MS, __DELAY_US
- … … …
- продолжение следует…
Установка MPLAB®X и компилятора Си
Первый шаг – где, это все взять и как его установить.
Для начала процесса обучения, необходимо установить интегрированную среду разработки MPLAB. На настоящий момент есть две версии MPLAB® X и MPLAB IDE. Все последнюю информацию надо смотреть на сайте Microchip. Мы начнем привыкать к новой среде MPLAB X. Всегда будем считать, что все новое лучше старого.
Установка.
С начала надо загрузить последнюю версию с сайта Microchip или по ниже указанным ссылкам (последнии версии):
Windows (x86/x64) – MPLAB® X IDE
Linux 32-Bit and Linux 64-Bit (Requires 32-Bit Compatibility Libraries) – MPLAB® X IDE
Mac (10.X) – MPLAB® X IDE
Далее запускаем установку MPLAB X.
кликаем на файле
нас предупредят (как минздрав), жмем Запустить
и пошло и поехало
это окно, так на всякий случай если передумаем, жмем Next
теперь, пугают безответственной ответственностью, мы покорно соглашаемся
и быстро жмем Next, чтобы не передумать.
предложат побаловаться с директорий инсталяции
еще раз одно “типа предлагают передумать” и после неудачных уговоров начнется копирования файлов, то бишь установка
после копирования, выполниться инсталляция
далее напугают каким-то переключателем, при этом не оставив нам выбора
и в конце концов вы обнаружите, что все окончено, успешно :)
на рабочем столе появиться крест что должно по сути дела нас обрадовать.
Далее необходимо проинсталлить компиляторы С. Посетите раздел:
Описания
MPLAB® XC8 User Guide
MPLAB® XC16 User Guide
MPLAB® XC32 User Guide
Загрузка компиляторов Си (последние версии)
XC8 | XC16 | XC32 |
Windows | Windows | Windows |
Linux | Linux | Linux |
OS X | OS X | OS X |
Read Me | Read Me | Read Me |
Установка компиляторов проблемы не составит, надо только со всем соглашаться, поэтому особого интереса не вызывает. Интерес может вызвать, только как протестировать режим PRO некоторое неограниченное время :), но об этом более подробно на форуме.
Запустим наш MPLAB X, на экране вы должны увидеть, что то типа этого:
Если “типа этого” появилось, значит полдела сделано, осталось по быстрому, научиться “типа программировать”, а все остальное дело техники.
Обучаться будем сразу на Си, почему? А потому, как оказалось (на себе испытал) Си намного проще для начинающего, хотя по себе скажу кто переходит на Си с ассемблера, может сразу считать себя асом. Но только не надо стараться, если не можешь выразить языком Си, вставлять куски ассемблера, это для начинающего ничего хорошего не принесет. Очень мешать будет на первом этапе умение думать на ассемблере, самое трудное научиться думать на Си.
Поэтому, что бы ничего не мешало, (как плохому танцору), начнем с Си.
Это может быть интересно
USB K-L-line адаптер
USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели разработанной печатной …Индикатор температуры
Проект для начинающих, на демо плате BB-2T3D-01. Простой индикатор температуры. Проект никак не задумывался, просто на витрину магазин Ворон нужна была демонстрационная модель на макетной плате, чего нибудь работающего. Остановились на индикаторе температуре. Нужен был какой нибудь выводной …Проект с использованием MCC часть 06
Изменим схему следующим образом добавим две тактовые кнопки BT1 и BT2. Теперь переключимся на конфигурацию выводов, для этого сделаем двойной клик в окне Ресурсы проекта на Pin Module. В окне Pin …Простой оптический сенсор приближения
Оптический сенсор, назначение оптический концевик, для автоматики, бесконтактный выключатель с функцией автоматического отключения...Самый простой индикатор уровня звукового сигнала
Демонстрационный проект создания индикаторов уровня с использованием WS2812B. Изучив этот проект вы сможете самостоятельно изготавливать и конструировать свои индикаторы уровня звукового сигнала. Дополнительно читайте статью Бегущие огни на WS2812B по подключению …VU Meter Tower ART
Стерео индикатор уровня аудио сигнала. Компактность и удобство проектирования устройств на светодиодах WS2812B, а также легкость реализации алгоритма родило идею созданию своей конструкции. В этом проекте я предоставлю все материалы …PIC32MZ – прерывания (заметки)
Виды формирования запоминая контекста при входе в прерывания. Компилятор представляет три варианта AUTO – когда запоминания места возврата из подпрограммы возложено на программу, т.е все создается программно. Этот метод является …Audio-bluetooth modules F-6188 (BK8000L)
Следующий модуль на чипе BK8000L. Заводское обозначение F-6188 также основным производителем не выпускается и отдан на тиражирование. с нижней стороны имеет маркировку В этом варианте мне попалась вроде полноценная прошивка. …Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)
Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную систему отопления. …MPLAB® Harmony – или как это просто! Часть 2.
Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из трудоемкого варианта …
MPLAB ® X
MPLAB ® X интегрированная среда разработки (IDE)
MPLAB®X представляет собой программное обеспечение, которое работает на ПК (под управлением Windows ® , Mac OS ® , Linux ® ) и предназначено для разработки приложений для микро и цифровых сигнальных контроллеров корпорации Microchip. MPLAB®X называется интегрированной средой разработки (IDE), поскольку она обеспечивает единую интегрированную “окружающую среду” для разработки кода для встроенных систем.
MPLAB® X интегрированная среда разработки, вносит много изменений в цепочку средств разработки микроконтроллеров PIC®. В отличие от предыдущих версий MPLAB®, которая была абсолютно закрытым проектом, MPLAB® X основан на IDE NetBeans с открытым исходным кодом от Oracle. Этот путь развития позволил очень быстро и легко добавить новые требуемые функций и в то же время предоставил расширяемую архитектуру. Что дало возможность включать еще больше новых функций в будущем.
MPLAB ® X Ссылки
MPLAB® X Integrated Development Environment (IDE)
Первый проект для самых маленьких
Современные микроконтроллеры, это довольно сложные по функциональности устройства. Но есть образцы которые представляют устройство с минимальной конфигурацией, но обладают всеми первоначальными устройствами для понимания работы PIC-контроллеров.
PIC10F222 / PIC10F320/322
Самая простая архитектура, которая позволит, понять принцип работы микроконтроллера под управление программы.
Контроллер имеет 4 порта ввода вывода, 3 двунаправленных, т. е. могут как выводить информацию из контроллера, так и получать информацию из вне. Один порт, который может только работать на ввод данных.
Восьми битный АЦП работы с аналоговыми сигналами. Он позволяет сигналы в диапазоне 0-5 вольт преобразовывать в числовое значение в диапазоне от 0 до 255.
Восьми битный таймер для подсчета импульсов. Таймер может работать как от внутреннего генератора, так и с импульсами с “внешнего мира”. Таймер имеет предварительный делитель, который позволяет расширить диапазон подсчитываемых импульсов.
Двухуровневый стек – позволяющий вызывать в программе функции в два уровня вложения.
Сторожевой таймер – для контроля работы программы.
Для обучения необходимо собрать схему с применением PIC-контроллера. Для это можно использовать любую демо-плату.
К сожалению для обучения необходимо наличие программатора. Рекомендую использовать PICKIT-2, PICKIT-3.
Схема примера для обучения.
Резистор R1 для тестирования работы АЦП контроллера. Кнопки PB1 и PB2 предназначены для проведения опытов по вводу цифровых данных. Светодиоды LD1 и LD2 для индикации выполнения запрограммированных функций.
И так первое собираем схему на демо-плате.
Второе создаем проект.
Загружаем MPLAB®X.
Создаем новый проект
Выбираем тип проекта
Выбираем контроллер
Нажать продолжить
Выбираем компилятор для проекта.
Придумаем имя проекта, а также создадим каталог для проекта, выберем кодировку windows-1251.
Создаем рабочий файл – с именем main.
и вот оно начало
Прошло время и вышел на первое место PIC10F320/322 это уже полноценный микроконтроллер изучая который можно получить практически полное понятие о работе и функциях микроконтроллера.
Все примеры написаны на Microchip MPLAB XC8 C Compiler (Free Mode) V1.30
Функциональная схема микроконтроллера
Еще раз с чего начинаем, как подключить микроконтроллер к питающему напряжению и как подключить к программатору:
Для начала работы необходимо иметь не только микроконтроллер паяльник, а и тестер для возможности измерения напряжения и тока.
Первое на что начинающему электронщику надо обратить внимание, для питания необходимо взять пятивольтовый стабилизатор для нашего примера подойдет 78L05. Добавьте последовательно диод для защиты от неправильного подключения питания, это спасет от первых ошибок. Основная проблема по работе с таким микроконтроллером это его габариты, второе, что для тренировки необходимо выполнить условие внутрисхемного программирования. Для подключения внешних устройств к микроконтроллеру, необходимо учитывать, что должны быть подключены через резисторы с сопротивлением не ниже 680 ом. При первом включении проверьте напряжение на выходе стабилизатора должно быть 5 вольт и замерьте ток потребления, он не должен превышать нескольких миллиампер.
Для начала необходимо собрать выше приведенную схему, собирать можно на любой макетной плате, или можно использовать любые платы с этого сайта где используется микроконтроллер PIC10.
В PIC10F320 4 порта через которые он моде общаться с внешним миром, 3 двунаправленные, т.е. по ним может как поступать в контролер информация, так и выводиться из микроконтроллера обработанные данные, и один однонаправленный только на вход, это связана с техническими ограничениями.
С чего начинается программирование микроконтроллера. Первое это мы должны понять сможет ли наш выбранный контроллер решить поставленную задачу. Но в нашем варианте мы обучаемся и первая задача это ввод и вывод дискретных данных. Ввод будет при помощи тактовых кнопок вывод для индикации на светодиод.
Этап первый конфигурирование:
В каждом микроконтроллере есть регистры настройку которых необходимо выполнить в процессе программирования. Эти регистры отвечают за основные характеристики работы микроконтроллера, для этого в начале текста программы мы должны описать и настроить их работу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <xc.h> // для настройки под выбранный контроллер //------------------------------------------------------------------------------ // конфигурирование контроллера PIC10F320/322 //------------------------------------------------------------------------------ #pragma config FOSC = INTOSC // настраиваем работу от внутреннего генератора #pragma config BOREN = ON // Режим работы при пониженном напряжении #pragma config WDTE = ON // Сторожевой таймер включен #pragma config PWRTE = ON // Таймер задержки по включения питания включен #pragma config MCLRE = ON // Вывод сброса микроконтроллера выполняет функцию для внешнего сброса #pragma config CP = ON // Защита памяти программы включена #pragma config LVP = OFF // Режим низковольтного программирования отключен #pragma config LPBOR = ON // Сброс по понижению питания включен #pragma config BORV = HI // Уровень активации сброса - 2.7V #pragma config WRT = ALL // Защита памяти от записи - установлена на всю память |
Кратко можно понять из комментарием по работе каждого бита конфигурации. В будущем мы их будет менять, для изменения функций микроконтроллеры.
Следующий этап это настроить работу основной модуль это тактовый генератор:
В таком маленьком контроллера, такой функционально навороченный генератор. По функциональной схеме видно, что можно использовать для тактирования микропроцессора как внутренний генератор, так и внешний источник тактовых импульсов, эта функция переключается в регистре конфигурации бит FOSC. Если мы выбираем внутренний генератор, то можно выбрать широкий диапазон частот. Нам необходимо учитывать только одно, если нет необходимости в быстроте обработки данных, то выбираем максимально низкую частоту для экономии потребления. Хочу оговориться в микроконтроллере есть константа калибровки частоты внутреннего генератора и необходима его загрузка, но эту функцию выполнить компилятор Си автоматически. Для нашего проекта выполним настройку (она также будет изменяться в зависимости от необходимости):
1 2 3 4 5 6 7 |
OSCCON = 0b01110000; //регистр настройки генератора микроконтроллера /* ||||||+------ HFIOFS:флаг стабильности частоты внутреннего высокочастотного генератора 16 MHz * |||||+------- LFIOFR:флаг готовности работы низкочастотного генератора 31 kHz * ||||+-------- не используется, чтение дает 0 * |||+--------- HFIOFR:флаг готовности работы высокочастотного генератора 16 MHz * +++---------- IRCF<2:0>: выбор частоты генератора */ |
Так как мы в регистре конфигурации активировали сторожевой таймер, в функцию которого входит контроль непрерывной работы программы микроконтроллера. Если таймер отсчитает до нуля, то выполняется полный сброс микроконтроллера и запуск его программы с начала. Нам необходимо не только выполнить настройку, но и вставить в главный цикл команду сброса сторожевого таймера.
Таймер тактируется от собственного генератора и имеет предделитель для настройки периода срабатывания. Мы настроим на максимальное время 256 секунд. После коррекции программа примет вид
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 |
/* * File: main.c * Author: Gena Chernov * Catcatcat electronic * обучающий проект * Created on 1 Март 2014 г., 8:59 */ #include <xc.h> // для настройки под выбранный контроллер //------------------------------------------------------------------------------ // конфигурирование контроллера PIC10F320/322 //------------------------------------------------------------------------------ #pragma config FOSC = INTOSC // настраиваем работу от внутреннего генератора #pragma config BOREN = ON // Режим работы при пониженном напряжении #pragma config WDTE = ON // Сторожевой таймер включен #pragma config PWRTE = ON // Таймер задержки по включения питания включен #pragma config MCLRE = ON // Вывод сброса микроконтроллера выполняет функцию для внешнего сброса #pragma config CP = ON // Защита памяти программы включена #pragma config LVP = OFF // Режим низковольтного программирования отключен #pragma config LPBOR = ON // Сброс по понижению питания включен #pragma config BORV = HI // Уровень активации сброса - 2.7V #pragma config WRT = ALL // Защита памяти от записи - установлена на всю память void main(void) { OSCCON = 0b01110000; //регистр настройки генератора микроконтроллера /* ||||||+------ HFIOFS:флаг стабильности частоты внутреннего высокочастотного генератора 16 MHz * |||||+------- LFIOFR:флаг готовности работы низкочастотного генератора 31 kHz * ||||+-------- не используется, чтение дает 0 * |||+--------- HFIOFR:флаг готовности работы высокочастотного генератора 16 MHz * +++---------- IRCF<2:0>: выбор частоты генератора */ WDTCON = 0b00100101; /* |||||||+------ SWDTEN: таймер включен * ||+++++------- WDTPS<4:0>: период - 10010 = 1:8388608 (223) (Interval 256s nominal) * ++------------ не используется. */ // главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- } } |
Дальнейшее необходимо выполнить настройку портов ввода вывода. Для начала необходимо обратиться к схеме и настроим на вход порт RA0 и все остальные на выход. Кроме того подключим к порту RA0 внутренний подтягивающий резистор для создания потенциала для получения сигнала от тактовой кнопки.
1 2 3 4 5 6 |
// PORTA = 0b00000000; TRISA = 0b00000001; // настройка ввода вывода портов LATA = 0b00000000; // инициализация выходов ANSELA = 0b00000000; // все порты цифровые WPUA = 0b00000001; // активировать подтягивающий резистор на RA0 OPTION_REG = 0b00000000; // регистры подтягивающие включены |
Для удобства и краткости программы опишем наши порты, например порт индикации назовем LED, а порт тактовой кнопки TK0.
1 2 |
#define LED LATAbits.LATA1 // порт управления светодиодом #define TK0 PORTAbits.RA0 // вход подключенный к тактовой кнопке |
На этом основная настройка выполнена, теперь надо протестировать работу. Напишем функцию которая позволит при замыкании кнопки включать светодиод.
1 2 |
if(!TK0)LED=1; // если уровень = 0 включить светодиод else LED=0; // иначе выключить светодиод |
Текст программы для загрузки

Первый проект для самых маленьких - программа 01 1.29 KB 548 downloads
Первый проект для самых маленьких - программа...Это простая программа не учитывающая много особенностей работы механических кнопок. Для этого выполним режим когда нам необходимо выполнить функцию переключения. Т.е. нажатие кнопки включает светодиод, повторное выключает.
Логика работы следующая:
- Проверяем нажатие кнопки, т.е. проверяем уровень.
- Если уровень не соответствует нажатой кнопки пропускаем функцию и сбрасываем флаг кнопка нажата.
- Если уровень соответствует нажатой кнопке – выполним ожидание 10 мСек. которое необходимо для успокоения переходных помех при нажатии тактовый кнопки.
- Опять проверяем уровень на таковой кнопки
- Если уровень высокий пропускаем функцию, считаем, что это просто помеха была
- Если уровень низкий проверяем состояние флага кнопка нажата
- Если бит высокий, то мы считаем, что кнопка уже нажата и выполняется удержание, функция пропускается
- Если бит низкий то это значит, что кнопка еще не нажималась и необходимо активировать переключение светодиода
- Выполняем переключение и установку бита кнопка нажата, для блокировки повторения выполнения переключения если при следующем цикле клавиша будет удерживаться.
Текст программы главного цикла
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- if(!TK0) // проверяем нажатие кнопки { __delay_ms(10); // ожидаем окончание механического дребезга if(!TK0) // повторно проверяем нажатие { if(!NAG) // проверяем состояние флага кнопка нажата { NAG=1; // установить флаг кнопка нажата LED=!LED; // переключение светодиода } } } else { NAG=0; // сбросить флаг кнопка нажата } } |
Но для реализации этого фрагмента необходимо описать следующие параметры:
#define _XTAL_FREQ 16000000 // тактовая частота – указать компилятору рабочую тактовую частоту
bit NAG; // флаг кнопки нажатия – описать флаг
Скачать программу

Первый проект для самых маленьких - программа 02 1.46 KB 360 downloads
Первый проект для самых маленьких - программа...Теперь заставим светодиод мигать, для этого будем использовать макросы задержки _delay(х), __delay_ms(х), __delay_us(х).
1 2 3 4 5 6 7 |
// главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- LED=!LED; // переключение светодиод __delay_ms(500); // ожидаем } |
Код главного цикла очень прост, переключаем светодиод и выполняем ожидание макросом в полсекунды. Но такой пример для нормальной программы неприемлем, так как все основное машинное время тратиться на непродуктивное ожидание. Необходимо, чтобы формированием занимались таймера а процессор занимался бы основной обработкой данной. Для этого изучим включение таймера и обработку прерывание. А также формирование временных интервалов при помощи таймера.
Настройка таймера
1 2 3 4 5 6 7 8 9 |
// настройка таймера Т0 для формирования временных интервалов OPTION_REG = 0b00000111; /* |||||+++----- PS<2:0>: настройка предделителя * ||||+-------- PSA: предделитель подключен к таймеру * |||+--------- T0SE: выбор фронта синхронизации от внешнего источника * ||+---------- T0CS: тактирование от внутреннего генератора * |+----------- INTEDG: выбор фронта формирования от внешнего прерывания * +------------ WPUEN: регистры подтягивающие включены */ |
При такой настройке мы получим прерывание с частотой 61,035 Гц (61=4000000/256/256).
Настройка прерываний
1 2 3 4 5 6 7 8 9 10 11 |
// настройка прерываний INTCON = 0b10100000; /* |||||||+----- IOCIF: флаг прерывания по изменению состоянию по входам * ||||||+------ INTF: INT Флаг прерывания от внешнего источника * |||||+------- TMR0IF: Timer0 флаг прерывания от таймера * ||||+-------- IOCIE: прерывания по изменения состояния входов отключены * |||+--------- INTE: INT внешние прерывания отключены * ||+---------- TMR0IE: Timer0 разрешить прерывания * |+----------- PEIE: прерывания от периферии отключены * +------------ GIE: разрешить глобальные прерывания */ |
Разрешим прерывание от таймера и разрешим глобальные прерывания.
Сам текст функции прерывания
1 2 3 4 5 6 7 8 9 10 11 12 |
void interrupt my_isr(void) // { if(TMR0IF) { TMR0IF=0;//сбросить прерывания if(--timer_sek==0) { timer_sek=30; LED=!LED; // переключение светодиод } } } |
В этой функции переменой timer_sek выполняется функция дополнительного делителя. При значении 30 время выполнения составляет приблизительно 0,5 секунды.
Теперь усложним задачу и добавим функция мигания светодиода с управлением длительностью таймером и функция выключения включения одной кнопкой.
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
/* * File: main.c * Author: Gena Chernov * Catcatcat electronic * обучающий проект * Created on 1 Март 2014 г., 8:59 * v 0.01 - включения светодиода от нажатия кнопки * v 0.02 - функция переключения светодиода одной кнопкой * v 0.03 - функция мигания светодиода с управлением длительностью таймером и функция выключения включения одной кнопкой */ #include <xc.h> // для настройки под выбранный контроллер //------------------------------------------------------------------------------ // конфигурирование контроллера PIC10F320/322 //------------------------------------------------------------------------------ #pragma config FOSC = INTOSC // настраиваем работу от внутреннего генератора #pragma config BOREN = ON // Режим работы при пониженном напряжении #pragma config WDTE = ON // Сторожевой таймер включен #pragma config PWRTE = ON // Таймер задержки по включения питания включен #pragma config MCLRE = ON // Вывод сброса микроконтроллера выполняет функцию для внешнего сброса #pragma config CP = ON // Защита памяти программы включена #pragma config LVP = OFF // Режим низковольтного программирования отключен #pragma config LPBOR = ON // Сброс по понижению питания включен #pragma config BORV = HI // Уровень активации сброса - 2.7V #pragma config WRT = ALL // Защита памяти от записи - установлена на всю память #define LED LATAbits.LATA1 // порт управления светодиодом #define TK0 PORTAbits.RA0 // вход подключенный к тактовой кнопке #define _XTAL_FREQ 16000000 // тактовая частота bit NAG, FLAGLED; // флаг кнопки нажатия char timer_sek; // таймер предделитель #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) void main(void) { OSCCON = 0b01110000; //регистр настройки генератора микроконтроллера /* ||||||+------ HFIOFS:флаг стабильности частоты внутреннего высокочастотного генератора 16 MHz * |||||+------- LFIOFR:флаг готовности работы низкочастотного генератора 31 kHz * ||||+-------- не используется, чтение дает 0 * |||+--------- HFIOFR:флаг готовности работы высокочастотного генератора 16 MHz * +++---------- IRCF<2:0>: выбор частоты генератора */ WDTCON = 0b00100101; /* |||||||+------ SWDTEN: таймер включен * ||+++++------- WDTPS<4:0>: период - 10010 = 1:8388608 (223) (Interval 256s nominal) * ++------------ не используется. */ CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- // настройка портов микроконтроллера // PORTA = 0b00000000; TRISA = 0b00000001; // настройка ввода вывода портов LATA = 0b00000000; // инициализация выходов ANSELA = 0b00000000; // все порты цифровые WPUA = 0b00000001; // активировать подтягивающий резистор на RA0 // настройка таймера Т0 для формирования временных интервалов OPTION_REG = 0b00000111; /* |||||+++----- PS<2:0>: настройка предделителя * ||||+-------- PSA: предделитель подключен к таймеру * |||+--------- T0SE: выбор фронта синхронизации от внешнего источника * ||+---------- T0CS: тактирование от внутреннего генератора * |+----------- INTEDG: выбор фронта формирования от внешнего прерывания * +------------ WPUEN: регистры подтягивающие включены */ // настройка прерываний INTCON = 0b10100000; /* |||||||+----- IOCIF: флаг прерывания по изменению состоянию по входам * ||||||+------ INTF: INT Флаг прерывания от внешнего источника * |||||+------- TMR0IF: Timer0 флаг прерывания от таймера * ||||+-------- IOCIE: прерывания по изменения состояния входов отключены * |||+--------- INTE: INT внешние прерывания отключены * ||+---------- TMR0IE: Timer0 разрешить прерывания * |+----------- PEIE: прерывания от периферии отключены * +------------ GIE: разрешить глобальные прерывания */ timer_sek=30; // главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- if(!TK0) // проверяем нажатие кнопки { __delay_ms(10); // ожидаем окончание механического дребезга NOP(); if(!TK0) // повторно проверяем нажатие { if(!NAG) // проверяем состояние флага кнопка нажата { NAG=1; // установить флаг кнопка нажата FLAGLED=!FLAGLED; // переключение светодиода } } } else { NAG=0; // сбросить флаг кнопка нажата } NOP(); } } void interrupt my_isr(void) // { if(TMR0IF) { TMR0IF=0;//сбросить прерывания if(--timer_sek==0) { timer_sek=30; if(FLAGLED)LED=!LED; // переключение светодиод else LED=0; } } } |
Файл для загрузки

Первый проект для самых маленьких - программа 03 1.98 KB 317 downloads
Первый проект для самых маленьких - программа...Измерение температуры при помощи модуля индикатора температуры
Для этого необходимо включить два модуля в работу
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// настройка АЦП ADCON = 0b10011001; /* |||||||+----- ADON: * ||||||+------ GO/DONE: * |||+++------- CHS<2:0>:110 = Temperature Indicator(1) * +++---------- ADCS<2:0>:100 = FOSC/4 */ // настройка индикатора температуры FVRCON = 0b00110000; /* ||||||++----- ADFVR<1:0>:00 = ADC Fixed Voltage Reference Peripheral output is off. * ||||++------- Unimplemented: Read as ‘0 ‘ * |||+--------- TSRNG:1 = VOUT = VDD - 4VT (High Range) * ||+---------- TSEN:1 = Temperature Indicator is enabled * |+----------- FVRRDY:0 = Fixed Voltage Reference output is not ready or not enabled * +------------ FVREN:0 = Fixed Voltage Reference is disabled */ |
Для контроля в главный цикл вставим измерение и индикацию. Значение настроено приблизительно температуру тела человека, при нагреве от тепла руки будет переключение индикации. Если температура ниже будет гореть светодиод, при нагреве отключаться. Эта функция носит название на нагрев. Для охлаждения необходимо знак в “<” на “>“.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- GO_nDONE=1; while(GO_nDONE); if(ADRES<99)//режим для обогрева { LED=1; } else { LED=0; } } |
Файл примера для загрузки

Первый проект для самых маленьких - программа 04 1.92 KB 305 downloads
Первый проект для самых маленьких - программа...Пример простая “мигалка”. Используется для управления три кнопки, в две предназначенные задания частоты мигания, третья для включения выключения мигания.
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
/* * File: main.c * Author: Gena Chernov * Catcatcat electronic * обучающий проект * Created on 1 Март 2014 г., 8:59 * v 0.01 - включения светодиода от нажатия кнопки * v 0.02 - функция переключения светодиода одной кнопкой * v 0.03 - функция мигания светодиода с управлением длительностью таймером и функция выключения включения одной кнопкой * v 0.04 - контроль температуры при помощи микроконтроллера. * v 0.05 - измерение температуры, контроль * v 0.06 - мигалка с изменяемой частотой */ #include <xc.h> // для настройки под выбранный контроллер //------------------------------------------------------------------------------ // конфигурирование контроллера PIC10F320/322 //------------------------------------------------------------------------------ #pragma config FOSC = INTOSC // настраиваем работу от внутреннего генератора #pragma config BOREN = ON // Режим работы при пониженном напряжении #pragma config WDTE = ON // Сторожевой таймер включен #pragma config PWRTE = ON // Таймер задержки по включения питания включен #pragma config MCLRE = OFF // Вывод сброса микроконтроллера выполняет функцию для внешнего сброса #pragma config CP = ON // Защита памяти программы включена #pragma config LVP = OFF // Режим низковольтного программирования отключен #pragma config LPBOR = ON // Сброс по понижению питания включен #pragma config BORV = HI // Уровень активации сброса - 2.7V #pragma config WRT = ALL // Защита памяти от записи - установлена на всю память #define LED LATAbits.LATA1 // порт управления светодиодом #define TK0 PORTAbits.RA0 // вход подключенный к тактовой кнопке #define TK1 PORTAbits.RA2 // вход подключенный к тактовой кнопке #define TK2 PORTAbits.RA3 // вход подключенный к тактовой кнопке #define _XTAL_FREQ 16000000 // тактовая частота bit NAG, FLAGLED; // флаг кнопки нажатия char timer_sek, chstota; // таймер предделитель #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) void main(void) { OSCCON = 0b01110000; //регистр настройки генератора микроконтроллера /* ||||||+------ HFIOFS:флаг стабильности частоты внутреннего высокочастотного генератора 16 MHz * |||||+------- LFIOFR:флаг готовности работы низкочастотного генератора 31 kHz * ||||+-------- не используется, чтение дает 0 * |||+--------- HFIOFR:флаг готовности работы высокочастотного генератора 16 MHz * +++---------- IRCF<2:0>: выбор частоты генератора */ WDTCON = 0b00100101; /* |||||||+------ SWDTEN: таймер включен * ||+++++------- WDTPS<4:0>: период - 10010 = 1:8388608 (223) (Interval 256s nominal) * ++------------ не используется. */ CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- // настройка портов микроконтроллера // PORTA = 0b00000000; TRISA = 0b00001101; // настройка ввода вывода портов LATA = 0b00000000; // инициализация выходов ANSELA = 0b00000000; // все порты цифровые WPUA = 0b00001101; // активировать подтягивающий резистор на RA0 // настройка таймера Т0 для формирования временных интервалов OPTION_REG = 0b00000111; /* |||||+++----- PS<2:0>: настройка предделителя * ||||+-------- PSA: предделитель подключен к таймеру * |||+--------- T0SE: выбор фронта синхронизации от внешнего источника * ||+---------- T0CS: тактирование от внутреннего генератора * |+----------- INTEDG: выбор фронта формирования от внешнего прерывания * +------------ WPUEN: регистры подтягивающие включены */ // настройка прерываний INTCON = 0b10100000; /* |||||||+----- IOCIF: флаг прерывания по изменению состоянию по входам * ||||||+------ INTF: INT Флаг прерывания от внешнего источника * |||||+------- TMR0IF: Timer0 флаг прерывания от таймера * ||||+-------- IOCIE: прерывания по изменения состояния входов отключены * |||+--------- INTE: INT внешние прерывания отключены * ||+---------- TMR0IE: Timer0 разрешить прерывания * |+----------- PEIE: прерывания от периферии отключены * +------------ GIE: разрешить глобальные прерывания */ chstota=30; timer_sek=30; // таймер дополнительный делитель // главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- if(!TK1) // проверяем нажатие кнопки { __delay_ms(10); // ожидаем окончание механического дребезга NOP(); if(!TK1) // повторно проверяем нажатие { if(!NAG) // проверяем состояние флага кнопка нажата { NAG=1; // установить флаг кнопка нажата FLAGLED=!FLAGLED; // переключение светодиода } } } else if(!TK0) // проверяем нажатие кнопки { __delay_ms(10); // ожидаем окончание механического дребезга NOP(); if(!TK0) // повторно проверяем нажатие { if(!NAG) // проверяем состояние флага кнопка нажата { NAG=1; // установить флаг кнопка нажата if(chstota<255)chstota++; // переключение светодиода } } } else if(!TK2) // проверяем нажатие кнопки { __delay_ms(10); // ожидаем окончание механического дребезга NOP(); if(!TK2) // повторно проверяем нажатие { if(!NAG) // проверяем состояние флага кнопка нажата { NAG=1; // установить флаг кнопка нажата if(chstota>1)chstota--; // переключение светодиода } } } else { NAG=0; // сбросить флаг кнопка нажата } // // NOP();chstota } } void interrupt my_isr(void) // { if(TMR0IF) { TMR0IF=0;//сбросить прерывания if(--timer_sek==0) // дополнительный делитель до 2 Гц { timer_sek=chstota; // 30 - 2 Гц if(FLAGLED)LED=!LED; // переключение светодиод else LED=0; } } } |
Файл для загрузки

Первый проект для самых маленьких - программа 05 2.15 KB 370 downloads
Первый проект для самых маленьких - программа...Для дальнейшего развития, читайте проекты:
Самый простой диммер для светодиодного освещения
Гаджеты для домашней автоматики – Емкостной сенсор
Гаджеты для домашней автоматики – Датчик приближения
Гаджеты для домашней автоматики – Датчик движения
Датчик приближения от Румена Желева
Это может быть интересно
ch-светомузыка от теории до реализации
Сразу оговоримся технология или теория ch-светомузыки, это постоянно развивающийся процесс и то что будет сказано сегодня завтра может быть опровергнуто и считаться ошибочным. Назовем само решение проблемы автоматического преобразования или …Цифровой тахометр для автомобиля CH-С3300
Тахометр Ch-С3300 предназначен для индикации и контроля оборотов, времени работы и максимальных оборотов развиваемых двигателем во время поездки. Датчиком может использоваться как обычный контактный прерыватель или выход датчика холла автомобиля …Проект с использованием MCC часть 08
И так создадим проект в котором при помощи двух кнопок мы сможем управлять яркостью светодиодов. При использовании МСС у нас лафа полная, добрые дяди с Microchipa подготовили функции, которыи позволяет …Проект с использованием MCC часть 11
Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость работы проекта, …Сенсорный выключатель света
Хотя в настоящий момент актуальны системы управления освещением с передачей данных по электросети, но я думаю, что проекты такого рода тоже имеют право на жизнь. Анонс Три вида сенсора – …Проект с использованием MCC часть 12-1
В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно почитать здесь …УКВ – радиоприем, часть 2
Пришло свободное время решил вторую часть проекта реализовать (правда есть мысль и третью с использование цветного OLED и функцией ch-светомузыки, но это только задумка… Для понимания функций интегрального приемника RDA5807FP читайте …Четырех канальный терморегулятор ch-4000
Четыре независимых канала регулирования температуры, одновременно можно подключить 16 датчиков температуры DS18B20 с удалением до трехсот метров. Можно для регулировки выбрать любой датчик, подключенный к устройству. Каждый канал может работать как в …TM1650 драйвер LED семисегментного индикатора
Китайский производитель Shenzhen Titan Micro Electronics Co., Ltd. Выпускает широкую линейку драйверов управления светодиодными дисплеями, которые позволяют разгрузить микроконтроллер для основной работы, главная особенность этих драйверов не только в их …Проект с использованием MCC часть 04
Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое главное , …